/** * @brief Read settings from SPI FLASH * @param None * @retval None */ static ErrorStatus prvReadSettingsFromSpiFlash() { /* Read to a temporary settings variable */ CANSettings settings = {0}; if (SPI_FLASH_ReadBufferDMA((uint8_t*)&settings, FLASH_ADR_CAN1_SETTINGS, sizeof(CANSettings), 2000) == SUCCESS) { /* Check to make sure the data is reasonable */ if (IS_CAN_CONNECTION(settings.connection) && IS_CAN_TERMINATION(settings.termination) && IS_CAN_BIT_RATE(settings.bitRate)) { /* Try to take the settings semaphore */ if (xSettingsSemaphore != 0 && xSemaphoreTake(xSettingsSemaphore, 100) == pdTRUE) { /* Copy to the real settings variable */ memcpy(&prvCurrentSettings, &settings, sizeof(CANSettings)); prvCurrentSettings.connection = CANConnection_Disconnected; prvCurrentSettings.termination = CANTermination_Disconnected; can1UpdateWithNewSettings(); /* Give back the semaphore now that we are done */ xSemaphoreGive(xSettingsSemaphore); return SUCCESS; } else { /* Something went wrong as we couldn't take the semaphore */ return ERROR; } } else return ERROR; } else return ERROR; }
/** * @brief * @param Event: The event that caused the callback * @param ButtonId: The button ID that the event happened on * @retval None */ void guiCan1BitRateSelectionCallback(GUITouchEvent Event, uint32_t ButtonId) { if (Event == GUITouchEvent_Up) { CANBitRate newBitRate; switch (ButtonId) { case GUIButtonId_Can1BitRate10k: GUIButton_SetTextForRow(GUIButtonId_Can1BitRate, "10kbit/s", 1); newBitRate = CANBitRate_10k; break; case GUIButtonId_Can1BitRate20k: GUIButton_SetTextForRow(GUIButtonId_Can1BitRate, "20kbit/s", 1); newBitRate = CANBitRate_20k; break; case GUIButtonId_Can1BitRate50k: GUIButton_SetTextForRow(GUIButtonId_Can1BitRate, "50kbit/s", 1); newBitRate = CANBitRate_50k; break; case GUIButtonId_Can1BitRate100k: GUIButton_SetTextForRow(GUIButtonId_Can1BitRate, "100kbit/s", 1); newBitRate = CANBitRate_100k; break; case GUIButtonId_Can1BitRate125k: GUIButton_SetTextForRow(GUIButtonId_Can1BitRate, "125kbit/s", 1); newBitRate = CANBitRate_125k; break; case GUIButtonId_Can1BitRate250k: GUIButton_SetTextForRow(GUIButtonId_Can1BitRate, "250kbit/s", 1); newBitRate = CANBitRate_250k; break; case GUIButtonId_Can1BitRate500k: GUIButton_SetTextForRow(GUIButtonId_Can1BitRate, "500kbit/s", 1); newBitRate = CANBitRate_500k; break; case GUIButtonId_Can1BitRate1M: GUIButton_SetTextForRow(GUIButtonId_Can1BitRate, "1Mbit/s", 1); newBitRate = CANBitRate_1M; break; default: newBitRate = 0; break; } CANSettings* settings = can1GetSettings(); SemaphoreHandle_t* settingsSemaphore = can1GetSettingsSemaphore(); /* Try to take the settings semaphore */ if (newBitRate != 0 && *settingsSemaphore != 0 && xSemaphoreTake(*settingsSemaphore, 100) == pdTRUE) { settings->bitRate = newBitRate; can1UpdateWithNewSettings(); /* Restart the channel if it was on */ if (settings->connection == CANConnection_Connected) can1Restart(); /* Give back the semaphore now that we are done */ xSemaphoreGive(*settingsSemaphore); } /* Hide the pop out */ GUIContainer_Hide(GUIContainerId_PopoutCan1BitRate); GUI_SetActiveLayer(GUILayer_0); GUIButton_SetLayer(GUIButtonId_Can1BitRate, GUILayer_0); GUIButton_SetState(GUIButtonId_Can1BitRate, GUIButtonState_Disabled); /* Refresh the main text box */ guiCan1ManageMainTextBox(true); } }