Cubiscan Emulator

Dependencies:   PinDetect TimeZone mbed

main.cpp

Committer:
arturojat
Date:
2016-07-28
Revision:
1:1f688b0fbdb0
Parent:
0:8c9252649f4f

File content as of revision 1:1f688b0fbdb0:

/**************************************************
 *           Cubiscan  Emulator                   *
 *                   Montra                       *
 * Author: Arturo Alvarado Troncoso               *
 * junio del 2016                                 *
 **************************************************/

#include "mbed.h"
#include "PinDetect.h"
#include "Time.h"
//Constants definition
#define STX  2
#define ETX  3
#define CR   13
#define LF   10

//Pc serial connection
Serial pc(USBTX,USBRX);
PinDetect measureBtn(PTD4);
PinDetect dimBtn(PTA12);
PinDetect wBtn(PTA4);
PinDetect ErrorBtn(PTA5);
//DIP SWITCH
DigitalIn Dip1(PTC13);//CubiScan 100L
DigitalIn Dip2(PTC12);//CubiScan 125
DigitalIn Dip3(PTC11);//CubiScan 150
DigitalIn Dip4(PTC10);//CubiScan 200TS protocol 1
DigitalIn Dip5(PTC6);//CubiScan 200TS protocol 2
DigitalIn Dip6(PTC5);
DigitalIn Dip7(PTC4);
DigitalIn Dip8(PTC3);

char dimUnitsValue = 'M';
char wUnitsValue = 'M';
char factor = 'D';//dom 166 int 139 lb 6000 iny 5000 kg
char id[7]="      ";
int MeasureNumber=0;
int ErrorNum =0;
//Funtions prototypes
int Cycle=0;
Ticker tick;
void dimensionCalibration(char* command);
char dimensionUnits(char* command);
char factorToggle(char* command);
void locationId(char* command);
void measure(char* command);
void scaleCalibration(char* command);
void test(char* command);
void units(char* command);
void values(char* command);
char weightUnits(char* command);
void zero(char* commmand);
void measureCom(void);
void measureCom2(void);
void measureCom2TS(void);
void itoa(int n,char s[]);
void printString(char * str);
void changeWUnits(void);
void changeDUnits(void);
void ErrorGen(void);
void measureCom2Cycle(void){
    if(Cycle == 0){
        Cycle=1;
        tick.attach(&measureCom2, 3.0);
    }
    else{
        Cycle=0;
        tick.detach();
    }

}
int main()
{

    time_t t;
    srand((unsigned) time(&t));
    char command[12];
    measureBtn.setSampleFrequency();
    dimBtn.setSampleFrequency();
    wBtn.setSampleFrequency();
    ErrorBtn.setSampleFrequency();

    while(1) {
        if((!Dip1)||(!Dip2)||(!Dip3)) {
            measureBtn.attach_asserted(&measureCom);
            wBtn.attach_asserted(&changeWUnits);
            dimBtn.attach_asserted(&changeDUnits);
            strcpy(command,"");
            fgets(command,12,stdin);
            if(command[0]==STX) {

                if(command[1]=='D') {
                    dimensionCalibration(command);
                }//end if
                else if(command[1]=='"') {
                    dimUnitsValue=dimensionUnits(command);
                }//end else if
                else if(command[1]=='F') {
                    factor =  factorToggle(command);
                }//end else if
                else if(command[1]=='L') {
                    locationId(command);
                }//end else if
                else if(command[1]=='M') {
                    measure(command);
                }//end else if
                else if(command[1]=='S') {
                    scaleCalibration(command);
                }//end else if
                else if(command[1]=='T') {
                    test(command);

                } else if(command[1]=='U') {
                    units(command);

                }//end if
                else if(command[1]=='V') {
                    values(command);

                }//end if
                else if(command[1]=='#') {
                    wUnitsValue= weightUnits(command);

                }//end if
                else if(command[1]=='Z') {
                    zero(command);

                }///end if

            }//end if

        }//end if
        else if(!Dip4) {
            measureBtn.attach_asserted(&measureCom2Cycle);
            wBtn.attach_asserted(&changeWUnits);
            dimBtn.attach_asserted(&changeDUnits);
            ErrorBtn.attach_asserted(&ErrorGen);
        } else if(!Dip5) {
            measureBtn.attach_asserted(&measureCom2TS);
            wBtn.attach_asserted(&changeWUnits);
            dimBtn.attach_asserted(&changeDUnits);
            ErrorBtn.attach_asserted(&ErrorGen);

        }
    }//end while
}//end main


/*********************************************************
*                                                        *
*                Command Functions                       *
*                                                        *
**********************************************************/
/*
*Dimension Calibration
*
*This function is required when one of the sensors is replaced or
*moved, when a new controller is intalled , or for routine calibration.
*This command causes the CubiScan to reply with a dimension calibratopn codea each time it s issued.
*This command must be issued SIX time to complete sensor calibration.
*/
void dimensionCalibration(char* command)
{
    char respond[9]= {' '};

    if(command[2]== ETX) {
        respond[0]= STX;
        respond[1]= 'D';
        respond[2]='A';
        respond[3]='0';
        respond[4]='0';
        respond[5]= ETX;
        respond[6]=CR;
        respond[7]=LF;
        respond[8]='\0';
    } else {
        respond[0]=STX;
        respond[1]='D';
        respond[2]='N';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';
    }
    printString(respond);
}//end dimensionCalibration


