Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2 | Rev 6 | ||
|---|---|---|---|
| Line 33... | Line 33... | ||
| 33 | //#include "test.h" |
33 | //#include "test.h" |
| 34 | #include "shell.h" |
34 | #include "shell.h" |
| 35 | #include "evtimer.h" |
35 | #include "evtimer.h" |
| 36 | #include "chprintf.h" |
36 | #include "chprintf.h" |
| 37 | 37 | ||
| 38 | - | ||
| 39 | - | ||
| 40 | #if (HAL_USE_SERIAL_USB == TRUE) |
38 | #if (HAL_USE_SERIAL_USB == TRUE) |
| 41 | #include "usbcfg.h" |
39 | #include "usbcfg.h" |
| 42 | #endif |
40 | #endif |
| 43 | 41 | ||
| 44 | - | ||
| 45 | #include "useAdc.h" |
42 | #include "useAdc.h" |
| 46 | 43 | ||
| 47 | - | ||
| 48 | #include "shellCmds.h" |
44 | #include "shellCmds.h" |
| 49 | 45 | ||
| - | 46 | #include "ap_math.h" |
|
| - | 47 | #include "spiInterface.h" |
|
| - | 48 | #include "SSD1306.h" |
|
| - | 49 | #include "font.h" |
|
| - | 50 | ||
| - | 51 | #include "vl53l0x_api.h" |
|
| - | 52 | #include "vl53l0x_platform.h" |
|
| - | 53 | #include "required_version.h" |
|
| 50 | 54 | ||
| - | 55 | ||
| 51 | static MUTEX_DECL(mutexDisplay); |
56 | static MUTEX_DECL( mutexDisplay); |
| - | 57 | ||
| - | 58 | unsigned lidar = 0; |
|
| 52 | 59 | ||
| 53 | /*===========================================================================*/ |
60 | /*===========================================================================*/ |
| 54 | /* Command line related. */ |
61 | /* Command line related. */ |
| 55 | /*===========================================================================*/ |
62 | /*===========================================================================*/ |
| 56 | 63 | ||
| 57 | #define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(2048) |
64 | #define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(1024) |
| 58 | #define TEST_WA_SIZE THD_WORKING_AREA_SIZE(256) |
65 | #define TEST_WA_SIZE THD_WORKING_AREA_SIZE(256) |
| 59 | 66 | ||
| 60 | - | ||
| 61 | - | ||
| 62 | static const ShellConfig shell_cfg1 = { |
67 | static const ShellConfig shell_cfg1 = { |
| 63 | #if (HAL_USE_SERIAL_USB == TRUE) |
68 | #if (HAL_USE_SERIAL_USB == TRUE) |
| 64 | (BaseSequentialStream *)&SDU1, |
69 | (BaseSequentialStream*) &SDU1, |
| 65 | #else |
70 | #else |
| 66 | (BaseSequentialStream *)&SD1, |
71 | (BaseSequentialStream *)&SD1, |
| 67 | #endif |
72 | #endif |
| 68 | shellCommands |
73 | shellCommands }; |
| 69 | }; |
- | |
| 70 | //////// |
74 | //////// |
| 71 | // end of shell stuff |
75 | // end of shell stuff |
| 72 | 76 | ||
| 73 | uint16_t sampIndex; |
77 | uint16_t sampIndex; |
| 74 | 78 | ||
| 75 | void setDriveA(uint8_t bit) |
79 | void setDriveA(uint8_t bit) { |
| 76 | { |
- | |
| 77 | if(bit) |
80 | if (bit) { |
| 78 | { |
- | |
| 79 | palSetPad(GPIOA, GPIOA_A1); |
81 | palSetPad(GPIOA, GPIOA_A1); |
| 80 | palClearPad(GPIOA, GPIOA_A2); |
82 | palClearPad(GPIOA, GPIOA_A2); |
| 81 | } |
- | |
| 82 | else |
83 | } else { |
| 83 | { |
- | |
| 84 | palClearPad(GPIOA, GPIOA_A1); |
84 | palClearPad(GPIOA, GPIOA_A1); |
| 85 | palSetPad(GPIOA, GPIOA_A2); |
85 | palSetPad(GPIOA, GPIOA_A2); |
| 86 | } |
86 | } |
| 87 | } |
87 | } |
| 88 | 88 | ||
| 89 | void setDriveB(uint8_t bit) |
89 | void setDriveB(uint8_t bit) { |
| 90 | { |
- | |
| 91 | if(bit) |
90 | if (bit) { |
| 92 | { |
- | |
| 93 | palSetPad(GPIOA, GPIOA_B1); |
91 | palSetPad(GPIOA, GPIOA_B1); |
| 94 | palClearPad(GPIOA, GPIOA_B2); |
92 | palClearPad(GPIOA, GPIOA_B2); |
| 95 | } |
- | |
| 96 | else |
93 | } else { |
| 97 | { |
- | |
| 98 | palClearPad(GPIOA, GPIOA_B1); |
94 | palClearPad(GPIOA, GPIOA_B1); |
| 99 | palSetPad(GPIOA, GPIOA_B2); |
95 | palSetPad(GPIOA, GPIOA_B2); |
| 100 | } |
96 | } |
| 101 | } |
97 | } |
| 102 | 98 | ||
| 103 | 99 | ||
| - | 100 | // dial settings |
|
| 104 | volatile int origin = 0;; |
101 | volatile int origin = 0; |
| - | 102 | ; |
|
| 105 | volatile int target = 630; |
103 | volatile int target = 0; |
| 106 | volatile int count = 0; |
104 | volatile int count = 0; |
| 107 | 105 | ||
| - | 106 | volatile bool pause; |
|
| - | 107 | // |
|
| - | 108 | ||
| - | 109 | ||
| - | 110 | void setPause(bool p) { |
|
| - | 111 | pause = p; |
|
| - | 112 | } |
|
| - | 113 | ||
| 108 | static THD_WORKING_AREA(waThread1, 512); |
114 | static THD_WORKING_AREA(waThread1, 512); |
| 109 | static msg_t Thread1(void *arg) { |
115 | static void Thread1(void *arg) { |
| 110 | 116 | ||
| 111 | (void) arg; |
117 | (void) arg; |
| 112 | unsigned const fast=10 ; |
118 | unsigned const fast = 10; |
| 113 | unsigned const slow = 40; |
119 | unsigned const slow = 30; |
| 114 | unsigned const range = slow-fast; |
120 | unsigned const range = slow - fast; |
| 115 | unsigned del = fast; |
121 | unsigned del = fast; |
| 116 | int step = 1; |
122 | int step = 1; |
| 117 | chRegSetThreadName("Step"); |
123 | chRegSetThreadName("Step"); |
| 118 | while (TRUE) { |
124 | while (TRUE) { |
| 119 | 125 | ||
| - | 126 | while (pause) |
|
| - | 127 | chThdSleep(1000); |
|
| - | 128 | ||
| 120 | switch (count % 4) |
129 | switch (count % 4) { |
| - | 130 | case 0: |
|
| - | 131 | setDriveA(1); |
|
| - | 132 | setDriveB(0); |
|
| - | 133 | break; |
|
| - | 134 | case 1: |
|
| - | 135 | setDriveA(1); |
|
| - | 136 | setDriveB(1); |
|
| 121 | { |
137 | break; |
| - | 138 | case 2: |
|
| 122 | case 0: setDriveA(1); setDriveB(0); break; |
139 | setDriveA(0); |
| 123 | case 1: setDriveA(1); setDriveB(1); break; |
140 | setDriveB(1); |
| - | 141 | break; |
|
| - | 142 | case 3: |
|
| 124 | case 2: setDriveA(0); setDriveB(1); break; |
143 | setDriveA(0); |
| 125 | case 3: setDriveA(0); setDriveB(0); break; |
144 | setDriveB(0); |
| - | 145 | break; |
|
| 126 | } |
146 | } |
| 127 | chThdSleep(del); |
- | |
| 128 | count = count + step; |
- | |
| 129 | 147 | ||
| 130 | // all this calculates minimum distance from |
148 | // all this calculates minimum distance from |
| 131 | // target or origin |
149 | // target or origin |
| 132 | int d1= count-origin; |
150 | int d1 = count - origin; |
| - | 151 | if (d1 < 0) |
|
| 133 | if(d1<0) d1 = -d1; |
152 | d1 = -d1; |
| 134 | int d2= count-target; |
153 | int d2 = count - target; |
| - | 154 | if (d2 < 0) |
|
| 135 | if(d2<0) d2 = -d2; |
155 | d2 = -d2; |
| 136 | // finally, minimum distance |
156 | // finally, minimum distance |
| 137 | int dist = d1<d2 ? d1 : d2; |
157 | int dist = d1 < d2 ? d1 : d2; |
| 138 | - | ||
| 139 | 158 | ||
| 140 | del = fast ; |
159 | del = fast; |
| 141 | if(dist < range) // inside lower bound of distance |
160 | if (dist < range) // inside lower bound of distance |
| 142 | { |
161 | { |
| 143 | del = slow-dist; |
162 | del = slow - dist; |
| 144 | } |
163 | } |
| - | 164 | chThdSleep(del); |
|
| 145 | 165 | ||
| 146 | if(count < target ) { step = 1; } |
166 | if (count < target) { |
| - | 167 | step = 1; |
|
| - | 168 | } |
|
| 147 | if(count > target ) { step =-1; } |
169 | if (count > target) { |
| - | 170 | step = -1; |
|
| - | 171 | } |
|
| 148 | if(count == target) { step = 0; } |
172 | if (count == target) { |
| - | 173 | step = 0; |
|
| - | 174 | } |
|
| - | 175 | count = count + step; |
|
| 149 | 176 | ||
| 150 | } |
177 | } |
| 151 | return 0; |
178 | |
| 152 | } |
179 | } |
| 153 | 180 | ||
| 154 | /* |
181 | /* |
| 155 | * Command Shell Thread |
182 | * Command Shell Thread |
| 156 | */ |
183 | */ |
| 157 | static THD_WORKING_AREA(waThread2, 512); |
184 | static THD_WORKING_AREA(waThread2, 512); |
| 158 | static msg_t Thread2(void *arg) { |
185 | static void Thread2(void *arg) { |
| 159 | thread_t *shelltp = NULL; |
186 | thread_t *shelltp = NULL; |
| 160 | 187 | ||
| 161 | chRegSetThreadName("Shell "); |
188 | chRegSetThreadName("Shell "); |
| 162 | /* |
189 | /* |
| 163 | * in this demo it just performs |
190 | * in this demo it just performs |
| 164 | * a shell respawn upon its termination. |
191 | * a shell respawn upon its termination. |
| 165 | */ |
192 | */ |
| 166 | while (true) { |
193 | while (true) { |
| 167 | if (!shelltp) { |
194 | if (!shelltp) { |
| 168 | #if (HAL_USE_SERIAL_USB == TRUE) |
195 | #if (HAL_USE_SERIAL_USB == TRUE) |
| 169 | if (SDU1.config->usbp->state == USB_ACTIVE) { |
196 | if (SDU1.config->usbp->state == USB_ACTIVE) { |
| 170 | /* Spawns a new shell.*/ |
197 | /* Spawns a new shell.*/ |
| 171 | shelltp = chThdCreateFromHeap(NULL, SHELL_WA_SIZE, "shell", NORMALPRIO, shellThread, (void *) &shell_cfg1); |
198 | shelltp = chThdCreateFromHeap(NULL, SHELL_WA_SIZE, "shell", |
| - | 199 | NORMALPRIO, shellThread, (void*) &shell_cfg1); |
|
| 172 | } |
200 | } |
| 173 | #else |
201 | #else |
| 174 | shelltp = chThdCreateFromHeap(NULL, SHELL_WA_SIZE, "shell", NORMALPRIO, shellThread, (void *) &shell_cfg1); |
202 | shelltp = chThdCreateFromHeap(NULL, SHELL_WA_SIZE, "shell", NORMALPRIO, shellThread, (void *) &shell_cfg1); |
| 175 | #endif |
203 | #endif |
| 176 | } |
- | |
| 177 | else { |
204 | } else { |
| 178 | /* If the previous shell exited.*/ |
205 | /* If the previous shell exited.*/ |
| 179 | if (chThdTerminatedX(shelltp)) { |
206 | if (chThdTerminatedX(shelltp)) { |
| 180 | /* Recovers memory of the previous shell.*/ |
207 | /* Recovers memory of the previous shell.*/ |
| 181 | chThdRelease(shelltp); |
208 | chThdRelease(shelltp); |
| 182 | shelltp = NULL; |
209 | shelltp = NULL; |
| 183 | } |
210 | } |
| 184 | } |
211 | } |
| 185 | chThdSleepMilliseconds(500); |
212 | chThdSleepMilliseconds(500); |
| 186 | } |
213 | } |
| 187 | 214 | ||
| 188 | return MSG_OK; |
- | |
| 189 | } |
215 | } |
| 190 | 216 | ||
| - | 217 | static THD_WORKING_AREA(waThread3, 1024); |
|
| - | 218 | static void Thread3(void *arg) { |
|
| - | 219 | ||
| - | 220 | VL53L0X_Dev_t MyDevice; |
|
| - | 221 | VL53L0X_Dev_t *pMyDevice = &MyDevice; |
|
| - | 222 | setPause(true); |
|
| - | 223 | int Status = VL53L0XdeviceSetup(pMyDevice); |
|
| - | 224 | setPause(false); |
|
| - | 225 | VL53L0X_RangingMeasurementData_t RangingMeasurementData; |
|
| - | 226 | ||
| - | 227 | while(1){ |
|
| 191 | 228 | ||
| - | 229 | chThdSleep(chTimeMS2I(100)); |
|
| - | 230 | setPause(true); |
|
| - | 231 | Status = VL53L0X_PerformSingleRangingMeasurement(pMyDevice, |
|
| - | 232 | &RangingMeasurementData); |
|
| - | 233 | setPause(false); |
|
| 192 | 234 | ||
| - | 235 | if (Status != VL53L0X_ERROR_NONE) continue; |
|
| 193 | 236 | ||
| - | 237 | ||
| - | 238 | lidar = RangingMeasurementData.RangeMilliMeter; |
|
| - | 239 | ||
| - | 240 | ||
| - | 241 | ||
| - | 242 | } |
|
| - | 243 | } |
|
| 194 | /* |
244 | /* |
| 195 | * Application entry point. |
245 | * Application entry point. |
| 196 | */ |
246 | */ |
| 197 | int main(void) { |
247 | int main(void) { |
| 198 | // struct EventListener el0, el1; |
248 | // struct EventListener el0, el1; |
| Line 206... | Line 256... | ||
| 206 | */ |
256 | */ |
| 207 | halInit(); |
257 | halInit(); |
| 208 | chSysInit(); |
258 | chSysInit(); |
| 209 | 259 | ||
| 210 | #if (HAL_USE_SERIAL_USB == TRUE) |
260 | #if (HAL_USE_SERIAL_USB == TRUE) |
| 211 | /* |
261 | /* |
| 212 | * Initializes a serial-over-USB CDC driver. |
262 | * Initializes a serial-over-USB CDC driver. |
| 213 | */ |
263 | */ |
| 214 | sduObjectInit(&SDU1); |
264 | sduObjectInit(&SDU1); |
| 215 | sduStart(&SDU1, &serusbcfg); |
265 | sduStart(&SDU1, &serusbcfg); |
| 216 | 266 | ||
| 217 | #if HAL_USE_USB_DUAL_CDC == TRUE |
267 | #if HAL_USE_USB_DUAL_CDC == TRUE |
| 218 | sduObjectInit(&SDU2); |
268 | sduObjectInit(&SDU2); |
| 219 | sduStart(&SDU2, &serusbcfg2); |
269 | sduStart(&SDU2, &serusbcfg2); |
| 220 | #endif |
270 | #endif |
| 221 | 271 | ||
| 222 | /* |
272 | /* |
| 223 | * Activates the USB driver and then the USB bus pull-up on D+. |
273 | * Activates the USB driver and then the USB bus pull-up on D+. |
| 224 | * Note, a delay is inserted in order to not have to disconnect the cable |
274 | * Note, a delay is inserted in order to not have to disconnect the cable |
| 225 | * after a reset. |
275 | * after a reset. |
| 226 | */ |
276 | */ |
| 227 | usbDisconnectBus(serusbcfg.usbp); |
277 | usbDisconnectBus(serusbcfg.usbp); |
| 228 | chThdSleepMilliseconds(1000); |
278 | chThdSleepMilliseconds(1000); |
| 229 | usbStart(serusbcfg.usbp, &usbcfg); |
279 | usbStart(serusbcfg.usbp, &usbcfg); |
| 230 | usbConnectBus(serusbcfg.usbp); |
280 | usbConnectBus(serusbcfg.usbp); |
| 231 | #else |
281 | #else |
| 232 | /* |
282 | /* |
| 233 | * Initializes serial port. |
283 | * Initializes serial port. |
| 234 | */ |
284 | */ |
| 235 | sdStart(&SD2, NULL); |
285 | sdStart(&SD2, NULL); |
| 236 | #endif /* HAL_USE_SERIAL_USB */ |
286 | #endif /* HAL_USE_SERIAL_USB */ |
| 237 | 287 | ||
| - | 288 | useAdc(); |
|
| 238 | 289 | ||
| 239 | useAdc(); |
- | |
| 240 | 290 | ||
| 241 | /* |
291 | /* |
| 242 | * Shell manager initialization. |
292 | * Shell manager initialization. |
| 243 | */ |
293 | */ |
| 244 | shellInit(); |
294 | // shellInit(); |
| - | 295 | /* |
|
| - | 296 | * initialise approximate maths |
|
| - | 297 | */ |
|
| - | 298 | ap_init(); |
|
| - | 299 | ||
| - | 300 | chMtxLock(&mutexDisplay); |
|
| - | 301 | ||
| - | 302 | /* start the SPI hardware for display */ |
|
| - | 303 | ssd1306spiInit(); |
|
| - | 304 | ||
| - | 305 | ssd1306_begin( SSD1306_SWITCHCAPVCC, 0) ; |
|
| - | 306 | ||
| - | 307 | ||
| - | 308 | clearDisplay(); |
|
| - | 309 | ||
| - | 310 | display(); |
|
| 245 | 311 | ||
| - | 312 | chMtxUnlock(&mutexDisplay); |
|
| 246 | 313 | ||
| - | 314 | ||
| 247 | /* |
315 | /* |
| 248 | * Creates the PLL thread |
316 | * Creates the PLL thread |
| 249 | */ |
317 | */ |
| 250 | chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); |
318 | chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); |
| 251 | 319 | ||
| - | 320 | chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); |
|
| 252 | 321 | ||
| - | 322 | // chThdCreateStatic(waThread3, sizeof(waThread3), NORMALPRIO, Thread3, NULL); |
|
| 253 | 323 | ||
| - | 324 | // reset gauge |
|
| - | 325 | origin = 540; |
|
| - | 326 | count = 540; |
|
| - | 327 | target = 0; |
|
| 254 | chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); |
328 | chThdSleepMilliseconds(1000); |
| - | 329 | target = 0; |
|
| 255 | 330 | ||
| - | 331 | int frac = 0; |
|
| 256 | /* start the SPI hardware for display */ |
332 | /* start the SPI hardware for display */ |
| 257 | while(1) |
333 | while (1) { |
| 258 | { |
- | |
| 259 | 334 | ||
| 260 | // read the dial |
335 | chThdSleepMilliseconds(100); |
| - | 336 | unsigned const SCALE = frac * 32 + 16; |
|
| 261 | adcSample(); |
337 | frac = ++frac %10; |
| 262 | 338 | ||
| - | 339 | // read the dial |
|
| - | 340 | adcSample(); |
|
| 263 | 341 | ||
| - | 342 | origin = count; |
|
| 264 | 343 | ||
| 265 | origin = count; |
344 | target = target +1; |
| 266 | 345 | ||
| 267 | target = getAdc(0)*630L/4096L; |
346 | // target = lidar * 630L / 2000L; |
| 268 | 347 | ||
| - | 348 | if (target > 540) target = 0; |
|
| 269 | 349 | ||
| 270 | 350 | ||
| 271 | chThdSleep(chTimeMS2I(100)); |
351 | chMtxLock(&mutexDisplay); |
| 272 | 352 | ||
| - | 353 | font_gotoxy(0,0); |
|
| - | 354 | clearDisplay(); |
|
| - | 355 | ||
| - | 356 | // print_scaled_string("cm:",0,16,4,SCALE); |
|
| 273 | } |
357 | |
| - | 358 | ||
| - | 359 | print_digits(0, 0, 4, 1, target,SCALE); |
|
| - | 360 | ||
| - | 361 | chMtxUnlock(&mutexDisplay); |
|
| 274 | 362 | ||
| - | 363 | display(); |
|
| - | 364 | ||
| - | 365 | ||
| - | 366 | ||
| - | 367 | } |
|
| 275 | 368 | ||
| 276 | } |
369 | } |