foudesbois
2/13/2018 - 3:52 PM

Build bootloader frame

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;     
    }   
}