/*
*Dimension Units
*
*This command is used to set the dimension units to either English(inches)
*or metric (centimeters) mode.
*
*/
char dimensionUnits(char* command)
{
    char respond[7];
    char newUnits;
    if((command[3]== ETX)&&(command[4]== CR)&&(command[5]== LF)&&((command[2]=='M')||(command[2]=='E'))) {
        respond[0]=STX;
        respond[1]='"';
        respond[2]='A';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';
        newUnits = command[2];
    }//end if
    else {
        respond[0]=STX;
        respond[1]='"';
        respond[2]='N';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';
        newUnits = dimUnitsValue;
    }//end else

    printString(respond);
    return newUnits;
}//end dimensionUnits


/*
*Factor Toggle
*
*This command is used to set the dimensional factor to either
*domestic or international.
*/
char factorToggle(char* command)
{
    char respond[7];
    int newFactor;
    if((command[3]== ETX)&&(command[4]== CR)&&(command[5]== LF)&&((command[2]=='I')||(command[2]=='D'))) {
        respond[0]=STX;
        respond[1]='F';
        respond[2]='A';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';

        newFactor=command[2];

    }//end if
    else {
        respond[0]=STX;
        respond[1]='F';
        respond[2]='N';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';

        newFactor = factor;
    }//end else
    pc.puts(respond);
    return newFactor;

}//end factorToggle

/*
*Location Id/City Code
*
*This command is used to set the CubiScan location identification.
*This data is stored in permanent memory and need only be set once
*for each Cubiscan
*/
void locationId(char* command)
{
    char respond[7];
    if((command[8]== ETX)&&(command[9]== CR)&&(command[10]== LF)) {
        respond[0]=STX;
        respond[1]='L';
        respond[2]='A';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';

        id[0]=command[2];
        id[1]=command[3];
        id[2]=command[4];
        id[3]=command[5];
        id[4]=command[6];
        id[5]=command[7];

    }//end if
    else {
        respond[0]=STX;
        respond[1]='L';
        respond[2]='N';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';


    }//end else
    printString(respond);

}//end locationId

void measure(char*  command)
{
    char medidasCm[5][4]= {{'1','0','0','0'},{' ','9','8','2'},
        {' ',' ','8','3'},{' ','3','4','8'},
        {' ','7','6','4'}
    };
    char medidasIn[5][4]= {{' ','3','9','3'},{' ','3','8','6'},
        {' ',' ','3','3'},{' ','1','3','7'},
        {' ','3','0','0'}
    };
    char pesoLb[6][5]= {{'1','5','0','0','0'},{' ','7','9','1','5'},
        {' ','6','3','2','5'}
    };

    char pesoKg[3][5]= {{' ','6','8','0','3'},{' ','3','5','9','0'},
        {' ','2','8','6','8'}
    };

    char dimLbD[3][5]= {{' ','2','9','7','6'},{' ','1','0','4','0'},{' ',' ','8','0','9'}};
    char dimLbI[3][5]= {{' ','3','6','3','7'},{' ','1','3','2','2'},{' ',' ','9','9','2'}};

    char dimKgD[3][5]= {{' ','1','3','5','0'},{' ',' ','4','7','2'},{' ',' ','3','6','7'}};
    char dimKgI[3][5]= {{' ','1','6','5','0'},{' ',' ','6','0','0'},{' ',' ','4','5','0'}};
    int token = rand()%2;
    char respond[63]= {' '};
    if(command[2]==ETX) {
        respond[0]=STX;
        respond[1]='M';
        respond[2]='A';
        respond[3]='H';
        respond[4]=id[0];
        respond[5]=id[1];
        respond[6]=id[2];
        respond[7]=id[3];
        respond[8]=id[4];
        respond[9]=id[5];
        respond[10]=',';
        if(dimUnitsValue=='E') {
            respond[11]='L';
            respond[12]=medidasIn[token][0];
            respond[13]=medidasIn[token][1];
            respond[14]=medidasIn[token][2];
            respond[15]='.';
            respond[16]=medidasIn[token][3];
            respond[17]=',';
            respond[18]='W';
            respond[19]=medidasIn[token+1][0];
            respond[20]=medidasIn[token+1][1];
            respond[21]=medidasIn[token+1][2];
            respond[22]='.';
            respond[23]=medidasIn[token+1][3];
            respond[24]=',';
            respond[25]='H';
            respond[26]=medidasIn[token+2][0];
            respond[27]=medidasIn[token+2][1];
            respond[28]=medidasIn[token+2][2];
            respond[29]='.';
            respond[30]=medidasIn[token+2][3];
        } else {
            respond[11]='L';
            respond[12]=medidasCm[token][0];
            respond[13]=medidasCm[token][1];
            respond[14]=medidasCm[token][2];
            respond[15]='.';
            respond[16]=medidasCm[token][3];
            respond[17]=',';
            respond[18]='W';
            respond[19]=medidasCm[token+1][0];
            respond[20]=medidasCm[token+1][1];
            respond[21]=medidasCm[token+1][2];
            respond[22]='.';
            respond[23]=medidasCm[token+1][3];
            respond[24]=',';
            respond[25]='H';
            respond[26]=medidasCm[token+2][0];
            respond[27]=medidasCm[token+2][1];
            respond[28]=medidasCm[token+2][2];
            respond[29]='.';
            respond[30]=medidasCm[token+2][3];
        }
        if(wUnitsValue=='E') {
            respond[31]=',';
            respond[32]=dimUnitsValue;
            respond[33]=',';
            respond[34]='K';
            respond[35]=pesoLb[token][0];
            respond[36]=pesoLb[token][1];
            respond[37]=pesoLb[token][2];
            respond[38]='.';
            respond[39]=pesoLb[token][3];
            respond[40]=pesoLb[token][4];
            respond[41]=',';
            if(factor=='D') {
                respond[42]='D';
                respond[43]=dimLbD[token][0];
                respond[44]=dimLbD[token][1];
                respond[45]=dimLbD[token][2];
                respond[46]='.';
                respond[47]=dimLbD[token][3];
                respond[48]=dimLbD[token][4];
                respond[49]=',';
                respond[50]=wUnitsValue;
                respond[51]=',';
                respond[52]='F';
                respond[53]=' ';
                respond[54]='1';
                respond[55]='6';
                respond[56]='6';
                respond[57]=',';
            } else {
                respond[42]='D';
                respond[43]=dimLbI[token][0];
                respond[44]=dimLbI[token][1];
                respond[45]=dimLbI[token][2];
                respond[46]='.';
                respond[47]=dimLbI[token][3];
                respond[48]=dimLbI[token][4];
                respond[49]=',';
                respond[50]=wUnitsValue;
                respond[51]=',';
                respond[52]='F';
                respond[53]=' ';
                respond[54]='1';
                respond[55]='3';
                respond[56]='9';
                respond[57]=',';
            }
        } else {
            respond[31]=',';
            respond[32]=dimUnitsValue;
            respond[33]=',';
            respond[34]='K';
            respond[35]=pesoKg[token][0];
            respond[36]=pesoKg[token][1];
            respond[37]=pesoKg[token][2];
            respond[38]='.';
            respond[39]=pesoKg[token][3];
            respond[40]=pesoKg[token][4];
            respond[41]=',';
            if(factor=='D') {
                respond[42]='D';
                respond[43]=dimKgD[token][0];
                respond[44]=dimKgD[token][1];
                respond[45]=dimKgD[token][2];
                respond[46]='.';
                respond[47]=dimKgD[token][3];
                respond[48]=dimKgD[token][4];
                respond[49]=',';
                respond[50]=wUnitsValue;
                respond[51]=',';
                respond[52]='F';
                respond[53]='6';
                respond[54]='0';
                respond[55]='0';
                respond[56]='0';
                respond[57]=',';
            } else {
                respond[42]='D';
                respond[43]=dimKgI[token][0];
                respond[44]=dimKgI[token][1];
                respond[45]=dimKgI[token][2];
                respond[46]='.';
                respond[47]=dimKgI[token][3];
                respond[48]=dimKgI[token][4];
                respond[49]=',';
                respond[50]=wUnitsValue;
                respond[51]=',';
                respond[52]='F';
                respond[53]='5';
                respond[54]='0';
                respond[55]='0';
                respond[56]='0';
                respond[57]=',';
            }
        }
        respond[58]=factor;
        respond[59]=ETX;
        respond[60]=CR;
        respond[61]=LF;
        respond[62]='\0';
    }//end if
    else {
        respond[0] = STX;
        respond[1] = 'M';
        respond[2] = 'N';
        respond[3] = 'H';
        respond[4] = 'M';
        respond[5] = ETX;
        respond[6] = CR;
        respond[7] = LF;
        respond[8] = '\0';
    }//end else
    printString(respond);
}//end measure


