Algorithm to build a bootloader frame :
- header
- nbByte
- target
- addrH
- addrL
- data
- checksum
typedef enum {
header_etat0_BOOT,
nbByte_etat1_BOOT,
target_etat2_BOOT,
addrH_etat3_BOOT,
addrL_etat4_BOOT,
data_etat5_BOOT,
checksum_etat6_BOOT,
}STATES_t_BOOT;
void build_bootFrame(STATES_t_BOOT state)
{
unsigned char i, j;
switch(state)
{
case header_etat0_BOOT:
bootFrame.header = receivedByte_BOOT;
current_state = nbByte_etat1_BOOT;
break;
case nbByte_etat1_BOOT:
bootFrame.nbByte = receivedByte_BOOT;
if(bootFrame.nbByte > 16) // Error in the frame
{
current_state = header_etat0_BOOT;
bootFrame.CRCOK = false;
}
else
current_state = target_etat2_BOOT;
break;
case target_etat2_BOOT:
bootFrame.target = receivedByte_BOOT;
current_state = addrH_etat3_BOOT;
break;
case addrH_etat3_BOOT:
bootFrame.addrH = receivedByte_BOOT;
current_state = addrL_etat4_BOOT;
break;
case addrL_etat4_BOOT:
bootFrame.addrL = receivedByte_BOOT;
current_state = data_etat5_BOOT;
bootFrame.numByte = 0;
break;
case data_etat5_BOOT:
if(bootFrame.nbByte != 0)
{
bootFrame.data[bootFrame.numByte++] = receivedByte_BOOT;
if(bootFrame.numByte == bootFrame.nbByte)
current_state = checksum_etat6_BOOT;
}
else
{
bootFrame.CRCOK = true;
current_state = header_etat0_BOOT;
}
break;
case checksum_etat6_BOOT:
bootFrame.CRC = receivedByte_BOOT;
frameCRC[0] = bootFrame.header;frameCRC[1] = bootFrame.nbByte; frameCRC[2] = bootFrame.target;
frameCRC[3] = bootFrame.addrH; frameCRC[4] = bootFrame.addrL;
for(i = 0; i < bootFrame.numByte; i++)
{
frameCRC[5+i] = bootFrame.data[i];
}
j = getCRC(frameCRC, bootFrame.nbByte + 5);
if(j == bootFrame.CRC)
bootFrame.CRCOK = true;
else
bootFrame.CRCOK = false;
current_state = header_etat0_BOOT;
break;
}
}