From a94c55d4a6b174a37a0a6386ca035453cd6d0f57 Mon Sep 17 00:00:00 2001 From: yul Date: Mon, 30 May 2022 17:50:19 +0200 Subject: [PATCH] added state machine --- bootloader.c | 35 +++++++++++++++++++++++++++++------ uart_commands.c | 5 +++++ uart_commands.h | 2 ++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/bootloader.c b/bootloader.c index ba7ec17..adb910f 100644 --- a/bootloader.c +++ b/bootloader.c @@ -21,12 +21,22 @@ error_code status; +enum States +{ + S1, + S2, + S3 +}; + + /* is_even_assembly: ldr sp, [r0] ret */ +enum States state = S1; + char* argvs[3][10]; cmd_t cmd; @@ -92,36 +102,49 @@ void manage_bootloader(){ while(1){ uart_receive_command(buff); uart_parse_command(buff, &cmd); - if (strncmp("GETID", cmd.argv[0], 5)==0){ + if ((state == S1) && (strncmp("GETID", cmd.argv[0], 5)==0)){ uart_commands_getid(&status); - }else if(strncmp("GETSE", cmd.argv[0], 5)==0){ + }else if((state == S1) && (strncmp("GETSE", cmd.argv[0], 5)==0)){ uart_commands_getserial(&status); - }else if(strncmp("PROG", cmd.argv[0], 4)==0){ + }else if((state == S1) && (strncmp("PROG", cmd.argv[0], 4)==0)){ crc_prog = uart_string_to_int(cmd.argv[3]); total_size = uart_string_to_int(cmd.argv[2]); offset = uart_string_to_int(cmd.argv[1]); write_app_info(&crc_prog, (unsigned int *)&total_size); crc_data = uart_commands_prog(&status, total_size); + if(status == ok){ + state = S2; + } offset_pointer = offset; - }else if(strcmp("DATA", cmd.argv[0])==0){ + }else if(((state == S2) || (state = S3)) && (strcmp("DATA", cmd.argv[0])==0)){ int size = uart_string_to_int(cmd.argv[1]); crc_t local_checksum = uart_string_to_int(cmd.argv[2]); uart_commands_data(&status, size, &crc_data, local_checksum, offset_pointer); - if(status == 0) offset_pointer += size; + if(status == ok){ + offset_pointer += size; + state = S3; + }else{ + state = S2; + } - }else if(strncmp("CHECK", cmd.argv[0], 5)==0){ + }else if((state == S3) && (strncmp("CHECK", cmd.argv[0], 5)==0)){ error_code is_error = uart_commands_check(crc_prog, crc_data); if(is_error == ok){ + state = S1; uart_send_ok(); uart_send("bla\r\n", 5);//putting bla here so OK will show up //removing bla for the moment will make ok not show up launch_program(); }else{ + state = S2; uart_send_err(); + //flash LED red } + }else { + uart_send_cmd_illeg(); } } } diff --git a/uart_commands.c b/uart_commands.c index ad922ec..1f13438 100644 --- a/uart_commands.c +++ b/uart_commands.c @@ -4,6 +4,7 @@ static uint8_t data[1024]; char OK[5] = "OK\r\n"; char ERR[6] = "ERR\r\n"; +char CMD_ILLEGAL[13] = "CMD_ILLEGAL\r\n"; void digit_to_str(char* str, uint32_t number, int base){ itoa(number,str,16); @@ -245,3 +246,7 @@ void uart_send_ok(){ void uart_send_err(){ uart_send(ERR, 6); } + +void uart_send_cmd_illeg(){ + uart_send(CMD_ILLEGAL, 13); +} diff --git a/uart_commands.h b/uart_commands.h index c6146fc..8bc6050 100644 --- a/uart_commands.h +++ b/uart_commands.h @@ -37,6 +37,8 @@ void uart_send_ok(); void uart_send_err(); +void uart_send_cmd_illeg(); + void digit_to_str(char* str, uint32_t number, int base);