/*
*Scale Calibration
*
*This fuction is requiered when the load cell s replaced,
*when a new controller is installed, or for routine calibration.
*This command causes the CubiScan to reply with a scale calibration code.
*This command must be issued THREE times to complete scale calibration.
*/
void scaleCalibration(char* command)
{
    char respond[8];
    if((command[2]== ETX)&&(command[3]== CR)&&(command[4]== LF)) {
        respond[0]=STX;
        respond[1]='S';
        respond[2]='A';
        respond[3]='0';
        respond[4]='0';
        respond[5]= ETX;
        respond[6]=CR;
        respond[7]=LF;
    } else {
        respond[0]=STX;
        respond[1]='S';
        respond[2]='N';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
    }
    printString(respond);
}//end scaleCalibration

/*
*Test
*
*This command couses the CubiScan to reply with an error code.
*A response of TA00 means that the CubiScan is ready and responding t transmission from the host.
*if the host recieves no response from the contro unit after sendingg this command,
*an error condition exists in the communications etween the host and the controller.
*/
void test(char* command)
{
    char respond[9];
    if((command[2]== ETX)&&(command[3]== CR)&&(command[4]== LF)) {
        respond[0]=STX;
        respond[1]='T';
        respond[2]='A';
        respond[3]='0';
        respond[4]='0';
        respond[5]= ETX;
        respond[6]=CR;
        respond[7]=LF;
        respond[8]='\0';
    } else {
        respond[0]=STX;
        respond[1]='T';
        respond[2]='N';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';
    }
    //pc.puts(respond);
    printString(respond);
}//end test



/*
*Units
*
*This command causes the CubiScan to repot its
*current modes of operation.
*/
void units(char* command)
{
    char respond[20];
    if((command[2]== ETX)&&(command[3]== CR)&&(command[4]== LF)) {
        if(factor=='D') {
            respond[0]=STX;
            respond[1]='U';
            respond[2]='A';
            respond[3]=dimUnitsValue;
            respond[4]=wUnitsValue;
            respond[5]='D';
            respond[6]=' ';
            respond[7]='1';
            respond[8]='6';
            respond[9]='6';
            respond[10]=id[0];
            respond[11]=id[1];
            respond[12]=id[2];
            respond[13]=id[3];
            respond[14]=id[4];
            respond[15]=id[5];
            respond[16]=ETX;
            respond[17]=CR;
            respond[18]=LF;
            respond[19]='\0';
        } else {
            respond[0]=STX;
            respond[1]='U';
            respond[2]='A';
            respond[3]=dimUnitsValue;
            respond[4]=wUnitsValue;
            respond[5]='I';
            respond[6]=' ';
            respond[7]='1';
            respond[8]='3';
            respond[9]='9';
            respond[10]=id[0];
            respond[11]=id[1];
            respond[12]=id[2];
            respond[13]=id[3];
            respond[14]=id[4];
            respond[15]=id[5];
            respond[16]=ETX;
            respond[17]=CR;
            respond[18]=LF;
            respond[19]='\0';

        }
    } else {
        respond[0]=STX;
        respond[1]='U';
        respond[2]='N';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';
    }
    printString(respond);
}//end units

