|
1 |
#include <cstdint>
|
1 |
2 |
#define BL_CALLBACK_TABLE_ADDR (0x08000000 + 0x01C0)
|
2 |
3 |
#define BL_MAGIC_NUMBER ((uint32_t)0xFF669900u)
|
3 |
4 |
|
... | ... | |
17 |
18 |
#include <chprintf.h>
|
18 |
19 |
#include <shell.h>
|
19 |
20 |
|
20 |
|
#include "linefollow.hpp"
|
21 |
|
|
|
21 |
#include "linefollow.hpp"
|
|
22 |
#include "amiro_map.hpp"
|
22 |
23 |
using namespace chibios_rt;
|
23 |
24 |
|
24 |
25 |
Global global;
|
... | ... | |
697 |
698 |
* Calibrate the thresholds for left and right sensor to get the maximum threshold and to
|
698 |
699 |
* be able to detect the correction direction.
|
699 |
700 |
* In this case it is expected that the FL-Sensor sould be in the white part of the edge and the FR-Sensor in the black one.
|
700 |
|
*
|
|
701 |
*
|
701 |
702 |
* Note: invert the threshs to drive on the other edge.
|
702 |
|
*
|
|
703 |
*
|
703 |
704 |
* */
|
704 |
705 |
void shellRequestCalibrateLineSensores(BaseSequentialStream *chp, int argc, char *argv[]) {
|
705 |
706 |
// int vcnl4020AmbientLight[4];
|
... | ... | |
710 |
711 |
int maxDelta = 0;
|
711 |
712 |
int sensorL = 0;
|
712 |
713 |
int sensorR = 0;
|
713 |
|
|
|
714 |
|
714 |
715 |
if (argc == 1){
|
715 |
716 |
chprintf(chp, "Test %i rounds \n", atoi(argv[0]));
|
716 |
717 |
rounds = atoi(argv[0]);
|
717 |
|
|
|
718 |
|
718 |
719 |
}else{
|
719 |
720 |
chprintf(chp, "Usage: calbrate_line_sensors [1,n]\nThis will calibrate the thresholds for the left and right sensor\naccording to the maximum delta value recorded.\n");
|
720 |
721 |
return;
|
... | ... | |
748 |
749 |
// delta *= -1;
|
749 |
750 |
// }
|
750 |
751 |
|
751 |
|
chprintf(chp,"FL: 0x%x, FR: 0x%x, Delta: %d, ProxyL: %x, ProxyR: %x, MaxDelta: %d\n",
|
|
752 |
chprintf(chp,"FL: 0x%x, FR: 0x%x, Delta: %d, ProxyL: %x, ProxyR: %x, MaxDelta: %d\n",
|
752 |
753 |
vcnl4020Proximity[constants::DiWheelDrive::PROX_FRONT_LEFT],
|
753 |
754 |
vcnl4020Proximity[constants::DiWheelDrive::PROX_FRONT_RIGHT],
|
754 |
755 |
delta,
|
... | ... | |
758 |
759 |
// sleep(CAN::UPDATE_PERIOD);
|
759 |
760 |
BaseThread::sleep(CAN::UPDATE_PERIOD);
|
760 |
761 |
}
|
761 |
|
|
|
762 |
|
762 |
763 |
|
763 |
764 |
global.linePID.threshProxyL = sensorL / rounds;
|
764 |
765 |
global.linePID.threshProxyR = sensorR / rounds;
|
... | ... | |
776 |
777 |
if (argc == 1){
|
777 |
778 |
chprintf(chp, "Test %i rounds \n", atoi(argv[0]));
|
778 |
779 |
rounds = atoi(argv[0]);
|
779 |
|
|
|
780 |
|
780 |
781 |
} else {
|
781 |
782 |
chprintf(chp, "Usage: dev_proxi_sensor_data <rounds> \n");
|
782 |
783 |
}
|
... | ... | |
787 |
788 |
// vcnl4020AmbientLight[i] = global.vcnl4020[i].getAmbientLight();
|
788 |
789 |
vcnl4020Proximity[i] = global.vcnl4020[i].getProximityScaledWoOffset();
|
789 |
790 |
}
|
790 |
|
|
|
791 |
|
791 |
792 |
int32_t delta = (vcnl4020Proximity[constants::DiWheelDrive::PROX_FRONT_LEFT]
|
792 |
793 |
- vcnl4020Proximity[constants::DiWheelDrive::PROX_FRONT_RIGHT]);
|
793 |
794 |
|
794 |
|
chprintf(chp,"WL:%d,FL:%d,FR:%d,WR:%d,Delta:%d\n",
|
|
795 |
chprintf(chp,"WL:%d,FL:%d,FR:%d,WR:%d,Delta:%d\n",
|
795 |
796 |
vcnl4020Proximity[constants::DiWheelDrive::PROX_WHEEL_LEFT],
|
796 |
797 |
vcnl4020Proximity[constants::DiWheelDrive::PROX_FRONT_LEFT],
|
797 |
798 |
vcnl4020Proximity[constants::DiWheelDrive::PROX_FRONT_RIGHT],
|
... | ... | |
817 |
818 |
int32_t proxbuf[window]= { 0 };
|
818 |
819 |
int32_t meanDeviation(uint16_t a, uint16_t b){
|
819 |
820 |
int32_t diff = a-b;
|
820 |
|
int32_t res = 0;
|
|
821 |
int32_t res = 0;
|
821 |
822 |
proxbuf[counter] = (diff*100)/((a+b)/2);
|
822 |
823 |
for (int i = 0; i< window; i++){
|
823 |
824 |
res += proxbuf[i];
|
... | ... | |
854 |
855 |
// int32_t deviation = meanDeviation((prox[3]+old3) / 2 , (prox[4]+old4) / 2);
|
855 |
856 |
// uint16_t notouch = 100;
|
856 |
857 |
// uint16_t toucht = 20031;
|
857 |
|
// sign =
|
|
858 |
// sign =
|
858 |
859 |
// i = 0;
|
859 |
860 |
chprintf(chp, "0:%i 1:%i 2:%i 3:%i 4:%i 5:%i 6:%i 7:%i Deviation:%i \n", prox[0], prox[1], prox[2], prox[3], prox[4], prox[5], prox[6], prox[7], deviation);
|
860 |
861 |
BaseThread::sleep(CAN::UPDATE_PERIOD);
|
... | ... | |
884 |
885 |
// }
|
885 |
886 |
// uint16_t notouch = 100;
|
886 |
887 |
// uint16_t toucht = 20031;
|
887 |
|
// sign =
|
|
888 |
// sign =
|
888 |
889 |
// i = 0;
|
889 |
890 |
|
890 |
891 |
if (j < 10){
|
... | ... | |
964 |
965 |
for (int i=0; i<24;i++){
|
965 |
966 |
global.stateTracker[i] = 0;
|
966 |
967 |
}
|
|
968 |
}
|
967 |
969 |
|
|
970 |
inline void setAttributes(uint8_t (&map)[MAX_NODES][NODE_ATTRIBUTES], uint8_t id,
|
|
971 |
uint8_t l, uint8_t r, uint8_t att) {
|
|
972 |
map[id][0] = l;
|
|
973 |
map[id][1] = r;
|
|
974 |
map[id][2] = att;
|
|
975 |
}
|
|
976 |
|
|
977 |
#define TEST_CASES 10
|
|
978 |
void shellRequestTestSuite(BaseSequentialStream *chp, int argc, char *argv[]){
|
|
979 |
uint8_t testmap[MAX_NODES][NODE_ATTRIBUTES] = {0};
|
|
980 |
bool testres[TEST_CASES];
|
|
981 |
setAttributes(testmap, 0, 1, 2, 1);
|
|
982 |
setAttributes(testmap, 1, 2, 2, 0);
|
|
983 |
setAttributes(testmap, 2, 1, 0, 0);
|
|
984 |
setAttributes(testmap, 3, 0, 0, 0xff);
|
|
985 |
AmiroMap map = AmiroMap(&global);
|
|
986 |
|
|
987 |
// --------------------------------------------------
|
|
988 |
|
|
989 |
int tcase = 0;
|
|
990 |
map.initialize(testmap);
|
|
991 |
testres[tcase] = map.get_valid();
|
|
992 |
|
|
993 |
tcase++; // 1
|
|
994 |
setAttributes(testmap, 0, 1, 2, 0xff);
|
|
995 |
map.initialize(testmap);
|
|
996 |
testres[tcase] = !map.get_valid();
|
|
997 |
|
|
998 |
tcase++; // 2
|
|
999 |
setAttributes(testmap, 0, 1, 2, 0);
|
|
1000 |
setAttributes(testmap, 2, 1, 0, 1);
|
|
1001 |
map.initialize(testmap);
|
|
1002 |
testres[tcase] = map.get_current() == 2;
|
|
1003 |
|
|
1004 |
// --------------------------------------------------
|
|
1005 |
|
|
1006 |
int failed = 0;
|
|
1007 |
int passed = 0;
|
|
1008 |
for (int i=0; i<=tcase; i++) {
|
|
1009 |
if (testres[i]){
|
|
1010 |
passed++;
|
|
1011 |
}else{
|
|
1012 |
failed++;
|
|
1013 |
chprintf(chp, "Test %d Failed\n", i);
|
|
1014 |
}
|
|
1015 |
}
|
|
1016 |
chprintf(chp, "Total: %d, Passed: %d, Failed: %d\n", tcase + 1, passed, failed);
|
|
1017 |
}
|
|
1018 |
|
|
1019 |
void shellRequestMapTest(BaseSequentialStream *chp, int argc, char *argv[]) {
|
|
1020 |
|
|
1021 |
// TODO:
|
|
1022 |
// For now see everything fixed. Create array with pointer to all node structs. Determine
|
|
1023 |
|
|
1024 |
// chprintf(chp, " +-------------------+\n");
|
|
1025 |
// chprintf(chp, " | |\n");
|
|
1026 |
// chprintf(chp, " | |\n");
|
|
1027 |
// chprintf(chp, "+-v--+ |\n");
|
|
1028 |
// chprintf(chp, "| 0 | +-++\n");
|
|
1029 |
// chprintf(chp, "+-+--+ +--------+2 | <-------+\n");
|
|
1030 |
// chprintf(chp, " | | +--+ |\n");
|
|
1031 |
// chprintf(chp, " | | ^ |\n");
|
|
1032 |
// chprintf(chp, " | | | |\n");
|
|
1033 |
// chprintf(chp, " | v | |\n");
|
|
1034 |
// chprintf(chp, " | +-+-+------+ |\n");
|
|
1035 |
// chprintf(chp, " +------> 1 | |\n");
|
|
1036 |
// chprintf(chp, " +---+-------------------+\n");
|
|
1037 |
|
|
1038 |
uint8_t testmap[MAX_NODES][NODE_ATTRIBUTES] = {0};
|
|
1039 |
setAttributes(testmap, 0, 1, 2, 1);
|
|
1040 |
setAttributes(testmap, 1, 2, 2, 0);
|
|
1041 |
setAttributes(testmap, 2, 1, 0, 0);
|
|
1042 |
setAttributes(testmap, 3, 0, 0, 0xff);
|
|
1043 |
AmiroMap map = AmiroMap(&global);
|
|
1044 |
map.initialize(testmap);
|
968 |
1045 |
}
|
969 |
1046 |
|
970 |
1047 |
static const ShellCommand commands[] = {
|
971 |
|
{"shutdown", shellRequestShutdown},
|
972 |
|
{"wakeup", shellRequestWakeup},
|
973 |
|
{"check", shellRequestCheck},
|
974 |
|
{"reset_memory", shellRequestResetMemory},
|
975 |
|
{"get_board_id", shellRequestGetBoardId},
|
976 |
|
{"set_board_id", shellRequestSetBoardId},
|
977 |
|
{"get_memory_data", shellRequestGetMemoryData},
|
978 |
|
{"get_vcnl", shellRequestGetVcnl},
|
979 |
|
{"calib_vcnl_offset", shellRequestCalib},
|
980 |
|
{"set_vcnl_offset", shellRequestSetVcnlOffset},
|
981 |
|
{"reset_vcnl_offset", shellRequestResetVcnlOffset},
|
982 |
|
{"get_vcnl_offset", shellRequestGetVcnlOffset},
|
983 |
|
{"reset_Ed_Eb", shellRequestResetCalibrationConstants},
|
984 |
|
{"get_Ed_Eb", shellRequestGetCalibrationConstants},
|
985 |
|
{"set_Ed_Eb", shellRequestSetCalibrationConstants},
|
986 |
|
{"get_robot_id", shellRequestGetRobotId},
|
987 |
|
{"get_system_load", shellRequestGetSystemLoad},
|
988 |
|
{"set_lights", shellRequestSetLights},
|
989 |
|
{"shell_board", shellSwitchBoardCmd},
|
990 |
|
{"get_bootloader_info", shellRequestGetBootloaderInfo},
|
991 |
|
{"motor_drive", shellRequestMotorDrive},
|
992 |
|
{"motor_stop", shellRequestMotorStop},
|
993 |
|
{"motor_calibrate", shellRequestMotorCalibrate},
|
994 |
|
{"motor_getGains", shellRequestMotorGetGains},
|
995 |
|
{"motor_resetGains", shellRequestMotorResetGains},
|
996 |
|
{"calibrate_line_sensors", shellRequestCalibrateLineSensores},
|
997 |
|
{"printProxyBottom", sellRequestgetBottomSensorData},
|
998 |
|
{"printProxyRing", shellRequestProxyRingValues},
|
999 |
|
{"printMagnetometer", shellRequestMagnetoMeter},
|
1000 |
|
{"printMagnetometerRes", shellRequestMagnetoMeterPrint},
|
1001 |
|
{"printLocation", shellRequestPrintCoordinate},
|
1002 |
|
{"checkPowerPins", shellRequestCheckPower},
|
1003 |
|
{"infos", shellRequestErrorInfo},
|
1004 |
|
{NULL, NULL}
|
1005 |
|
};
|
|
1048 |
{"shutdown", shellRequestShutdown},
|
|
1049 |
{"wakeup", shellRequestWakeup},
|
|
1050 |
{"check", shellRequestCheck},
|
|
1051 |
{"reset_memory", shellRequestResetMemory},
|
|
1052 |
{"get_board_id", shellRequestGetBoardId},
|
|
1053 |
{"set_board_id", shellRequestSetBoardId},
|
|
1054 |
{"get_memory_data", shellRequestGetMemoryData},
|
|
1055 |
{"get_vcnl", shellRequestGetVcnl},
|
|
1056 |
{"calib_vcnl_offset", shellRequestCalib},
|
|
1057 |
{"set_vcnl_offset", shellRequestSetVcnlOffset},
|
|
1058 |
{"reset_vcnl_offset", shellRequestResetVcnlOffset},
|
|
1059 |
{"get_vcnl_offset", shellRequestGetVcnlOffset},
|
|
1060 |
{"reset_Ed_Eb", shellRequestResetCalibrationConstants},
|
|
1061 |
{"get_Ed_Eb", shellRequestGetCalibrationConstants},
|
|
1062 |
{"set_Ed_Eb", shellRequestSetCalibrationConstants},
|
|
1063 |
{"get_robot_id", shellRequestGetRobotId},
|
|
1064 |
{"get_system_load", shellRequestGetSystemLoad},
|
|
1065 |
{"set_lights", shellRequestSetLights},
|
|
1066 |
{"shell_board", shellSwitchBoardCmd},
|
|
1067 |
{"get_bootloader_info", shellRequestGetBootloaderInfo},
|
|
1068 |
{"motor_drive", shellRequestMotorDrive},
|
|
1069 |
{"motor_stop", shellRequestMotorStop},
|
|
1070 |
{"motor_calibrate", shellRequestMotorCalibrate},
|
|
1071 |
{"motor_getGains", shellRequestMotorGetGains},
|
|
1072 |
{"motor_resetGains", shellRequestMotorResetGains},
|
|
1073 |
{"calibrate_line_sensors", shellRequestCalibrateLineSensores},
|
|
1074 |
{"printProxyBottom", sellRequestgetBottomSensorData},
|
|
1075 |
{"printProxyRing", shellRequestProxyRingValues},
|
|
1076 |
{"printMagnetometer", shellRequestMagnetoMeter},
|
|
1077 |
{"printMagnetometerRes", shellRequestMagnetoMeterPrint},
|
|
1078 |
{"printLocation", shellRequestPrintCoordinate},
|
|
1079 |
{"checkPowerPins", shellRequestCheckPower},
|
|
1080 |
{"stateInfos", shellRequestErrorInfo},
|
|
1081 |
{"testMap", shellRequestMapTest},
|
|
1082 |
{"test", shellRequestTestSuite },
|
|
1083 |
{NULL, NULL}};
|
1006 |
1084 |
|
1007 |
1085 |
static const ShellConfig shell_cfg1 = {
|
1008 |
1086 |
(BaseSequentialStream *) &global.sercanmux1,
|