From 2a70e1ddc7c04fef5f02990311c21854583eb54e Mon Sep 17 00:00:00 2001 From: Casper Date: Wed, 22 Apr 2020 11:20:15 +0200 Subject: [PATCH] initial commit --- .cproject | 60 ++++---- ADCManager.cpp | 15 +- Bootloader.cpp | 4 + DelfiPQcore.cpp | 6 + ResetService.cpp | 9 +- SoftwareUpdateService.cpp | 292 +++++++++++++++++++++++--------------- SoftwareUpdateService.h | 4 +- 7 files changed, 241 insertions(+), 149 deletions(-) diff --git a/.cproject b/.cproject index 638adb2..40a14e9 100644 --- a/.cproject +++ b/.cproject @@ -87,30 +87,21 @@ - - diff --git a/ADCManager.cpp b/ADCManager.cpp index bd55a5e..f0ca7ed 100644 --- a/ADCManager.cpp +++ b/ADCManager.cpp @@ -58,10 +58,17 @@ float ADCManager::getTempMeasurement(){ int16_t conRes; uint64_t status; - cal30 = MAP_SysCtl_getTempCalibrationConstant(SYSCTL_2_5V_REF, - SYSCTL_30_DEGREES_C); - cal85 = MAP_SysCtl_getTempCalibrationConstant(SYSCTL_2_5V_REF, - SYSCTL_85_DEGREES_C); + #if defined (__MSP432P401R__) + cal30 = MAP_SysCtl_getTempCalibrationConstant(SYSCTL_2_5V_REF, + SYSCTL_30_DEGREES_C); + cal85 = MAP_SysCtl_getTempCalibrationConstant(SYSCTL_2_5V_REF, + SYSCTL_85_DEGREES_C); + #elif defined (__MSP432P4111__) + cal30 = MAP_SysCtl_A_getTempCalibrationConstant(SYSCTL_A_2_5V_REF, + SYSCTL_A_30_DEGREES_C); + cal85 = MAP_SysCtl_A_getTempCalibrationConstant(SYSCTL_A_2_5V_REF, + SYSCTL_A_85_DEGREES_C); + #endif calDifference = cal85 - cal30; conRes = ((MAP_ADC14_getResult(ADC_MEM0) - cal30) * 55); diff --git a/Bootloader.cpp b/Bootloader.cpp index 25465e3..93018ba 100644 --- a/Bootloader.cpp +++ b/Bootloader.cpp @@ -115,7 +115,11 @@ void Bootloader::JumpSlot(){ Console::log("+ BOOTLOADER - Error: target slot not valid!"); target_slot = BOOT_PERMANENT_FLAG; //set target to 0 and reboot this->fram->write(BOOTLOADER_TARGET_REG, &target_slot, 1); +#if defined (__MSP432P401R__) MAP_SysCtl_rebootDevice(); +#elif defined (__MSP432P4111__) + MAP_SysCtl_A_rebootDevice(); +#endif break; } Console::log("Jumping to: 0x%x", (int) *resetPtr); diff --git a/DelfiPQcore.cpp b/DelfiPQcore.cpp index 063ff17..48f4e31 100644 --- a/DelfiPQcore.cpp +++ b/DelfiPQcore.cpp @@ -27,8 +27,14 @@ void DelfiPQcore::initMCU( void ) MAP_CS_setExternalClockSourceFrequency(SCLOCK, FCLOCK); MAP_PCM_setCoreVoltageLevel(PCM_VCORE1); + +#if defined (__MSP432P401R__) MAP_FlashCtl_setWaitState(FLASH_BANK0, 2); MAP_FlashCtl_setWaitState(FLASH_BANK1, 2); +#elif defined (__MSP432P4111__) + MAP_FlashCtl_A_setWaitState(FLASH_A_BANK0, 2); + MAP_FlashCtl_A_setWaitState(FLASH_A_BANK1, 2); +#endif uint32_t clock; if( CS_startHFXTWithTimeout(false, 100000) ) diff --git a/ResetService.cpp b/ResetService.cpp index d99a6ff..9acf53a 100644 --- a/ResetService.cpp +++ b/ResetService.cpp @@ -35,12 +35,10 @@ void resetHandler() Console::flush( ); //Add WDT time=out to reset-cause register - RSTCTL->HARDRESET_SET |= RESET_HARD_WDTTIME; - // TODO: replace this with a power cycle to protect also the RS485 driver // for now, at least reset, till the power cycle gets implemented in HW // MAP_SysCtl_rebootDevice(); - MAP_ResetCtl_initiateHardReset(); + MAP_ResetCtl_initiateHardResetWithSource(RESET_HARD_WDTTIME); } /** @@ -253,5 +251,10 @@ void ResetService::forceSoftReset() // make sure all characters have been flushed to the console before rebooting Console::flush( ); +#if defined (__MSP432P401R__) MAP_SysCtl_rebootDevice(); +#elif defined (__MSP432P4111__) + MAP_SysCtl_A_rebootDevice(); +#endif + } diff --git a/SoftwareUpdateService.cpp b/SoftwareUpdateService.cpp index 2990faf..78ef67f 100644 --- a/SoftwareUpdateService.cpp +++ b/SoftwareUpdateService.cpp @@ -72,130 +72,140 @@ bool SoftwareUpdateService::process(DataMessage &command, DataMessage &workingBu if(command.getPayload()[COMMAND_METHOD] != ERASE_SLOT) state_flags &= ~ERASE_FLAG; //unset the Erase flag, if the command is not to erase. - switch (command.getPayload()[COMMAND_METHOD]) { - case START_OTA: - if((command.getSize() == PAYLOAD_SIZE_OFFSET + 1) || (command.getSize() == PAYLOAD_SIZE_OFFSET + 2)){ - if(command.getPayload()[COMMAND_DATA] == 1 || command.getPayload()[COMMAND_DATA] == 2) { - if(command.getSize() == PAYLOAD_SIZE_OFFSET + 2){ - startOTA(command.getPayload()[COMMAND_DATA], command.getPayload()[COMMAND_DATA+1] == 1); - }else{ - startOTA(command.getPayload()[COMMAND_DATA], false); - } + if(command.getPayload()[COMMAND_RESPONSE] == SERVICE_RESPONSE_REQUEST){ + switch (command.getPayload()[COMMAND_METHOD]) { + case START_OTA: + if((command.getSize() == PAYLOAD_SIZE_OFFSET + 1) || (command.getSize() == PAYLOAD_SIZE_OFFSET + 2)){ + if(command.getPayload()[COMMAND_DATA] == 1 || command.getPayload()[COMMAND_DATA] == 2) { + if(command.getSize() == PAYLOAD_SIZE_OFFSET + 2){ + startOTA(command.getPayload()[COMMAND_DATA], command.getPayload()[COMMAND_DATA+1] == 1); + }else{ + startOTA(command.getPayload()[COMMAND_DATA], false); + } - if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("OTA started!"); + if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("OTA started!"); - } else throw_error(SLOT_OUT_OF_RANGE); - } else throw_error(PARAMETER_MISMATCH); - break; + } else throw_error(SLOT_OUT_OF_RANGE); + } else throw_error(PARAMETER_MISMATCH); + break; - case SET_METADATA: - if(command.getSize() == METADATA_SIZE - 1 + PAYLOAD_SIZE_OFFSET) { - setMetadata(&(command.getPayload()[COMMAND_DATA])); - if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("Metadata received!"); + case SET_METADATA: + if(command.getSize() == METADATA_SIZE - 1 + PAYLOAD_SIZE_OFFSET) { + setMetadata(&(command.getPayload()[COMMAND_DATA])); + if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("Metadata received!"); - } else throw_error(PARAMETER_MISMATCH); - break; + } else throw_error(PARAMETER_MISMATCH); + break; - case GET_METADATA: - if(command.getSize() == PAYLOAD_SIZE_OFFSET + 1) { - if(command.getPayload()[COMMAND_DATA] == 1 || command.getPayload()[COMMAND_DATA] == 2) { - getMetadata(command.getPayload()[COMMAND_DATA] - 1); - if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) { - print_metadata(&payload_data[COMMAND_DATA]); - Console::log("Metadata sent!"); - } - } else throw_error(SLOT_OUT_OF_RANGE); - } else throw_error(PARAMETER_MISMATCH); - break; + case GET_METADATA: + if(command.getSize() == PAYLOAD_SIZE_OFFSET + 1) { + if(command.getPayload()[COMMAND_DATA] == 1 || command.getPayload()[COMMAND_DATA] == 2) { + getMetadata(command.getPayload()[COMMAND_DATA] - 1); + if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) { + print_metadata(&payload_data[COMMAND_DATA]); + Console::log("Metadata sent!"); + } + } else throw_error(SLOT_OUT_OF_RANGE); + } else throw_error(PARAMETER_MISMATCH); + break; - case SET_PARTIAL_CRCS: - if(command.getSize() <= BLOCK_SIZE + PAYLOAD_SIZE_OFFSET + 2) { //2 extra bytes for offset bytes -// serial.print("SIZE BYTE msB: "); -// serial.println(command.getPayload()[COMMAND_DATA + 1],DEC); -// serial.print("SIZE BYTE lsB: "); -// serial.println(command.getPayload()[COMMAND_DATA],DEC); -// serial.print("CRC OFFSET: "); -// serial.println(command.getPayload()[COMMAND_DATA] | (command.getPayload()[COMMAND_DATA + 1] << 8), DEC); - setPartialCRCs(&(command.getPayload()[COMMAND_DATA+2]), command.getSize() - (PAYLOAD_SIZE_OFFSET+2), command.getPayload()[COMMAND_DATA] | (command.getPayload()[COMMAND_DATA + 1] << 8)); - if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("CRC!"); - } else throw_error(PARAMETER_MISMATCH); - break; + case SET_PARTIAL_CRCS: + if(command.getSize() <= BLOCK_SIZE + PAYLOAD_SIZE_OFFSET + 2) { //2 extra bytes for offset bytes + // serial.print("SIZE BYTE msB: "); + // serial.println(command.getPayload()[COMMAND_DATA + 1],DEC); + // serial.print("SIZE BYTE lsB: "); + // serial.println(command.getPayload()[COMMAND_DATA],DEC); + // serial.print("CRC OFFSET: "); + // serial.println(command.getPayload()[COMMAND_DATA] | (command.getPayload()[COMMAND_DATA + 1] << 8), DEC); + setPartialCRCs(&(command.getPayload()[COMMAND_DATA+2]), command.getSize() - (PAYLOAD_SIZE_OFFSET+2), command.getPayload()[COMMAND_DATA] | (command.getPayload()[COMMAND_DATA + 1] << 8)); + if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("CRC!"); + } else throw_error(PARAMETER_MISMATCH); + break; - case SET_BLOCK: - if(command.getSize() <= BLOCK_SIZE + 2 + PAYLOAD_SIZE_OFFSET) { - Console::log("BLOCK!"); - setBlock(&(command.getPayload()[COMMAND_DATA + 2]), command.getPayload()[COMMAND_DATA] | (command.getPayload()[COMMAND_DATA + 1] << 8)); - if(payload_data[COMMAND_RESPONSE] == COMMAND_ERROR) Console::log("ERROR!"); - } else throw_error(PARAMETER_MISMATCH); - break; + case SET_BLOCK: + if(command.getSize() <= BLOCK_SIZE + 2 + PAYLOAD_SIZE_OFFSET) { + Console::log("BLOCK!"); + setBlock(&(command.getPayload()[COMMAND_DATA + 2]), command.getPayload()[COMMAND_DATA] | (command.getPayload()[COMMAND_DATA + 1] << 8)); + if(payload_data[COMMAND_RESPONSE] == COMMAND_ERROR) Console::log("ERROR!"); + } else throw_error(PARAMETER_MISMATCH); + break; - case CHECK_MD5: - if(command.getSize() == PAYLOAD_SIZE_OFFSET + 1) { - if(command.getPayload()[COMMAND_DATA] == 1 || command.getPayload()[COMMAND_DATA] == 2) { - checkMD5(command.getPayload()[COMMAND_DATA]); - if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("MD5 is correct!"); - } else throw_error(SLOT_OUT_OF_RANGE); - } else throw_error(PARAMETER_MISMATCH); - break; + case CHECK_MD5: + if(command.getSize() == PAYLOAD_SIZE_OFFSET + 1) { + if(command.getPayload()[COMMAND_DATA] == 1 || command.getPayload()[COMMAND_DATA] == 2) { + checkMD5(command.getPayload()[COMMAND_DATA]); + if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("MD5 is correct!"); + } else throw_error(SLOT_OUT_OF_RANGE); + } else throw_error(PARAMETER_MISMATCH); + break; - case STOP_OTA: - if(command.getSize() == PAYLOAD_SIZE_OFFSET) { - stopOTA(); - if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("OTA is stopped!"); - } else throw_error(PARAMETER_MISMATCH); - break; + case STOP_OTA: + if(command.getSize() == PAYLOAD_SIZE_OFFSET) { + stopOTA(); + if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("OTA is stopped!"); + } else throw_error(PARAMETER_MISMATCH); + break; - case ERASE_SLOT: - if(command.getSize() == PAYLOAD_SIZE_OFFSET + 1) { - if((state_flags & ERASE_FLAG) == 0) { - if(command.getPayload()[COMMAND_DATA] == 1 || command.getPayload()[COMMAND_DATA] == 2) { - slot_erase = command.getPayload()[COMMAND_DATA]; - state_flags |= ERASE_FLAG; - Console::log("Are you sure(13)?"); + case ERASE_SLOT: + if(command.getSize() == PAYLOAD_SIZE_OFFSET + 1) { + if((state_flags & ERASE_FLAG) == 0) { + if(command.getPayload()[COMMAND_DATA] == 1 || command.getPayload()[COMMAND_DATA] == 2) { + slot_erase = command.getPayload()[COMMAND_DATA]; + state_flags |= ERASE_FLAG; + Console::log("Are you sure(13)?"); + } else throw_error(SLOT_OUT_OF_RANGE); + } else { + if(command.getPayload()[COMMAND_DATA] == ACKNOWLEDGE) { + eraseSlot(slot_erase); + if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("Slot is erased!"); + } else throw_error(PARAMETER_MISMATCH); + } + } else throw_error(PARAMETER_MISMATCH); + break; + case SET_BOOT_SLOT: + if(command.getSize() == PAYLOAD_SIZE_OFFSET + 2) { + if(command.getPayload()[COMMAND_DATA] < 3) { + setBootSlot(command.getPayload()[COMMAND_DATA], command.getPayload()[COMMAND_DATA + 1]); + if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("Slot code executed successfully!"); } else throw_error(SLOT_OUT_OF_RANGE); - } else { - if(command.getPayload()[COMMAND_DATA] == ACKNOWLEDGE) { - eraseSlot(slot_erase); - if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("Slot is erased!"); - } else throw_error(PARAMETER_MISMATCH); - } - } else throw_error(PARAMETER_MISMATCH); - break; - case SET_BOOT_SLOT: - if(command.getSize() == PAYLOAD_SIZE_OFFSET + 2) { - if(command.getPayload()[COMMAND_DATA] < 3) { - setBootSlot(command.getPayload()[COMMAND_DATA], command.getPayload()[COMMAND_DATA + 1]); - if(payload_data[COMMAND_RESPONSE] != COMMAND_ERROR) Console::log("Slot code executed successfully!"); - } else throw_error(SLOT_OUT_OF_RANGE); - } else throw_error(PARAMETER_MISMATCH); - break; - case GET_MISSED_BLOCKS: - if(command.getSize() == PAYLOAD_SIZE_OFFSET) { - getMissedBlocks(); - } else throw_error(PARAMETER_MISMATCH); - break; - case GET_MISSED_CRC: - if(command.getSize() == PAYLOAD_SIZE_OFFSET) { - getMissedCRCs(); - } else throw_error(PARAMETER_MISMATCH); - break; - case GET_VERSION_NUMBER: - if(command.getSize() == PAYLOAD_SIZE_OFFSET) { - getVersionNumber(); - } else throw_error(PARAMETER_MISMATCH); - break; - default: - break; - } + } else throw_error(PARAMETER_MISMATCH); + break; + case GET_MISSED_BLOCKS: + if(command.getSize() == PAYLOAD_SIZE_OFFSET) { + getMissedBlocks(); + } else throw_error(PARAMETER_MISMATCH); + break; + case GET_MISSED_CRC: + if(command.getSize() == PAYLOAD_SIZE_OFFSET) { + getMissedCRCs(); + } else throw_error(PARAMETER_MISMATCH); + break; + case GET_VERSION_NUMBER: + if(command.getSize() == PAYLOAD_SIZE_OFFSET) { + getVersionNumber(); + } else throw_error(PARAMETER_MISMATCH); + break; + default: + workingBuffer.getPayload()[COMMAND_RESPONSE] = SERVICE_RESPONSE_ERROR; + workingBuffer.getPayload()[2] = UNKNOWN_COMMAND; + workingBuffer.setSize(3); + break; + } - workingBuffer.setSize(payload_size); + workingBuffer.setSize(payload_size); - // command processed + // command processed + return true; + } else { + // this command is related to another service, + // report the command was not processed + return false; + } + }else{ + workingBuffer.getPayload()[COMMAND_RESPONSE] = SERVICE_RESPONSE_ERROR; + workingBuffer.getPayload()[2] = NO_REQUEST; + workingBuffer.setSize(3); return true; - } else { - // this command is related to another service, - // report the command was not processed - return false; } } @@ -428,11 +438,35 @@ void SoftwareUpdateService::setBlock(unsigned char* data_block, uint16_t block_o //check if CRC matches if(checkPartialCRC(data_block, block_offset)) { //write block to FLASH + unsigned int memloc; unsigned int sector = 1 << (((block_offset * BLOCK_SIZE + (update_slot - 1) * SLOT_SIZE)) / SECTOR_SIZE); +#if defined (__MSP432P401R__) if(!MAP_FlashCtl_unprotectSector(FLASH_MAIN_MEMORY_SPACE_BANK1, sector)) return throw_error(NO_SLOT_ACCESS); +#elif defined (__MSP432P4111__) + //convert sector back to memory location + // memloc = offset_bank1 + sector * sector_size + memloc = (FLASH_A_MAIN_MEMORY_SPACE_BANK1 + (update_slot - 1) * SLOT_SIZE + block_offset * BLOCK_SIZE); + // this looks like a weird construction, however memory is appearantly still sector based: + // http://dev.ti.com/tirex/explore/node?node=ACjtNKxGz96GtFvTawWu-g__z-lQYNj__LATEST + if(!MAP_FlashCtl_A_unprotectMemory(memloc, memloc + BLOCK_SIZE)) return throw_error(NO_SLOT_ACCESS); +#endif + +#if defined (__MSP432P401R__) if(!MAP_FlashCtl_programMemory(data_block, (void*)(BANK1_ADDRESS + (update_slot - 1) * SLOT_SIZE + block_offset * BLOCK_SIZE), BLOCK_SIZE)) return throw_error(NO_SLOT_ACCESS); - if(!MAP_FlashCtl_protectSector(FLASH_MAIN_MEMORY_SPACE_BANK1, sector)) return throw_error(NO_SLOT_ACCESS); +#elif defined (__MSP432P4111__) + if(!MAP_FlashCtl_A_programMemory(data_block, (void*)(FLASH_A_MAIN_MEMORY_SPACE_BANK1 + (update_slot - 1) * SLOT_SIZE + block_offset * BLOCK_SIZE), BLOCK_SIZE)) return throw_error(NO_SLOT_ACCESS); +#endif +#if defined (__MSP432P401R__) + if(!MAP_FlashCtl_protectSector(FLASH_MAIN_MEMORY_SPACE_BANK1, sector)) return throw_error(NO_SLOT_ACCESS); +#elif defined (__MSP432P4111__) + //convert sector back to memory location + // memloc = offset_bank1 + sector * sector_size + memloc = (FLASH_A_MAIN_MEMORY_SPACE_BANK1 + (update_slot - 1) * SLOT_SIZE + block_offset * BLOCK_SIZE); + // this looks like a weird construction, however memory is appearantly still sector based: + // http://dev.ti.com/tirex/explore/node?node=ACjtNKxGz96GtFvTawWu-g__z-lQYNj__LATEST + if(!MAP_FlashCtl_A_protectMemory(memloc, memloc + BLOCK_SIZE)) return throw_error(NO_SLOT_ACCESS); +#endif //update checklist in RAM blocks_received[block_offset / BYTE_SIZE] |= (1 << (block_offset) % BYTE_SIZE); @@ -607,10 +641,36 @@ void SoftwareUpdateService::eraseSlot(unsigned char slot) { fram->write(SLOT2_METADATA, empty, METADATA_SIZE); } + unsigned int memloc; + //mass erase flash +#if defined (__MSP432P401R__) if(!MAP_FlashCtl_unprotectSector(FLASH_MAIN_MEMORY_SPACE_BANK1, 0xFFFF << (16 * (slot - 1)))) return throw_error(NO_SLOT_ACCESS); +#elif defined (__MSP432P4111__) + //convert sector back to memory location + // memloc = offset_bank1 + sector * sector_size + memloc = FLASH_A_MAIN_MEMORY_SPACE_BANK1 + (slot - 1) * SLOT_SIZE; + // this looks like a weird construction, however memory is appearantly still sector based: + // http://dev.ti.com/tirex/explore/node?node=ACjtNKxGz96GtFvTawWu-g__z-lQYNj__LATEST + if(!MAP_FlashCtl_A_unprotectMemory(memloc, memloc + SLOT_SIZE)) return throw_error(NO_SLOT_ACCESS); +#endif + +#if defined (__MSP432P401R__) if(!MAP_FlashCtl_performMassErase()) return throw_error(NO_SLOT_ACCESS); +#elif defined (__MSP432P4111__) + if(!MAP_FlashCtl_A_performMassErase()) return throw_error(NO_SLOT_ACCESS); +#endif + +#if defined (__MSP432P401R__) if(!MAP_FlashCtl_protectSector(FLASH_MAIN_MEMORY_SPACE_BANK1, 0xFFFF << (16 * (slot - 1)))) return throw_error(NO_SLOT_ACCESS); +#elif defined (__MSP432P4111__) + //convert sector back to memory location + // memloc = offset_bank1 + sector * sector_size + memloc = FLASH_A_MAIN_MEMORY_SPACE_BANK1 + (slot - 1) * SLOT_SIZE; + // this looks like a weird construction, however memory is appearantly still sector based: + // http://dev.ti.com/tirex/explore/node?node=ACjtNKxGz96GtFvTawWu-g__z-lQYNj__LATEST + if(!MAP_FlashCtl_A_protectMemory(memloc, memloc + SLOT_SIZE)) return throw_error(NO_SLOT_ACCESS); +#endif state_flags = 0; //destroy progress flag if(!fram->ping()) return throw_error(NO_FRAM_ACCESS); @@ -629,8 +689,12 @@ void SoftwareUpdateService::setBootSlot(unsigned char slot, bool permanent) { fram->write(BOOTLOADER_TARGET_REG, &target_slot, 1); payload_size = 2; payload_data[COMMAND_RESPONSE] = SERVICE_RESPONSE_REPLY; - +#if defined (__MSP432P401R__) this->setPostFunc([](){ MAP_SysCtl_rebootDevice(); }); +#elif defined (__MSP432P4111__) + this->setPostFunc([](){ MAP_SysCtl_A_rebootDevice(); }); +#endif + } else { unsigned char slotFlag = 0; if(!fram->ping()) return throw_error(NO_FRAM_ACCESS); @@ -650,7 +714,11 @@ void SoftwareUpdateService::setBootSlot(unsigned char slot, bool permanent) { payload_size = 2; payload_data[COMMAND_RESPONSE] = SERVICE_RESPONSE_REPLY; +#if defined (__MSP432P401R__) this->setPostFunc([](){ MAP_SysCtl_rebootDevice();}); +#elif defined (__MSP432P4111__) + this->setPostFunc([](){ MAP_SysCtl_A_rebootDevice();}); +#endif } else return throw_error(SLOT_NOT_PROGRAMMED); } } diff --git a/SoftwareUpdateService.h b/SoftwareUpdateService.h index dec13cf..0c44d27 100644 --- a/SoftwareUpdateService.h +++ b/SoftwareUpdateService.h @@ -166,7 +166,9 @@ enum error_codes{ SLOT_NOT_EMPTY, SLOT_NOT_PROGRAMMED, SELF_ACTION, - NO_VERSION_NUMBER + NO_VERSION_NUMBER, + NO_REQUEST, + UNKNOWN_COMMAND }; enum metadata_offset {