/**
*Values
*
*This command causes the CubiScan to report all of itrs internal
*paraneters. This is useful for troubleshooting.
*/
void values(char* command)
{
    char respond[157];
    if((command[2]== ETX)&&(command[3]== CR)&&(command[4]== LF)) {
        respond[0]=STX;
        respond[1]='V';
        respond[2]='A';
        respond[3]='0';
        respond[4]='0';
        respond[5]='.';
        respond[6]='0';
        respond[7]=',';
        respond[8]='0';
        respond[9]='0';
        respond[10]='.';
        respond[11]='0';
        respond[12]=',';
        respond[13]='0';
        respond[14]='0';
        respond[15]='.';
        respond[16]='0';
        respond[17]=',';
        respond[18]='0';
        respond[19]='0';
        respond[20]='.';
        respond[21]='0';
        respond[22]=',';
        respond[23]='0';
        respond[24]='0';
        respond[25]='0';
        respond[26]='0';
        respond[27]=',';
        respond[28]='0';
        respond[29]='0';
        respond[30]='0';
        respond[31]='0';
        respond[32]=',';
        respond[33]='0';
        respond[34]='0';
        respond[35]='0';
        respond[36]='0';
        respond[37]=',';
        respond[38]='0';
        respond[39]='0';
        respond[40]='0';
        respond[41]='0';
        respond[42]=',';
        respond[43]='0';
        respond[44]='0';
        respond[45]='.';
        respond[46]='0';
        respond[47]=',';
        respond[48]='0';
        respond[49]='0';
        respond[50]='.';
        respond[51]='0';
        respond[52]=',';
        respond[53]='0';
        respond[54]='0';
        respond[55]='.';
        respond[56]='0';
        respond[57]=',';
        respond[58]='0';
        respond[59]='0';
        respond[60]='.';
        respond[61]='0';
        respond[62]=',';
        respond[63]='0';
        respond[64]='0';
        respond[65]='.';
        respond[66]='0';
        respond[67]=',';
        respond[68]='0';
        respond[69]='0';
        respond[70]='.';
        respond[71]='0';
        respond[72]=',';
        respond[73]='0';
        respond[74]='0';
        respond[75]='.';
        respond[76]='0';
        respond[77]=',';
        respond[78]='0';
        respond[79]='0';
        respond[80]='.';
        respond[81]='0';
        respond[82]=',';
        respond[83]='0';
        respond[84]='0';
        respond[85]=',';
        respond[86]='0';
        respond[87]='0';
        respond[88]=',';
        respond[89]='0';
        respond[90]='0';
        respond[91]=',';
        respond[92]='0';
        respond[93]='0';
        respond[94]=',';
        respond[95]='0';
        respond[96]='0';
        respond[97]='0';
        respond[98]=',';
        respond[99]='0';
        respond[100]='0';
        respond[101]='0';
        respond[102]=',';
        respond[103]='0';
        respond[104]='0';
        respond[105]='0';
        respond[106]=',';
        respond[107]='0';
        respond[108]='0';
        respond[109]='0';
        respond[110]=',';
        respond[111]='1';
        respond[112]='0';
        respond[113]='0';
        respond[114]='L';
        respond[115]=',';
        respond[116]='1';
        respond[117]='0';
        respond[118]='0';
        respond[119]=',';
        respond[120]='1';
        respond[121]='.';
        respond[122]='0';
        respond[123]='0';
        respond[124]='0';
        respond[125]=' ';
        respond[126]=' ';
        respond[127]=' ';
        respond[128]=' ';
        respond[129]=' ';
        respond[130]=' ';
        respond[131]=' ';
        respond[132]=' ';
        respond[133]=' ';
        respond[134]=' ';
        respond[135]=' ';
        respond[136]=' ';
        respond[137]=' ';
        respond[138]=' ';
        respond[139]=' ';
        respond[140]=' ';
        respond[141]=' ';
        respond[142]=' ';
        respond[143]=' ';
        respond[144]=' ';
        respond[145]=' ';
        respond[146]=' ';
        respond[147]=' ';
        respond[148]=' ';
        respond[149]=' ';
        respond[150]=' ';
        respond[151]=' ';
        respond[152]=' ';
        respond[153]=ETX;
        respond[154]=CR;
        respond[155]=LF;
        respond[156]='\0';

    } else {
        respond[0]=STX;
        respond[1]='V';
        respond[2]='N';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';
    }
    printString(respond);

}//end values


/**
*Weight Units
*
*This command is used to set the weight units to either English
*(pounds) or metric (kilograms) mode.
*
*/
char weightUnits(char* command)
{
    char respond[7];
    char newUnits;
    if((command[3]== ETX)&&(command[4]== CR)&&(command[5]== LF)&&((command[2]=='M')||(command[2]=='E'))) {
        respond[0]=STX;
        respond[1]='#';
        respond[2]='A';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';
        newUnits = command[2];
    }//end if
    else {
        respond[0]=STX;
        respond[1]='#';
        respond[2]='N';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';
        newUnits = wUnitsValue;
    }//end else
    printString(respond);
    return newUnits;
}//end weightUnits


