PushToGo on STM32F429-Disco Board

Dependencies:   BSP_DISCO_F429ZI LCD_DISCO_F429ZI pushtogo usb

Committer:
caoyu@caoyuan9642-desktop.MIT.EDU
Date:
Sun Sep 23 02:31:28 2018 -0400
Revision:
8:f0455a1d4709
Parent:
7:bfd32470c0bc
merge

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caoyuan9642 1:64c1fd738059 1 /**
caoyuan9642 1:64c1fd738059 2 * Harware setup is implemented in this file
caoyuan9642 1:64c1fd738059 3 */
caoyuan9642 1:64c1fd738059 4
caoyuan9642 1:64c1fd738059 5 #include "telescope_hardware.h"
caoyuan9642 1:64c1fd738059 6 #include "AMIS30543StepperDriver.h"
caoyuan9642 1:64c1fd738059 7 #include "AdaptiveAxis.h"
caoyuan9642 1:64c1fd738059 8 #include "EquatorialMount.h"
caoyu@caoyuan9642-desktop.MIT.EDU 7:bfd32470c0bc 9 #include "RTCClockHR.h"
caoyuan9642 1:64c1fd738059 10 #include "SDBlockDevice.h"
caoyuan9642 1:64c1fd738059 11 #include "FATFileSystem.h"
caoyuan9642 1:64c1fd738059 12 #include "TelescopeConfiguration.h"
caoyuan9642 1:64c1fd738059 13 #include "EqMountServer.h"
caoyuan9642 1:64c1fd738059 14 #include "MCULoadMeasurement.h"
caoyuan9642 1:64c1fd738059 15 #include "USBSerial.h"
caoyuan9642 1:64c1fd738059 16
caoyuan9642 1:64c1fd738059 17 /**
caoyuan9642 1:64c1fd738059 18 * Right-Ascenstion Axis
caoyuan9642 1:64c1fd738059 19 */
caoyuan9642 1:64c1fd738059 20 SPI ra_spi(PC_12, PC_11, PB_3_ALT0);
caoyuan9642 1:64c1fd738059 21 AMIS30543StepperDriver *ra_stepper;
caoyuan9642 1:64c1fd738059 22
caoyuan9642 1:64c1fd738059 23 /**
caoyuan9642 1:64c1fd738059 24 * Declination Axis
caoyuan9642 1:64c1fd738059 25 */
caoyuan9642 1:64c1fd738059 26 SPI dec_spi(PE_6, PE_5, PE_2);
caoyuan9642 1:64c1fd738059 27 AMIS30543StepperDriver *dec_stepper;
caoyuan9642 1:64c1fd738059 28
caoyuan9642 1:64c1fd738059 29 /**
caoyu@caoyuan9642-desktop.MIT.EDU 4:42a64e84f75a 30 * Clock & Location object
caoyuan9642 1:64c1fd738059 31 */
caoyu@caoyuan9642-desktop.MIT.EDU 7:bfd32470c0bc 32 RTCClockHR clk;
caoyu@caoyuan9642-desktop.MIT.EDU 4:42a64e84f75a 33 LocationProvider location;
caoyu@caoyuan9642-desktop.MIT.EDU 4:42a64e84f75a 34
caoyu@caoyuan9642-desktop.MIT.EDU 4:42a64e84f75a 35
caoyuan9642 1:64c1fd738059 36
caoyuan9642 1:64c1fd738059 37 /**
caoyuan9642 1:64c1fd738059 38 * SD card reader hardware configuration
caoyuan9642 1:64c1fd738059 39 */
caoyuan9642 1:64c1fd738059 40 SDBlockDevice sd(PA_7, PB_4, PA_5, PC_13);
caoyuan9642 1:64c1fd738059 41 FATFileSystem fs("sdcard");
caoyuan9642 1:64c1fd738059 42
caoyuan9642 1:64c1fd738059 43 const char *config_file_path = "/sdcard/telescope.cfg";
caoyuan9642 1:64c1fd738059 44 const char *config_saved_file_path = "/sdcard/telescope_saved.cfg";
caoyuan9642 1:64c1fd738059 45 AdaptiveAxis *ra_axis = NULL;
caoyuan9642 1:64c1fd738059 46 AdaptiveAxis *dec_axis = NULL;
caoyuan9642 1:64c1fd738059 47 EquatorialMount *eq_mount = NULL;
caoyuan9642 1:64c1fd738059 48
caoyuan9642 1:64c1fd738059 49 static void add_sys_commands();
caoyuan9642 1:64c1fd738059 50
caoyuan9642 1:64c1fd738059 51 EquatorialMount &telescopeHardwareInit()
caoyuan9642 1:64c1fd738059 52 {
caoyuan9642 1:64c1fd738059 53 // Read configuration
caoyuan9642 1:64c1fd738059 54 printf("Mounting SD card...\n");
caoyuan9642 1:64c1fd738059 55 if (fs.mount(&sd) != 0)
caoyuan9642 1:64c1fd738059 56 {
caoyuan9642 1:64c1fd738059 57 debug(
caoyuan9642 1:64c1fd738059 58 "Error: failed to mount SD card. Falling back to default configuration.\n");
caoyuan9642 1:64c1fd738059 59 }
caoyuan9642 1:64c1fd738059 60 else
caoyuan9642 1:64c1fd738059 61 {
caoyuan9642 1:64c1fd738059 62 // First check saved file
caoyuan9642 1:64c1fd738059 63 const char *file = config_saved_file_path;
caoyuan9642 1:64c1fd738059 64 FILE *fp = fopen(file, "r");
caoyuan9642 1:64c1fd738059 65 if (fp == NULL)
caoyuan9642 1:64c1fd738059 66 {
caoyuan9642 1:64c1fd738059 67 // Then check original file
caoyuan9642 1:64c1fd738059 68 file = config_file_path;
caoyuan9642 1:64c1fd738059 69 fp = fopen(file, "r");
caoyuan9642 1:64c1fd738059 70 if (fp == NULL)
caoyuan9642 1:64c1fd738059 71 {
caoyuan9642 1:64c1fd738059 72 debug("Error: config file not found.\n", config_file_path);
caoyuan9642 1:64c1fd738059 73 }
caoyuan9642 1:64c1fd738059 74 }
caoyuan9642 1:64c1fd738059 75
caoyuan9642 1:64c1fd738059 76 if (fp)
caoyuan9642 1:64c1fd738059 77 {
caoyuan9642 1:64c1fd738059 78 printf("Reading configuration file %s\n", file);
caoyuan9642 1:64c1fd738059 79 TelescopeConfiguration::readFromFile(fp);
caoyuan9642 1:64c1fd738059 80 fclose(fp);
caoyuan9642 1:64c1fd738059 81 }
caoyuan9642 1:64c1fd738059 82 }
caoyuan9642 1:64c1fd738059 83
caoyuan9642 1:64c1fd738059 84 // Object re-initialization
caoyuan9642 1:64c1fd738059 85 if (ra_axis != NULL)
caoyuan9642 1:64c1fd738059 86 {
caoyuan9642 1:64c1fd738059 87 delete ra_axis;
caoyuan9642 1:64c1fd738059 88 }
caoyuan9642 1:64c1fd738059 89 if (dec_axis != NULL)
caoyuan9642 1:64c1fd738059 90 {
caoyuan9642 1:64c1fd738059 91 delete dec_axis;
caoyuan9642 1:64c1fd738059 92 }
caoyuan9642 1:64c1fd738059 93 if (eq_mount != NULL)
caoyuan9642 1:64c1fd738059 94 {
caoyuan9642 1:64c1fd738059 95 delete eq_mount;
caoyuan9642 1:64c1fd738059 96 }
caoyuan9642 1:64c1fd738059 97 if (ra_stepper != NULL)
caoyuan9642 1:64c1fd738059 98 {
caoyuan9642 1:64c1fd738059 99 delete ra_stepper;
caoyuan9642 1:64c1fd738059 100 }
caoyuan9642 1:64c1fd738059 101 if (dec_stepper != NULL)
caoyuan9642 1:64c1fd738059 102 {
caoyuan9642 1:64c1fd738059 103 delete dec_stepper;
caoyuan9642 1:64c1fd738059 104 }
caoyuan9642 1:64c1fd738059 105
caoyuan9642 1:64c1fd738059 106 double stepsPerDeg = TelescopeConfiguration::getDouble("motor_steps")
caoyuan9642 1:64c1fd738059 107 * TelescopeConfiguration::getDouble("gear_reduction")
caoyuan9642 1:64c1fd738059 108 * TelescopeConfiguration::getDouble("worm_teeth") / 360.0;
caoyuan9642 1:64c1fd738059 109
caoyuan9642 1:64c1fd738059 110 ra_stepper = new AMIS30543StepperDriver(&ra_spi, PE_3, PB_7, NC, NC,
caoyuan9642 1:64c1fd738059 111 TelescopeConfiguration::getBool("ra_invert"));
caoyuan9642 1:64c1fd738059 112 dec_stepper = new AMIS30543StepperDriver(&dec_spi, PE_4, PC_8, NC, NC,
caoyuan9642 1:64c1fd738059 113 TelescopeConfiguration::getBool("dec_invert"));
caoyuan9642 1:64c1fd738059 114 ra_axis = new AdaptiveAxis(stepsPerDeg, ra_stepper, "RA_Axis");
caoyuan9642 1:64c1fd738059 115 dec_axis = new AdaptiveAxis(stepsPerDeg, dec_stepper, "DEC_Axis");
caoyu@caoyuan9642-desktop.MIT.EDU 4:42a64e84f75a 116 eq_mount = new EquatorialMount(*ra_axis, *dec_axis, clk, location);
caoyuan9642 1:64c1fd738059 117
caoyuan9642 1:64c1fd738059 118 printf("Telescope initialized\n");
caoyuan9642 1:64c1fd738059 119
caoyuan9642 1:64c1fd738059 120 return (*eq_mount); // Return reference to eq_mount
caoyuan9642 1:64c1fd738059 121 }
caoyuan9642 1:64c1fd738059 122
caoyuan9642 1:64c1fd738059 123 /* Serial connection */
caoyuan9642 1:64c1fd738059 124 UARTSerial *console;
caoyuan9642 1:64c1fd738059 125 EqMountServer *server_serial;
caoyuan9642 1:64c1fd738059 126
caoyuan9642 1:64c1fd738059 127 /* USB connection */
caoyuan9642 1:64c1fd738059 128 EqMountServer *server_usb;
caoyuan9642 1:64c1fd738059 129
caoyuan9642 1:64c1fd738059 130 bool serverInitialized = false;
caoyuan9642 1:64c1fd738059 131
caoyuan9642 1:64c1fd738059 132 osStatus telescopeServerInit()
caoyuan9642 1:64c1fd738059 133 {
caoyuan9642 1:64c1fd738059 134 if (eq_mount == NULL)
caoyuan9642 1:64c1fd738059 135 return osErrorResource;
caoyuan9642 1:64c1fd738059 136 if (!serverInitialized)
caoyuan9642 1:64c1fd738059 137 {
caoyuan9642 1:64c1fd738059 138 // Only run once
caoyuan9642 1:64c1fd738059 139 serverInitialized = true;
caoyuan9642 1:64c1fd738059 140 add_sys_commands();
caoyuan9642 1:64c1fd738059 141 }
caoyuan9642 1:64c1fd738059 142
caoyuan9642 1:64c1fd738059 143 if (!console)
caoyuan9642 1:64c1fd738059 144 {
caoyuan9642 1:64c1fd738059 145 console = new UARTSerial(USBTX, USBRX,
caoyuan9642 1:64c1fd738059 146 TelescopeConfiguration::getInt("serial_baud"));
caoyuan9642 1:64c1fd738059 147 server_serial = new EqMountServer(*console, false);
caoyuan9642 1:64c1fd738059 148 }
caoyuan9642 1:64c1fd738059 149 server_serial->bind(*eq_mount);
caoyuan9642 1:64c1fd738059 150
caoyuan9642 1:64c1fd738059 151 if (!server_usb)
caoyuan9642 1:64c1fd738059 152 {
caoyuan9642 1:64c1fd738059 153 server_usb = new EqMountServer(USBSerial::getInstance(), false);
caoyuan9642 1:64c1fd738059 154 }
caoyuan9642 1:64c1fd738059 155 server_usb->bind(*eq_mount);
caoyuan9642 1:64c1fd738059 156
caoyuan9642 1:64c1fd738059 157 return osOK;
caoyuan9642 1:64c1fd738059 158 }
caoyuan9642 1:64c1fd738059 159
caoyuan9642 1:64c1fd738059 160 static int eqmount_sys(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 1:64c1fd738059 161 char *argv[])
caoyuan9642 1:64c1fd738059 162 {
caoyuan9642 1:64c1fd738059 163 const int THD_MAX = 32;
caoyuan9642 1:64c1fd738059 164 osThreadId thdlist[THD_MAX];
caoyuan9642 1:64c1fd738059 165 int nt = osThreadEnumerate(thdlist, THD_MAX);
caoyuan9642 1:64c1fd738059 166
caoyuan9642 1:64c1fd738059 167 stprintf(server->getStream(), "Thread list: \r\n");
caoyuan9642 1:64c1fd738059 168 for (int i = 0; i < nt; i++)
caoyuan9642 1:64c1fd738059 169 {
caoyuan9642 1:64c1fd738059 170 osThreadState_t state = osThreadGetState(thdlist[i]);
caoyuan9642 1:64c1fd738059 171 const char *s = "";
caoyuan9642 1:64c1fd738059 172 const char *n;
caoyuan9642 1:64c1fd738059 173 osPriority_t prio = osThreadGetPriority(thdlist[i]);
caoyuan9642 1:64c1fd738059 174
caoyuan9642 1:64c1fd738059 175 if (prio == osPriorityIdle)
caoyuan9642 1:64c1fd738059 176 {
caoyuan9642 1:64c1fd738059 177 n = "Idle thread";
caoyuan9642 1:64c1fd738059 178 }
caoyuan9642 1:64c1fd738059 179 else
caoyuan9642 1:64c1fd738059 180 {
caoyuan9642 1:64c1fd738059 181 n = osThreadGetName(thdlist[i]);
caoyuan9642 1:64c1fd738059 182 if (n == NULL)
caoyuan9642 1:64c1fd738059 183 n = "System thread";
caoyuan9642 1:64c1fd738059 184 }
caoyuan9642 1:64c1fd738059 185
caoyuan9642 1:64c1fd738059 186 switch (state)
caoyuan9642 1:64c1fd738059 187 {
caoyuan9642 1:64c1fd738059 188 case osThreadInactive:
caoyuan9642 1:64c1fd738059 189 s = "Inactive";
caoyuan9642 1:64c1fd738059 190 break;
caoyuan9642 1:64c1fd738059 191 case osThreadReady:
caoyuan9642 1:64c1fd738059 192 s = "Ready";
caoyuan9642 1:64c1fd738059 193 break;
caoyuan9642 1:64c1fd738059 194 case osThreadRunning:
caoyuan9642 1:64c1fd738059 195 s = "Running";
caoyuan9642 1:64c1fd738059 196 break;
caoyuan9642 1:64c1fd738059 197 case osThreadBlocked:
caoyuan9642 1:64c1fd738059 198 s = "Blocked";
caoyuan9642 1:64c1fd738059 199 break;
caoyuan9642 1:64c1fd738059 200 case osThreadTerminated:
caoyuan9642 1:64c1fd738059 201 s = "Terminated";
caoyuan9642 1:64c1fd738059 202 break;
caoyuan9642 1:64c1fd738059 203 case osThreadError:
caoyuan9642 1:64c1fd738059 204 s = "Error";
caoyuan9642 1:64c1fd738059 205 break;
caoyuan9642 1:64c1fd738059 206 default:
caoyuan9642 1:64c1fd738059 207 s = "Unknown";
caoyuan9642 1:64c1fd738059 208 break;
caoyuan9642 1:64c1fd738059 209 }
caoyuan9642 1:64c1fd738059 210 stprintf(server->getStream(), " - %10s 0x%08x %3d %s \r\n", s,
caoyuan9642 1:64c1fd738059 211 (uint32_t) thdlist[i], (int) prio, n);
caoyuan9642 1:64c1fd738059 212 }
caoyuan9642 1:64c1fd738059 213
caoyuan9642 1:64c1fd738059 214 stprintf(server->getStream(), "\r\nRecent CPU usage: %.1f%%\r\n",
caoyuan9642 1:64c1fd738059 215 MCULoadMeasurement::getInstance().getCPUUsage() * 100);
caoyuan9642 1:64c1fd738059 216 return 0;
caoyuan9642 1:64c1fd738059 217 }
caoyuan9642 1:64c1fd738059 218
caoyuan9642 1:64c1fd738059 219 static int eqmount_systime(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 1:64c1fd738059 220 char *argv[])
caoyuan9642 1:64c1fd738059 221 {
caoyuan9642 1:64c1fd738059 222 char buf[32];
caoyuan9642 1:64c1fd738059 223 time_t t = time(NULL);
caoyuan9642 1:64c1fd738059 224
caoyuan9642 1:64c1fd738059 225 core_util_critical_section_enter();
caoyuan9642 1:64c1fd738059 226 char *ibuf = ctime(&t);
caoyuan9642 1:64c1fd738059 227 strncpy(buf, ibuf, sizeof(buf));
caoyuan9642 1:64c1fd738059 228 core_util_critical_section_exit();
caoyuan9642 1:64c1fd738059 229
caoyuan9642 1:64c1fd738059 230 stprintf(server->getStream(), "Current UTC time: %s\r\n", buf);
caoyuan9642 1:64c1fd738059 231
caoyuan9642 1:64c1fd738059 232 return 0;
caoyuan9642 1:64c1fd738059 233 }
caoyuan9642 1:64c1fd738059 234
caoyuan9642 1:64c1fd738059 235 static int eqmount_reboot(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 1:64c1fd738059 236 char *argv[])
caoyuan9642 1:64c1fd738059 237 {
caoyuan9642 1:64c1fd738059 238 NVIC_SystemReset();
caoyuan9642 1:64c1fd738059 239 return 0;
caoyuan9642 1:64c1fd738059 240 }
caoyuan9642 1:64c1fd738059 241
caoyuan9642 1:64c1fd738059 242 static int eqmount_save(EqMountServer *server, const char *cmd, int argn,
caoyuan9642 1:64c1fd738059 243 char *argv[])
caoyuan9642 1:64c1fd738059 244 {
caoyuan9642 1:64c1fd738059 245 if (argn == 0)
caoyuan9642 1:64c1fd738059 246 {
caoyuan9642 1:64c1fd738059 247 FILE *fp = fopen(config_saved_file_path, "w");
caoyuan9642 1:64c1fd738059 248 if (fp)
caoyuan9642 1:64c1fd738059 249 {
caoyuan9642 1:64c1fd738059 250 TelescopeConfiguration::writeToFile(fp);
caoyuan9642 1:64c1fd738059 251 fclose(fp);
caoyuan9642 1:64c1fd738059 252 }
caoyuan9642 1:64c1fd738059 253 else
caoyuan9642 1:64c1fd738059 254 {
caoyuan9642 1:64c1fd738059 255 debug("Failed to write to file %s\n", config_saved_file_path);
caoyuan9642 1:64c1fd738059 256 return -1;
caoyuan9642 1:64c1fd738059 257 }
caoyuan9642 1:64c1fd738059 258 }
caoyuan9642 1:64c1fd738059 259 else if (argn == 1 && strcmp(argv[0], "delete") == 0)
caoyuan9642 1:64c1fd738059 260 {
caoyuan9642 1:64c1fd738059 261 // Delete save file
caoyuan9642 1:64c1fd738059 262 if (remove(config_saved_file_path) != 0)
caoyuan9642 1:64c1fd738059 263 {
caoyuan9642 1:64c1fd738059 264 debug("Failed to delete file %s\n", config_saved_file_path);
caoyuan9642 1:64c1fd738059 265 return -1;
caoyuan9642 1:64c1fd738059 266 }
caoyuan9642 1:64c1fd738059 267 }
caoyuan9642 1:64c1fd738059 268 return 0;
caoyuan9642 1:64c1fd738059 269 }
caoyuan9642 1:64c1fd738059 270
caoyuan9642 1:64c1fd738059 271 static void add_sys_commands()
caoyuan9642 1:64c1fd738059 272 {
caoyuan9642 1:64c1fd738059 273 EqMountServer::addCommand(
caoyuan9642 1:64c1fd738059 274 ServerCommand("sys", "Print system information", eqmount_sys));
caoyuan9642 1:64c1fd738059 275 EqMountServer::addCommand(
caoyuan9642 1:64c1fd738059 276 ServerCommand("systime", "Print system time", eqmount_systime));
caoyuan9642 1:64c1fd738059 277 EqMountServer::addCommand(
caoyuan9642 1:64c1fd738059 278 ServerCommand("reboot", "Reboot the system", eqmount_reboot));
caoyuan9642 1:64c1fd738059 279 EqMountServer::addCommand(
caoyuan9642 1:64c1fd738059 280 ServerCommand("save", "Save configuration file", eqmount_save));
caoyuan9642 1:64c1fd738059 281 }
caoyuan9642 1:64c1fd738059 282