Subversion Repositories tiedf232

Rev

Blame | Last modification | View Log | RSS feed

#include <stdio.h>
#include <string.h>

// note : LF/CR without group means restarting of a cycle

// frame definitions
#define STX     0x02
#define ETX     0x03
#define EOT     0x04

// group definitions
#define LF      0x0A
#define SP      0x20
#define CR      0x0D

#define CHKSUM(x)       (((x) >> 2) + 0x20)

// labels
char *labels[] = {
        "ADCO",                 // 12
        "OPTARIF",              // 4
        "ISOUSC",               // 2
        "BASE",                 // 9
        "HCHC",                 // 9
        "HCHP",                 // 9
        "EJPHN",                // 9
        "EJPHPM",               // 9
        "BBRHCJB",              // 9
        "BBRHPJB",              // 9
        "BBRHCJW",              // 9
        "BBRHPJW",              // 9
        "BBRHCJR",              // 9
        "BBRHPJR",              // 9
        "PEJP",                 // 2
        "PTEC",                 // 4
        "DEMAIN",               // 4
        "IINST",                // 3
        "ADPS",                 // 3
        "IMAX",                 // 3
        "PAPP",                 // 5
        "HHPHC",                // 1
        "MOTDETAT",             // 6
        "",
};

static int label2index(const char *str)
{
        int i;

        for(i = 0; labels[i][0]; i++)
                if(!strcmp(labels[i], str))
                        break;

        return i;
}

unsigned char buf[128]; // serial buf

unsigned char label[9]; // 8 chars max
unsigned char data[13]; // 12 chars max
unsigned char chksum;   // checksum

int main_(void)
{
        int i, j;
        unsigned char sum;

        // test
        i = 0;
        buf[i++] = STX;
        buf[i++] = LF;
        buf[i++] = 'A';
        buf[i++] = 'D';
        buf[i++] = 'C';
        buf[i++] = 'O';
        buf[i++] = SP;
        strcpy(buf+i, "04AATTNNNNNN");
        i += strlen("04AATTNNNNNN");
        buf[i++] = SP;
        buf[i++] = CHKSUM(185);
        buf[i++] = CR;
        buf[i++] = ETX;

        while(1)
        {
                i = 0;
                sum = 0;

                // check for start of frame
                if(buf[i++] != STX)
                        continue;

                // check for start of group
                if(buf[i++] != LF)
                        continue;

                // get label
                for(j = 0; buf[i+j] != SP; j++)
                {
                        label[j] = buf[i+j];
                        sum += label[j];
                }
                label[j] = '\0';
                i += j;

                // check for separator
                if(buf[i++] != SP)
                        continue;
                sum += SP;
       
                // get data
                for(j = 0; buf[i+j] != SP; j++)
                {
                        data[j] = buf[i+j];
                        sum += data[j];
                }
                data[j] = '\0';
                i += j;

                // check for separator
                if(buf[i++] != SP)
                        continue;
                sum += SP;

                // get checksum
                chksum = buf[i++];
                if(CHKSUM(sum) != chksum)
                        continue;

                // check for end of group
                if(buf[i++] != CR)
                        continue;

                // check for end of frame
                if(buf[i++] != ETX)
                        continue;

                // process label
                switch(label2index(label))
                {
                case 1: break;
                case 2: break;
                case 3: break;
                case 4: break;
                case 5: break;
                case 6: break;
                case 7: break;
                case 8: break;
                case 9: break;
                case 10: break;
                case 11: break;
                case 12: break;
                case 13: break;
                        // to continue...
                default: break;

                }
        }

        return 0;
}