/*
*Zero
*
*This command should be issued periodically to force the CubiScan
*to perform interal compensations to adjust to changes in temperature
*and humidity. This command should onlu be issued when the measuring field is free of packages.
*Never issue this command when a pacage is present in the measuring field.
*
*/

void zero(char* command)
{
    char respond[7];
    if((command[2]== ETX)&&(command[3]== CR)&&(command[4]== LF)) {
        respond[0]=STX;
        respond[1]='Z';
        respond[2]='A';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';
    }//end if
    else {
        respond[0]=STX;
        respond[1]='Z';
        respond[2]='N';
        respond[3]=ETX;
        respond[4]=CR;
        respond[5]=LF;
        respond[6]='\0';
    }//end else
    printString(respond);
}//end zero

void printString(char * str)
{
    printf("%s",str );
}//end printString


void measureCom()
{
    char medidasCm[5][4]= {{'1','0','0','0'},{' ','9','8','2'},
        {' ',' ','8','3'},{' ','3','4','8'},
        {' ','7','6','4'}
    };
    char medidasIn[5][4]= {{' ','3','9','3'},{' ','3','8','6'},
        {' ',' ','3','3'},{' ','1','3','7'},
        {' ','3','0','0'}
    };
    char pesoLb[6][5]= {{'1','5','0','0','0'},{' ','7','9','1','5'},
        {' ','6','3','2','5'}
    };

    char pesoKg[3][5]= {{' ','6','8','0','3'},{' ','3','5','9','0'},
        {' ','2','8','6','8'}
    };

    char dimLbD[3][5]= {{' ','2','9','7','6'},{' ','1','0','4','0'},{' ',' ','8','0','9'}};
    char dimLbI[3][5]= {{' ','3','6','3','7'},{' ','1','3','2','2'},{' ',' ','9','9','2'}};

    char dimKgD[3][5]= {{' ','1','3','5','0'},{' ',' ','4','7','2'},{' ',' ','3','6','7'}};
    char dimKgI[3][5]= {{' ','1','6','5','0'},{' ',' ','6','0','0'},{' ',' ','4','5','0'}};
    int token = rand()%2;
    char respond[63]= {' '};
    respond[0]=STX;
    respond[1]='M';
    respond[2]='A';
    respond[3]='H';
    respond[4]=id[0];
    respond[5]=id[1];
    respond[6]=id[2];
    respond[7]=id[3];
    respond[8]=id[4];
    respond[9]=id[5];
    respond[10]=',';
    if(dimUnitsValue=='E') {
        respond[11]='L';
        respond[12]=medidasIn[token][0];
        respond[13]=medidasIn[token][1];
        respond[14]=medidasIn[token][2];
        respond[15]='.';
        respond[16]=medidasIn[token][3];
        respond[17]=',';
        respond[18]='W';
        respond[19]=medidasIn[token+1][0];
        respond[20]=medidasIn[token+1][1];
        respond[21]=medidasIn[token+1][2];
        respond[22]='.';
        respond[23]=medidasIn[token+1][3];
        respond[24]=',';
        respond[25]='H';
        respond[26]=medidasIn[token+2][0];
        respond[27]=medidasIn[token+2][1];
        respond[28]=medidasIn[token+2][2];
        respond[29]='.';
        respond[30]=medidasIn[token+2][3];
    } else {
        respond[11]='L';
        respond[12]=medidasCm[token][0];
        respond[13]=medidasCm[token][1];
        respond[14]=medidasCm[token][2];
        respond[15]='.';
        respond[16]=medidasCm[token][3];
        respond[17]=',';
        respond[18]='W';
        respond[19]=medidasCm[token+1][0];
        respond[20]=medidasCm[token+1][1];
        respond[21]=medidasCm[token+1][2];
        respond[22]='.';
        respond[23]=medidasCm[token+1][3];
        respond[24]=',';
        respond[25]='H';
        respond[26]=medidasCm[token+2][0];
        respond[27]=medidasCm[token+2][1];
        respond[28]=medidasCm[token+2][2];
        respond[29]='.';
        respond[30]=medidasCm[token+2][3];
    }
    if(wUnitsValue=='E') {
        respond[31]=',';
        respond[32]=dimUnitsValue;
        respond[33]=',';
        respond[34]='K';
        respond[35]=pesoLb[token][0];
        respond[36]=pesoLb[token][1];
        respond[37]=pesoLb[token][2];
        respond[38]='.';
        respond[39]=pesoLb[token][3];
        respond[40]=pesoLb[token][4];
        respond[41]=',';
        if(factor=='D') {
            respond[42]='D';
            respond[43]=dimLbD[token][0];
            respond[44]=dimLbD[token][1];
            respond[45]=dimLbD[token][2];
            respond[46]='.';
            respond[47]=dimLbD[token][3];
            respond[48]=dimLbD[token][4];
            respond[49]=',';
            respond[50]=wUnitsValue;
            respond[51]=',';
            respond[52]='F';
            respond[53]=' ';
            respond[54]='1';
            respond[55]='6';
            respond[56]='6';
            respond[57]=',';
        } else {
            respond[42]='D';
            respond[43]=dimLbI[token][0];
            respond[44]=dimLbI[token][1];
            respond[45]=dimLbI[token][2];
            respond[46]='.';
            respond[47]=dimLbI[token][3];
            respond[48]=dimLbI[token][4];
            respond[49]=',';
            respond[50]=wUnitsValue;
            respond[51]=',';
            respond[52]='F';
            respond[53]=' ';
            respond[54]='1';
            respond[55]='3';
            respond[56]='9';
            respond[57]=',';
        }
    } else {
        respond[31]=',';
        respond[32]=dimUnitsValue;
        respond[33]=',';
        respond[34]='K';
        respond[35]=pesoKg[token][0];
        respond[36]=pesoKg[token][1];
        respond[37]=pesoKg[token][2];
        respond[38]='.';
        respond[39]=pesoKg[token][3];
        respond[40]=pesoKg[token][4];
        respond[41]=',';
        if(factor=='D') {
            respond[42]='D';
            respond[43]=dimKgD[token][0];
            respond[44]=dimKgD[token][1];
            respond[45]=dimKgD[token][2];
            respond[46]='.';
            respond[47]=dimKgD[token][3];
            respond[48]=dimKgD[token][4];
            respond[49]=',';
            respond[50]=wUnitsValue;
            respond[51]=',';
            respond[52]='F';
            respond[53]='6';
            respond[54]='0';
            respond[55]='0';
            respond[56]='0';
            respond[57]=',';
        } else {
            respond[42]='D';
            respond[43]=dimKgI[token][0];
            respond[44]=dimKgI[token][1];
            respond[45]=dimKgI[token][2];
            respond[46]='.';
            respond[47]=dimKgI[token][3];
            respond[48]=dimKgI[token][4];
            respond[49]=',';
            respond[50]=wUnitsValue;
            respond[51]=',';
            respond[52]='F';
            respond[53]='5';
            respond[54]='0';
            respond[55]='0';
            respond[56]='0';
            respond[57]=',';
        }
    }
    respond[58]=factor;
    respond[59]=ETX;
    respond[60]=CR;
    respond[61]=LF;
    respond[62]='\0';


    printString(respond);
}//end measureCom

