added state machine
This commit is contained in:
parent
917aa733ff
commit
a94c55d4a6
35
bootloader.c
35
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user