static void prvCanRxTask(void* pvParameters) { xCANMsg msg; for (;;) { vLEDToggle(LED_GREEN); vCANReceiveNonVitalMsg(&msg); switch (msg.eID) { default: break; case MSG_REMOTECMD: break; case MSG_USERCMD: break; case MSG_SPEED: break; case MSG_BATTERYLVL: if (bBtInited) { int xParameters[] = {msg.xData.words.low}; prvBtSendMsg('b', xParameters, 1); } break; case MSG_CTRLSTATE: if (bBtInited) { int xParameters[] = {msg.xData.words.low, msg.xData.words.high}; prvBtSendMsg('S', xParameters, 2); } } } }
void vLEDFlashTask( void *pvParameters ) { portTickType xLastExecutionTime = xTaskGetTickCount(); for (;;) { vTaskDelayUntil( &xLastExecutionTime, 1000/portTICK_RATE_MS ); vLEDToggle( D4_PORT, D4_PIN ); taskYIELD(); } }
static void prvCanVitalRxTask(void* pvParameters) { xCANMsg msg; int iBtMsgCountdown = 10; for (;;) { vLEDToggle(LED_RED); vCANReceiveVitalMsg(&msg); switch (msg.eID) { default: break; case MSG_STOP: DBGLOG(bDebugComm, "STOP received\r\n"); stopped = 1; break; case MSG_RESET: DBGLOG(bDebugComm, "RESET received\r\n"); vTaskDelay(1); NVIC_SystemReset(); break; case MSG_ANGLE_ANGVEL: break; case MSG_ENCINFO: break; case MSG_MOTORCMD: xSemaphoreTake(xVMutex, portMAX_DELAY); Vleft = msg.xData.values.first; Vright = msg.xData.values.second; xSemaphoreGive(xVMutex); if (bBtInited && !(iBtMsgCountdown--)) { int xParameters[] = {-msg.xData.values.first * 100 / 480, -msg.xData.values.second * 100 / 480}; prvBtSendMsg('m', xParameters, 2); iBtMsgCountdown = 10; } break; case MSG_DANGER: break; } } }
static void prvComputeTask(void* pvParameters) { xCANMsg msg; accelero_values_t accelero_values; double gyroscope_y = 0; double accelero_x = 0; double accelero_z = 0; portTickType time = xTaskGetTickCount(); int i = 0; static char buf[80]; static double previous_angle = 0; double d = 0; int iBtMsgCountdown = 10; uart_puts("\r\nSensorboard started...\r\n"); uart_puts("Processor UID: "); uart_puts(itoa(UID, buf)); uart_puts("\r\n"); uart_puts("Version: "); uart_puts(version); uart_puts("\r\n"); for (;;) { if (i++ == 100) { vLEDToggle(LED_YELLOW); i = 0; } if (stopped) vTaskDelay(portMAX_DELAY); vTaskDelayUntil(&time, 5 / portTICK_RATE_MS); accelero_get_values(&accelero_values); gyroscope_y = (double)gyroscope_get_value(Y) * PI / 180 / GYROSCOPE_SENSITIVITY; accelero_x = (double)accelero_values.x / ACCELERO_SENSITIVITY_TYP_6G; accelero_z = (double)accelero_values.z / ACCELERO_SENSITIVITY_TYP_6G; DBGLOG(bDebugKalman, itoa(atan2(accelero_x, -accelero_z) * 1000, buf)); DBGLOG(bDebugKalman, " "); DBGLOG(bDebugKalman, itoa(gyroscope_y * 1000, buf)); DBGLOG(bDebugKalman, " "); xSemaphoreTake(xVMutex, portMAX_DELAY); kalman_state_update(gyroscope_y, 0.005); xSemaphoreGive(xVMutex); kalman_cov_update(accelero_x, accelero_z); DBGLOG(bDebugKalman, itoa(kalman_get_angle() * 1000, buf)); DBGLOG(bDebugKalman, " "); DBGLOG(bDebugKalman, itoa(kalman_get_rate() * 1000, buf)); DBGLOG(bDebugKalman, " "); d = dAlpha * d + (1 - dAlpha) * kalman_get_rate(); DBGLOG(bDebugKalman, itoa(d * 1000, buf)); DBGLOG(bDebugKalman, "\r\n"); previous_angle = kalman_get_angle(); msg.eID = MSG_ANGLE_ANGVEL; msg.xData.values.first = kalman_get_angle(); msg.xData.values.second = d; vCANSendMsg(&msg); if (bBtInited && !(iBtMsgCountdown--)) { int xParameters[1] = {-RAD2DEG(kalman_get_angle())}; prvBtSendMsg('a', xParameters, 1); iBtMsgCountdown = 10; } } }
void item_1_callback(unsigned char button_down) { if (button_down) vLEDToggle(D4_PORT, D4_PIN); }