Updater: Clear shell at startup and print size of update
This commit is contained in:
parent
9f1a791be2
commit
31b17dfd8d
53
stm-firmware/updater/ram-code/itoa.c
Normal file
53
stm-firmware/updater/ram-code/itoa.c
Normal file
@ -0,0 +1,53 @@
|
||||
#include "itoa.h"
|
||||
|
||||
/*
|
||||
* The heapless_itoa function is copied from the shellmatta project.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief itoa like function to convert int to an ascii string
|
||||
* @warning you have to provide a large enough buffer
|
||||
* @param[in] value
|
||||
* @param[in,out] buffer
|
||||
* @param[in] base
|
||||
* @return number of bytes in string
|
||||
*/
|
||||
uint32_t heapless_itoa(int32_t value, char *buffer, uint32_t base)
|
||||
{
|
||||
char tempBuffer[34u];
|
||||
uint32_t i;
|
||||
uint32_t bufferIdx = 0u;
|
||||
int8_t digitValue;
|
||||
|
||||
/** -# check the base for plausibility */
|
||||
if((base >= 2) && (base <= 16))
|
||||
{
|
||||
/** -# check for sign */
|
||||
if(value < 0)
|
||||
{
|
||||
value = value * (-1);
|
||||
buffer[0u] = '-';
|
||||
bufferIdx += 1u;
|
||||
}
|
||||
|
||||
/** -# loop through all digits in reverse order */
|
||||
i = 0u;
|
||||
do
|
||||
{
|
||||
digitValue = (int8_t) (value % base);
|
||||
tempBuffer[i] = (digitValue < 10) ? ('0' + digitValue) : ('A' + (digitValue - 10));
|
||||
value /= base;
|
||||
i ++;
|
||||
}while(value > 0);
|
||||
|
||||
/** -# store the string in the correct order onto the buffer */
|
||||
while(i > 0u)
|
||||
{
|
||||
buffer[bufferIdx] = tempBuffer[i - 1u];
|
||||
i --;
|
||||
bufferIdx ++;
|
||||
}
|
||||
}
|
||||
return bufferIdx;
|
||||
}
|
||||
|
8
stm-firmware/updater/ram-code/itoa.h
Normal file
8
stm-firmware/updater/ram-code/itoa.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef _ITOA_H_
|
||||
#define _ITOA_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
uint32_t heapless_itoa(int32_t value, char *buffer, uint32_t base);
|
||||
|
||||
#endif /* _ITOA_H_ */
|
@ -15,6 +15,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include "uart.h"
|
||||
#include "itoa.h"
|
||||
|
||||
static volatile unsigned int wait_tick;
|
||||
|
||||
@ -55,7 +56,7 @@ static void __attribute__((noreturn)) ram_code_exit(bool updated)
|
||||
while(1);
|
||||
}
|
||||
|
||||
static int check_hex_file(const char *fname)
|
||||
static int check_hex_file(const char *fname, uint32_t *update_size)
|
||||
{
|
||||
enum hex_parser_ret hex_ret;
|
||||
struct hex_parser parser;
|
||||
@ -65,6 +66,7 @@ static int check_hex_file(const char *fname)
|
||||
int retval = -1;
|
||||
uint32_t flash_base;
|
||||
uint32_t flash_top;
|
||||
uint32_t total_size = 0UL;
|
||||
|
||||
flash_base = flash_writer_get_base_address();
|
||||
flash_top = flash_base + flash_writer_get_flash_size();
|
||||
@ -82,11 +84,14 @@ static int check_hex_file(const char *fname)
|
||||
retval = -2;
|
||||
goto ret_close_parser;
|
||||
}
|
||||
total_size += dlen;
|
||||
}
|
||||
} while (hex_ret == HEX_PARSER_DATA_OK || hex_ret == HEX_PARSER_OK);
|
||||
|
||||
if (hex_ret == HEX_PARSER_EOF_RECORD) {
|
||||
retval = 0;
|
||||
if (update_size)
|
||||
*update_size = total_size;
|
||||
}
|
||||
|
||||
ret_close_parser:
|
||||
@ -198,8 +203,12 @@ int ram_code_main(void)
|
||||
int res;
|
||||
enum safety_memory_state safety_mem_state;
|
||||
static char filename[256];
|
||||
static char tmp_buff[256];
|
||||
uint32_t count;
|
||||
uint32_t update_size;
|
||||
int retries = 3;
|
||||
|
||||
|
||||
SysTick_Config(168000UL);
|
||||
external_watchdog_disable();
|
||||
__enable_irq();
|
||||
@ -208,6 +217,9 @@ int ram_code_main(void)
|
||||
* Pins don't need configuration. They're already setup by the main program
|
||||
*/
|
||||
uart_init();
|
||||
|
||||
/* Clear display and set cursor to home position */
|
||||
uart_send_string("\e[2J\e[H");
|
||||
uart_send_string("Updater started.\r\n");
|
||||
|
||||
res = safety_memory_init(&safety_mem_state);
|
||||
@ -225,10 +237,10 @@ int ram_code_main(void)
|
||||
if (res)
|
||||
ram_code_exit(false);
|
||||
|
||||
uart_send_string("Checking hex file\r\n");
|
||||
uart_send_string("Checking hex file ");
|
||||
uart_send_string(filename);
|
||||
uart_send_string("\r\n");
|
||||
if (check_hex_file(filename)) {
|
||||
if (check_hex_file(filename, &update_size)) {
|
||||
uart_send_string("Error in hex file\r\n");
|
||||
ram_code_exit(false);
|
||||
}
|
||||
@ -236,6 +248,14 @@ int ram_code_main(void)
|
||||
uart_send_string("File ");
|
||||
uart_send_string(filename);
|
||||
uart_send_string(" checked successfully.\r\n");
|
||||
count = heapless_itoa(update_size, tmp_buff, 10);
|
||||
if (count > 0) {
|
||||
tmp_buff[count] = 0;
|
||||
uart_send_string("Update size: ");
|
||||
uart_send_string(tmp_buff);
|
||||
uart_send_string(" bytes");
|
||||
}
|
||||
|
||||
uart_send_string("Starting updater...\r\n");
|
||||
|
||||
/* disable the ART caches */
|
||||
|
Loading…
Reference in New Issue
Block a user