void executeSerialCommand(uint8_t string[], int length) { if(string[0] == '-') /* All commands start with a - */ { switch(string[1]) { case 'h': /* Help command */ sendSerialString("display help\n"); break; case 'c': sendSerialString("calibrate\n"); break; case 't': if (telemetryFlag == 0) { telemetryFlag = 1; sendSerialString("Telemetry started\n"); } else { telemetryFlag = 0; sendSerialString("Telemetry stopped\n"); } break; } } }
void initSerial() { __DMA2_CLK_ENABLE(); HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); huart1.Instance = USART1; huart1.Init.BaudRate = BAUDRATE; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); sendSerialString("[OK] Serial started..\n"); /* Start the receiver */ HAL_UART_Receive_DMA(&huart1, &rxBuffer, 1); }
/* The Sensor reading task */ void vTaskSensor (void *pvParameters) { bool success; unsigned char x; char sendString [ADC_READING_STRING_LEN * MAX_NUM_ADCS + 1]; /* +1 for terminator */ CodedCommand codedSensorCommand; portBASE_TYPE xStatus; while (1) { xStatus = xQueueReceive (xSensorCommandQueue, &codedSensorCommand, portMAX_DELAY); ASSERT_STRING (xStatus == pdPASS, "Failed to receive from sensor command queue."); success = false; /* Assume failure */ /* Print out what command we're going to execute */ rob_lcd_goto_xy (0, 1); rob_print_from_program_space (PSTR ("CMD: ")); if (codedSensorCommand.buffer[CODED_COMMAND_INDEX_POS] != CODED_COMMAND_INDEX_UNUSED) { rob_print_character ('#'); rob_print_unsigned_long (codedSensorCommand.buffer[CODED_COMMAND_INDEX_POS]); rob_print_character (' '); } rob_print_character (codedSensorCommand.buffer[CODED_COMMAND_ID_POS]); rob_lcd_goto_xy (0, 2); /* Now do it */ switch (codedSensorCommand.buffer[CODED_COMMAND_ID_POS]) { case '*': /* The only sensor command supported at the moment */ { RobMemset (sendString, ' ', sizeof (sendString)); calibrateAdcs(); for (x = 0; x < MAX_NUM_ADCS; x++) { unsigned int milliVolts; /* Write something like "FL:40 " (for ADC 2 of 6 (which is Front Left), object detected at 40 cm), or "FL: " if nothing is there. */ memcpy (&sendString[ADC_READING_STRING_LEN * x], channelToString[x], SENSOR_STRING_LEN); memcpy (&sendString[(ADC_READING_STRING_LEN * x) + SENSOR_STRING_LEN], NOTHING_THERE_STRING, NOTHING_THERE_STRING_LEN); milliVolts = readAdc (x); if (objectDetected (milliVolts)) { itoa (voltageToDistance (milliVolts), &(sendString[(ADC_READING_STRING_LEN * x) + SENSOR_STRING_LEN + 1]), 10); /* +1 to leave the ':' there */ } /* Overwrite the null terminator that itoa() puts in with a space */ sendString[RobStrlen (sendString)] = ' '; } sendString[sizeof (sendString) - 1] = 0; /* Add terminator */ sendSerialString (sendString, sizeof (sendString)); rob_print (sendString); success = true; } break; default: { ASSERT_ALWAYS_PARAM (codedSensorCommand.buffer[CODED_COMMAND_ID_POS]); } break; } if (!success) { sendSerialString (ERROR_STRING, sizeof (ERROR_STRING)); } } }
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { sendSerialString("[ERROR] Serial error\n"); }