void measureCom2()
{
    // pc.printf("Entro");
    Timer tim;
    char measureNum[5]= {' ',' ',' ',' '};
    char measureNumGap[5]= {' ',' ',' ',' '};
    char medidasCm[5][4]= {{'1','0','0','0'},{' ','9','8','2'},
        {' ',' ','8','3'},{' ','3','4','8'},
        {' ','7','6','4'}
    };
    char medidasIn[5][4]= {{' ','3','9','3'},{' ','3','8','6'},
        {' ',' ','3','3'},{' ','1','3','7'},
        {' ','3','0','0'}
    };
    char pesoLb[6][5]= {{'1','5','0','0','0'},{' ','7','9','1','5'},
        {' ','6','3','2','5'}
    };

    char pesoKg[3][5]= {{' ','6','8','0','3'},{' ','3','5','9','0'},
        {' ','2','8','6','8'}
    };
    int token = rand()%2;
    int token2 =  rand()%3;
    int token3 = rand()%2;
    
    char respond[80]= {' '};
    respond[0]=STX;
    respond[1]='B';
    respond[2]='A';
    itoa(MeasureNumber,measureNum);
    respond[3]=measureNum[3];
    respond[4]=measureNum[2];
    respond[5]=measureNum[1];
    respond[6]=measureNum[0];
    respond[7]=ETX;
    respond[8]=CR;
    respond[9]=LF;
    respond[10]='\0';

    printString(respond);

    wait(2);

    strcpy(respond,"");
    itoa(MeasureNumber+1,measureNumGap);
    respond[0]=STX;
    respond[1]='G';
    respond[2]='A';
    respond[3]=measureNumGap[3];
    respond[4]=measureNumGap[2];
    respond[5]=measureNumGap[1];
    respond[6]=measureNumGap[0];
    respond[7]=ETX;
    respond[8]=CR;
    respond[9]=LF;
    respond[10]='\0';

    printString(respond);
    strcpy(respond,"");

    respond[0]=STX;
    respond[1]='M';
    respond[2]='A';
    respond[3]=measureNum[3];
    respond[4]=measureNum[2];
    respond[5]=measureNum[1];
    respond[6]=measureNum[0];
    respond[7]=',';
    respond[8]=id[0];
    respond[9]=id[1];
    respond[10]=id[2];
    respond[11]=id[3];
    respond[12]=id[4];
    respond[13]=id[5];
    respond[14]=',';
    if(dimUnitsValue=='E') {
        respond[15]='L';
        respond[16]=medidasIn[token][0];
        respond[17]=medidasIn[token][1];
        respond[18]=medidasIn[token][2];
        respond[19]='.';
        respond[20]=medidasIn[token][3];
        respond[21]=',';
        respond[22]='0';
        respond[23]='0';
        respond[24]=',';
        respond[25]='W';
        respond[26]=medidasIn[token+1][0];
        respond[27]=medidasIn[token+1][1];
        respond[28]=medidasIn[token+1][2];
        respond[29]='.';
        respond[30]=medidasIn[token+1][3];
        respond[31]=',';
        respond[32]='0';
        respond[33]='0';
        respond[34]=',';
        respond[35]='H';
        respond[36]=medidasIn[token+2][0];
        respond[37]=medidasIn[token+2][1];
        respond[38]=medidasIn[token+2][2];
        respond[39]='.';
        respond[40]=medidasIn[token+2][3];
        respond[41]=',';
        respond[42]='0';
        respond[43]='0';
        respond[44]=',';
        respond[45]='i';
        respond[46]='n';
        respond[47]=',';
    } else {
        respond[15]='L';
        respond[16]=medidasCm[token][0];
        respond[17]=medidasCm[token][1];
        respond[18]=medidasCm[token][2];
        respond[19]='.';
        respond[20]=medidasCm[token][3];
        respond[21]=',';
        respond[22]='0';
        respond[23]='0';
        respond[24]=',';
        respond[25]='W';
        respond[26]=medidasCm[token+1][0];
        respond[27]=medidasCm[token+1][1];
        respond[28]=medidasCm[token+1][2];
        respond[29]='.';
        respond[30]=medidasCm[token+1][3];
        respond[31]=',';
        respond[32]='0';
        respond[33]='0';
        respond[34]=',';
        respond[35]='H';
        respond[36]=medidasCm[token+2][0];
        respond[37]=medidasCm[token+2][1];
        respond[38]=medidasCm[token+2][2];
        respond[39]='.';
        respond[40]=medidasCm[token+2][3];
        respond[41]=',';
        respond[42]='0';
        respond[43]='0';
        respond[44]=',';
        respond[45]='c';
        respond[46]='m';
        respond[47]=',';
    }
    if(wUnitsValue=='E') {
        respond[48]='M';
        respond[49]=pesoLb[token][0];
        respond[50]=pesoLb[token][1];
        respond[51]=pesoLb[token][2];
        respond[52]='.';
        respond[53]=pesoLb[token][3];
        respond[54]=',';
        respond[55]='0';
        respond[56]='0';
        respond[57]=',';
        respond[58]='l';
        respond[59]='b';
        respond[60]=',';

    } else {

        respond[48]='M';
        respond[49]=pesoKg[token][0];
        respond[50]=pesoKg[token][1];
        respond[51]=pesoKg[token][2];
        respond[52]='.';
        respond[53]=pesoKg[token][3];
        respond[54]=',';
        respond[55]='0';
        respond[56]='0';
        respond[57]=',';
        respond[58]='k';
        respond[59]='g';
        respond[60]=',';
    }

    respond[61]='1';
    respond[62]='2';
    respond[63]='/';
    respond[64]='3';
    respond[65]='1';
    respond[66]='/';
    respond[67]='1';
    respond[68]='6';
    respond[69]=',';
    respond[70]='1';
    respond[71]='2';
    respond[72]=':';
    respond[73]='5';
    respond[74]='9';
    respond[75]='A';
    respond[76]=ETX;
    respond[77]=CR;
    respond[78]=LF;
    respond[79]='\0';
    wait_ms(120);
    if(ErrorNum==1) {
        if(token2==0) {
            respond[16]=' ';
            respond[17]=' ';
            respond[18]='0';
            respond[19]='.';
            respond[20]='0';
            respond[21]=',';
            if(token3==0) {
                respond[22]='0';
                respond[23]='1';
            } else {
                respond[22]='1';
                respond[23]='1';
            }
        } else if(token2==1) {
            respond[26]=' ';
            respond[27]=' ';
            respond[28]='0';
            respond[29]='.';
            respond[30]='0';
            respond[31]=',';
            if(token3==0) {
                respond[32]='0';
                respond[33]='1';
            } else {
                respond[32]='1';
                respond[33]='1';
            }
        } else {
            respond[36]=' ';
            respond[37]=' ';
            respond[38]='0';
            respond[39]='.';
            respond[40]='0';
            respond[41]=',';
            if(token3==0) {
                respond[42]='0';
                respond[43]='1';
            } else {
                respond[42]='1';
                respond[43]='1';
            }
        }
    } else if(ErrorNum==2) {
        respond[49]=' ';
        respond[50]=' ';
        respond[51]='0';
        respond[52]='.';
        respond[53]='0';
        respond[54]=',';
        if(token3==0) {

            respond[55]='0';
            respond[56]='1';
        } else {
            respond[55]='1';
            respond[56]='1';
        }
    }
    printString(respond);
    MeasureNumber++;
}
/* itoa:  convert n to characters in s */
void measureCom2TS(void)
{

    char measureNum[5]= {' ',' ',' ',' '};

    char medidasCm[5][4]= {{'1','0','0','0'},{' ','9','8','2'},
        {' ',' ','8','3'},{' ','3','4','8'},
        {' ','7','6','4'}
    };
    char medidasIn[5][4]= {{' ','3','9','3'},{' ','3','8','6'},
        {' ',' ','3','3'},{' ','1','3','7'},
        {' ','3','0','0'}
    };
    char pesoLb[6][5]= {{' ','1','5','0','0'},{' ',' ','7','9','5'},
        {' ',' ','6','3','5'}
    };

    char pesoKg[3][5]= {{' ',' ','8','0','3'},{' ',' ','5','9','0'},
        {' ',' ','8','6','8'}
    };
    int token = rand()%2;
    int token2 =  rand()%3;
    int token3 = rand()%2;

    char respond[55]= {' '};
    char respond1[7]= {' '};
    respond1[0]=STX;
    respond1[1]='B';
    respond1[2]='A';
    respond1[3]='1';
    respond1[4]='1';
    respond1[5]=ETX;
    respond1[6]='\0';

    //  printString(respond);
    // fputs(respond,stdout);
    strcpy(respond,"");
    itoa(MeasureNumber,measureNum);
    respond[0]=STX;
    respond[1]='A';
    respond[2]=measureNum[3];
    respond[3]=measureNum[2];
    respond[4]=measureNum[1];
    respond[5]=measureNum[0];
    respond[6]='0';
    respond[7]='0';
    if(dimUnitsValue=='E') {
        respond[8]='L';
        respond[9]=medidasIn[token][0];
        respond[10]=medidasIn[token][1];
        respond[11]=medidasIn[token][2];
        respond[12]='.';
        respond[13]=medidasIn[token][3];
        respond[14]='i';
        respond[15]='n';
        respond[16]='0';
        respond[17]='0';
        respond[18]='W';
        respond[19]=medidasIn[token+1][0];
        respond[20]=medidasIn[token+1][1];
        respond[21]=medidasIn[token+1][2];
        respond[22]='.';
        respond[23]=medidasIn[token+1][3];
        respond[24]='i';
        respond[25]='n';
        respond[26]='0';
        respond[27]='0';
        respond[28]='H';
        respond[29]=medidasIn[token+2][0];
        respond[30]=medidasIn[token+2][1];
        respond[31]=medidasIn[token+2][2];
        respond[32]='.';
        respond[33]=medidasIn[token+2][3];
        respond[34]='i';
        respond[35]='n';
        respond[36]='0';
        respond[37]='0';
    } else {
        respond[8]='L';
        respond[9]=medidasCm[token][0];
        respond[10]=medidasCm[token][1];
        respond[11]=medidasCm[token][2];
        respond[12]='.';
        respond[13]=medidasCm[token][3];
        respond[14]='c';
        respond[15]='m';
        respond[16]='0';
        respond[17]='0';
        respond[18]='W';
        respond[19]=medidasCm[token+1][0];
        respond[20]=medidasCm[token+1][1];
        respond[21]=medidasCm[token+1][2];
        respond[22]='.';
        respond[23]=medidasCm[token+1][3];
        respond[24]='c';
        respond[25]='m';
        respond[26]='0';
        respond[27]='0';
        respond[28]='H';
        respond[29]=medidasCm[token+2][0];
        respond[30]=medidasCm[token+2][1];
        respond[31]=medidasCm[token+2][2];
        respond[32]='.';
        respond[33]=medidasCm[token+2][3];
        respond[34]='c';
        respond[35]='m';
        respond[36]='0';
        respond[37]='0';
    }
    if(wUnitsValue=='E') {
        respond[38]='M';
        respond[39]=pesoLb[token][0];
        respond[40]=pesoLb[token][1];
        respond[41]=pesoLb[token][2];
        respond[42]=pesoLb[token][3];
        respond[43]='.';
        respond[44]=pesoLb[token][4];
        respond[45]='l';
        respond[46]='b';
        respond[47]='0';
        respond[48]='0';


    } else {
        respond[38]='M';
        respond[39]=pesoKg[token][0];
        respond[40]=pesoKg[token][1];
        respond[41]=pesoKg[token][2];
        respond[42]=pesoKg[token][3];
        respond[43]='.';
        respond[44]=pesoLb[token][4];
        respond[45]='k';
        respond[46]='g';
        respond[47]='0';
        respond[48]='0';

    }

    respond[49]='0';
    respond[50]='0';
    respond[51]=ETX;
    //respond[52]=CR;
    //respond[53]=LF;
    respond[52]='\0';

    wait_ms(200);

    if(ErrorNum==1) {
        if(token2==0) {
            respond[9]=' ';
            respond[10]=' ';
            respond[11]='0';
            respond[12]='.';
            respond[13]='0';
            if(token3==0) {
                respond[16]='1';
                respond[17]='3';
            } else {
                respond[16]='1';
                respond[17]='2';
            }
        } else if(token2==1) {
            respond[19]=' ';
            respond[20]=' ';
            respond[21]='0';
            respond[22]='.';
            respond[23]='0';
            if(token3==0) {
                respond[26]='1';
                respond[27]='3';
            } else {
                respond[26]='1';
                respond[27]='2';
            }
        } else {
            respond[29]=' ';
            respond[30]=' ';
            respond[31]='0';
            respond[32]='.';
            respond[33]='0';
            if(token3==0) {
                respond[36]='1';
                respond[37]='3';
            } else {
                respond[36]='1';
                respond[37]='2';
            }
        }
    } else if(ErrorNum==2) {
        respond[39]=' ';
        respond[40]=' ';
        respond[41]=' ';
        respond[42]='0';
        respond[43]='.';
        respond[44]='0';
        if(token3==0) {

            respond[47]='1';
            respond[48]='2';
        } else {
            respond[47]='1';
            respond[48]='3';
        }
    }
    pc.printf("%s%s",respond1,respond);
    //printString(respond);
    MeasureNumber++;
}//end measureCom2TS
void itoa(int n, char s[])
{
    int i;
    i=n;
    s[0]=i%10+'0';
    i-=i%10;

    s[1]=(i%100)/10+'0';
    i-=i%100;

    s[2]=(i%1000)/100+'0';
    i-=i%1000;

    s[3]=(i%10000)/1000+'0';

    s[4]='\0';

}

void changeWUnits(void)
{

    if(wUnitsValue=='E') {
        wUnitsValue='M';
        // pc.printf("Weight units set to Metric.\n\r");

    } else {
        wUnitsValue='E';
        //pc.printf("Weight units set to English.\n\r");

    }
}


void changeDUnits(void)
{
    if(dimUnitsValue=='E') {
        dimUnitsValue='M';
        //pc.printf("Dimension units set to Metric.\n\r");

    } else {
        dimUnitsValue='E';
        //pc.printf("Dimension units set to English.\n\r");

    }
}
void ErrorGen(void)
{
    if(ErrorNum<2) {
        ErrorNum++;
    } else {
        ErrorNum=0;
    }
}