State machine

Create a state machine to check a message in a custom protocol.

The message format is (one byte each) : 0xAA , OxBB, len , …. data …. , CS

use the following starter code:

#include <stdio.h>
#include <stdlib.h>
 
#define MAX_LEN 255
 
typedef enum { OK,CSERROR} Status;
typedef enum { WAITFORAA,WAITFORBB,STORELEN,READDATA,CALCCS} State;
 
Status CalculateCS(char *addr, int count,char cs)
{
  register char sum = 0;
  unsigned char csres;
 
  while(count > 1)
  {
    sum = sum + *((short *) addr);
    addr+=2;
    count = count - 2;
  }
 
  if (count > 0)
    sum = sum + *((char *) addr);
 
  while (sum>>16)
    sum = (sum & 0xFFFF) + (sum >> 16);
 
  return ((~sum) == cs) ? OK : CSERROR;
}
 
void ProcessMsg(char *msg,int len)
{
    puts("msg ok");
}
 

void HandleByte(unsigned char nextb)
{
 // TODO : implement 
 // send a correct message to ProcessMsg()
}
 
int main(void) {
    int i;
    char msgtest[11] = { 0xAA, 0xBB, 7, 'a','b','c','d','e','q','r',128}; 
 
    for(i = 0; i < 11; i++)
    {
        HandleByte(msgtest[i]);
    }
 
    return EXIT_SUCCESS;
}

change the CS value and check the results

Extra:

Add support for 0xAA, 0xBB as part of the data