AguilaBoard program. No library.

Dependencies:   mbed-rtos mbed

Fork of PYL_v6 by Jonathan Moreno

Committer:
jmoreno10
Date:
Wed Jun 27 22:01:51 2018 +0000
Revision:
3:5d959275ac05
Parent:
2:a79ceae53e04
Child:
4:4e90dab088f1
Child:
5:c52a2d06bd93
PYL

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sumobot 0:88a700f174a3 1 #include "mbed.h" //Se declara la librería mbed.
Sumobot 0:88a700f174a3 2 #include "rtos.h"
Sumobot 0:88a700f174a3 3
jmoreno10 3:5d959275ac05 4 I2CSlave slave(p9, p10);
Sumobot 0:88a700f174a3 5 DigitalOut led1(LED1);
Sumobot 0:88a700f174a3 6 DigitalOut led2(LED2);
Sumobot 0:88a700f174a3 7 DigitalOut led3(LED3);
Sumobot 0:88a700f174a3 8 DigitalOut led4(LED4);
Sumobot 0:88a700f174a3 9 Serial pc(USBTX, USBRX, 9600); // tx, rx Conunicación Serial con la PC
JCON 2:a79ceae53e04 10 DigitalIn CTS(p7, PullUp); // Pin Digital de entrada "CTS" en modo Pull-Up, para encontrarse normalmente a VCC cuando no haya un pulso.
JCON 2:a79ceae53e04 11 DigitalOut RTS(p8, 1); // Pin Digital de Salida "RTS"; Predefinido para valer 1 en su estado inactivo dentro del código.
jmoreno10 3:5d959275ac05 12 Serial stingr(p13, p14, 9600); // tx, rx Comunicación Serial con el Módulo STX3
Sumobot 0:88a700f174a3 13 int flag=1; // Declaración de la Bandera.
JCON 2:a79ceae53e04 14 int incomingByte=0;
Sumobot 0:88a700f174a3 15 Thread thread;
jmoreno10 3:5d959275ac05 16 int packet[15]; //int or char
jmoreno10 3:5d959275ac05 17 int num = 0;
Sumobot 0:88a700f174a3 18
jmoreno10 3:5d959275ac05 19 void clearPacket();
jmoreno10 3:5d959275ac05 20 void printPacket();
jmoreno10 3:5d959275ac05 21 void respuesta();
jmoreno10 3:5d959275ac05 22 void waitCTS();
jmoreno10 3:5d959275ac05 23 void postCommand();
jmoreno10 3:5d959275ac05 24
jmoreno10 3:5d959275ac05 25 bool queryESN();
jmoreno10 3:5d959275ac05 26 bool abortTransmission();
jmoreno10 3:5d959275ac05 27 bool queryFirmware();
jmoreno10 3:5d959275ac05 28 int queryBursts();
jmoreno10 3:5d959275ac05 29 long int querySetup();
jmoreno10 3:5d959275ac05 30 bool sendData(char* s);
jmoreno10 3:5d959275ac05 31 void _setup();
jmoreno10 3:5d959275ac05 32 void queryHardware();
jmoreno10 3:5d959275ac05 33 void NAKcommand();
jmoreno10 3:5d959275ac05 34 uint16_t ModRTU_CRC(char * buf, int len);
jmoreno10 3:5d959275ac05 35 void combine(char* s, char c);
jmoreno10 3:5d959275ac05 36
jmoreno10 3:5d959275ac05 37 int main()
jmoreno10 3:5d959275ac05 38 {
jmoreno10 3:5d959275ac05 39 //i2c variables
jmoreno10 3:5d959275ac05 40 slave.frequency(400000);
jmoreno10 3:5d959275ac05 41 char buf[200];
jmoreno10 3:5d959275ac05 42 char msg[200];
jmoreno10 3:5d959275ac05 43 slave.address(0x1E);
jmoreno10 3:5d959275ac05 44
jmoreno10 3:5d959275ac05 45 int bursts = 0;
jmoreno10 3:5d959275ac05 46 int long numSetup = 0;
jmoreno10 3:5d959275ac05 47 thread.start(respuesta);
jmoreno10 3:5d959275ac05 48
jmoreno10 3:5d959275ac05 49 while(1)
jmoreno10 3:5d959275ac05 50 {
jmoreno10 3:5d959275ac05 51 int i = slave.receive();
jmoreno10 3:5d959275ac05 52
jmoreno10 3:5d959275ac05 53 switch(i)
jmoreno10 3:5d959275ac05 54 {
jmoreno10 3:5d959275ac05 55 // WRITING RESPONSES
jmoreno10 3:5d959275ac05 56 // Slave writes to Master. Master reads.
jmoreno10 3:5d959275ac05 57 case I2CSlave::ReadAddressed:
jmoreno10 3:5d959275ac05 58 slave.write(msg, strlen(msg) + 1); // Includes null char
jmoreno10 3:5d959275ac05 59 printf("Writing to Master:\t<<- %s\n", msg);
jmoreno10 3:5d959275ac05 60 break;
jmoreno10 3:5d959275ac05 61
jmoreno10 3:5d959275ac05 62 // READING COMMANDS
jmoreno10 3:5d959275ac05 63 // Master writes to Slave. Slave reads.
jmoreno10 3:5d959275ac05 64 case I2CSlave::WriteAddressed:
jmoreno10 3:5d959275ac05 65 slave.read(buf, 200); //Read up to 30 characters from Master
jmoreno10 3:5d959275ac05 66 printf("\n\nReading from Master:\t->> %s\n", buf);
jmoreno10 3:5d959275ac05 67 char j = buf[0];
jmoreno10 3:5d959275ac05 68
jmoreno10 3:5d959275ac05 69 switch(j)
jmoreno10 3:5d959275ac05 70 {
jmoreno10 3:5d959275ac05 71 case '1':
jmoreno10 3:5d959275ac05 72 {
jmoreno10 3:5d959275ac05 73 if (queryESN() == true)
jmoreno10 3:5d959275ac05 74 {
jmoreno10 3:5d959275ac05 75 pc.printf("\nQuery ESN is correct. VALID\n");
jmoreno10 3:5d959275ac05 76 strncpy(msg,"Query ESN is correct",sizeof(msg));
jmoreno10 3:5d959275ac05 77 }
jmoreno10 3:5d959275ac05 78 else
jmoreno10 3:5d959275ac05 79 pc.printf("\nNAK response. INVALID");
jmoreno10 3:5d959275ac05 80 break;
jmoreno10 3:5d959275ac05 81 }
jmoreno10 3:5d959275ac05 82 case '2':
jmoreno10 3:5d959275ac05 83 {
jmoreno10 3:5d959275ac05 84 bursts = queryBursts();
jmoreno10 3:5d959275ac05 85 if (bursts != 99)
jmoreno10 3:5d959275ac05 86 {
jmoreno10 3:5d959275ac05 87 char qry[2];
jmoreno10 3:5d959275ac05 88 sprintf(qry,"%d",bursts);
jmoreno10 3:5d959275ac05 89 char strt[] = "Bursts Remaining is ";
jmoreno10 3:5d959275ac05 90 strcat(strt,qry);
jmoreno10 3:5d959275ac05 91
jmoreno10 3:5d959275ac05 92 pc.printf("\nBursts Remaining: \t");
jmoreno10 3:5d959275ac05 93 pc.printf("%u",bursts);
jmoreno10 3:5d959275ac05 94 pc.printf("\n");
jmoreno10 3:5d959275ac05 95
jmoreno10 3:5d959275ac05 96 strncpy(msg,strt,sizeof(msg));
jmoreno10 3:5d959275ac05 97 }
jmoreno10 3:5d959275ac05 98 else
jmoreno10 3:5d959275ac05 99 pc.printf("\nNAK response. INVALID");
jmoreno10 3:5d959275ac05 100 break;
jmoreno10 3:5d959275ac05 101 }
jmoreno10 3:5d959275ac05 102 case '3':
jmoreno10 3:5d959275ac05 103 {
jmoreno10 3:5d959275ac05 104 if (queryFirmware() == true)
jmoreno10 3:5d959275ac05 105 {
jmoreno10 3:5d959275ac05 106 pc.printf("\nResponse Processing:\tQuery Firmware is correct. VALID\n");
jmoreno10 3:5d959275ac05 107 strncpy(msg,"Query Firmware is correct",sizeof(msg));
jmoreno10 3:5d959275ac05 108 }
jmoreno10 3:5d959275ac05 109 else
jmoreno10 3:5d959275ac05 110 pc.printf("NAK. INVALID");
jmoreno10 3:5d959275ac05 111 break;
jmoreno10 3:5d959275ac05 112 }
jmoreno10 3:5d959275ac05 113 case '4':
jmoreno10 3:5d959275ac05 114 {
jmoreno10 3:5d959275ac05 115 numSetup = querySetup();
jmoreno10 3:5d959275ac05 116 if (numSetup == NULL)
jmoreno10 3:5d959275ac05 117 pc.printf("NAK");
jmoreno10 3:5d959275ac05 118
jmoreno10 3:5d959275ac05 119 char qryRF[1];
jmoreno10 3:5d959275ac05 120 char qryBursts[2];
jmoreno10 3:5d959275ac05 121 char qryMin[3];
jmoreno10 3:5d959275ac05 122 char qryMax[3];
jmoreno10 3:5d959275ac05 123
jmoreno10 3:5d959275ac05 124 char strt[] = "";
jmoreno10 3:5d959275ac05 125
jmoreno10 3:5d959275ac05 126 //Print Channel
jmoreno10 3:5d959275ac05 127 pc.printf("\n RF Channel: ");
jmoreno10 3:5d959275ac05 128 pc.printf("%u",numSetup/(10000000));
jmoreno10 3:5d959275ac05 129 int rfprint = numSetup/(10000000); // RF channel
jmoreno10 3:5d959275ac05 130 sprintf(qryRF,"%d",rfprint);
jmoreno10 3:5d959275ac05 131 strcat(strt,qryRF);
jmoreno10 3:5d959275ac05 132 numSetup = numSetup - (numSetup/10000000)*10000000; // Truncate RF Digits
jmoreno10 3:5d959275ac05 133
jmoreno10 3:5d959275ac05 134 //Print Bursts
jmoreno10 3:5d959275ac05 135 pc.printf("\n # of Bursts: ");
jmoreno10 3:5d959275ac05 136 pc.printf("%u",numSetup/(100000)); // Bursts Per Message
jmoreno10 3:5d959275ac05 137 int burprint = numSetup/(100000);
jmoreno10 3:5d959275ac05 138 sprintf(qryBursts,"%d",burprint);
jmoreno10 3:5d959275ac05 139 strcat(strt,qryBursts);
jmoreno10 3:5d959275ac05 140 numSetup = numSetup - (numSetup/100000)*100000; // Truncate Burst Digits
jmoreno10 3:5d959275ac05 141
jmoreno10 3:5d959275ac05 142 //Print Min Interval
jmoreno10 3:5d959275ac05 143 pc.printf("\n Min Burst Interval: ");
jmoreno10 3:5d959275ac05 144 pc.printf("%u",numSetup/1000*5); // Min Interval
jmoreno10 3:5d959275ac05 145 int minprint = numSetup/1000*5;
jmoreno10 3:5d959275ac05 146 sprintf(qryMin,"%d",minprint);
jmoreno10 3:5d959275ac05 147 strcat(strt,qryMin);
jmoreno10 3:5d959275ac05 148 numSetup = numSetup - (numSetup/1000)*1000; // Truncate Min Interval
jmoreno10 3:5d959275ac05 149 pc.printf(" seconds");
jmoreno10 3:5d959275ac05 150
jmoreno10 3:5d959275ac05 151 //Print Max Interval
jmoreno10 3:5d959275ac05 152 pc.printf("\n Max Burst Interval: ");
jmoreno10 3:5d959275ac05 153 pc.printf("%u",numSetup*5);
jmoreno10 3:5d959275ac05 154 int maxprint = numSetup*5; // Max Interval
jmoreno10 3:5d959275ac05 155 sprintf(qryMax,"%d",maxprint);
jmoreno10 3:5d959275ac05 156 strcat(strt,qryMax);
jmoreno10 3:5d959275ac05 157 pc.printf(" seconds\n");
jmoreno10 3:5d959275ac05 158
jmoreno10 3:5d959275ac05 159 strncpy(msg,strt,sizeof(msg));
jmoreno10 3:5d959275ac05 160
jmoreno10 3:5d959275ac05 161 break;
jmoreno10 3:5d959275ac05 162 }
jmoreno10 3:5d959275ac05 163 case '5':
jmoreno10 3:5d959275ac05 164 {
jmoreno10 3:5d959275ac05 165 queryHardware();
jmoreno10 3:5d959275ac05 166 break;
jmoreno10 3:5d959275ac05 167 }
jmoreno10 3:5d959275ac05 168 case '6':
jmoreno10 3:5d959275ac05 169 {
jmoreno10 3:5d959275ac05 170 NAKcommand();
jmoreno10 3:5d959275ac05 171 break;
jmoreno10 3:5d959275ac05 172 }
jmoreno10 3:5d959275ac05 173 case '7':
jmoreno10 3:5d959275ac05 174 {
jmoreno10 3:5d959275ac05 175 _setup();
jmoreno10 3:5d959275ac05 176 break;
jmoreno10 3:5d959275ac05 177 }
jmoreno10 3:5d959275ac05 178 case '8':
jmoreno10 3:5d959275ac05 179 {
jmoreno10 3:5d959275ac05 180 int cnt = 0; //Counter for all the characters before pressing "Return" key
jmoreno10 3:5d959275ac05 181
jmoreno10 3:5d959275ac05 182 //This loop counts all characters before the "Return" key in the buffer
jmoreno10 3:5d959275ac05 183 for (int k = 0; k < 200; k++)
jmoreno10 3:5d959275ac05 184 {
jmoreno10 3:5d959275ac05 185 if(buf[k] == '\n')
jmoreno10 3:5d959275ac05 186 break;
jmoreno10 3:5d959275ac05 187 cnt++;
jmoreno10 3:5d959275ac05 188 }
jmoreno10 3:5d959275ac05 189
jmoreno10 3:5d959275ac05 190 pc.printf("0x00\t\t\tSend Data\n\r");
jmoreno10 3:5d959275ac05 191 cnt--; //Decrement total by 1. Don't count 8.
jmoreno10 3:5d959275ac05 192 pc.printf("Data Packet length: \t%u\n",cnt); //Decrement total by 1
jmoreno10 3:5d959275ac05 193
jmoreno10 3:5d959275ac05 194 char str[cnt]; //Declare str array. str will copy buf but without '8'
jmoreno10 3:5d959275ac05 195 //Define str array. str will copy buf but without '8'
jmoreno10 3:5d959275ac05 196 for (int k = 0; k < cnt; k++)
jmoreno10 3:5d959275ac05 197 str[k] = buf[k+1]; //Starts 1 index after '8'.
jmoreno10 3:5d959275ac05 198
jmoreno10 3:5d959275ac05 199 //Declare str1 array. str1 copies str but with
jmoreno10 3:5d959275ac05 200 //the correct datalength by truncating the extra characters
jmoreno10 3:5d959275ac05 201 //found in str
jmoreno10 3:5d959275ac05 202 char str1[cnt];
jmoreno10 3:5d959275ac05 203 strncpy(str1,str,cnt); //truncation of extra characters
jmoreno10 3:5d959275ac05 204 str1[cnt] = '\0'; //Null character
jmoreno10 3:5d959275ac05 205
jmoreno10 3:5d959275ac05 206 pc.printf("Data Packet: \t\t%s \n",str1);
jmoreno10 3:5d959275ac05 207
jmoreno10 3:5d959275ac05 208 //Execute Command "Send Data"
jmoreno10 3:5d959275ac05 209 //sendData(str1);
jmoreno10 3:5d959275ac05 210 if (sendData(str1) == true)
jmoreno10 3:5d959275ac05 211 {
jmoreno10 3:5d959275ac05 212 pc.printf("\nSend Data is successful. VALID\n");
jmoreno10 3:5d959275ac05 213 strncpy(msg,"Send Data is successful",sizeof(msg));
jmoreno10 3:5d959275ac05 214 }
jmoreno10 3:5d959275ac05 215 else
jmoreno10 3:5d959275ac05 216 pc.printf("\nNAK response. INVALID");
jmoreno10 3:5d959275ac05 217
jmoreno10 3:5d959275ac05 218 break;
jmoreno10 3:5d959275ac05 219 }
jmoreno10 3:5d959275ac05 220 case '9':
jmoreno10 3:5d959275ac05 221 {
jmoreno10 3:5d959275ac05 222 if (abortTransmission() == true)
jmoreno10 3:5d959275ac05 223 {
jmoreno10 3:5d959275ac05 224 pc.printf("\nResponse Processing:\tTransmission successfully aborted.\n");
jmoreno10 3:5d959275ac05 225 strncpy(msg,"Transmission successfully aborted.",sizeof(msg));
jmoreno10 3:5d959275ac05 226 }
jmoreno10 3:5d959275ac05 227 else
jmoreno10 3:5d959275ac05 228 pc.printf("\nResponse Processing:\tNAK response. INVALID");
jmoreno10 3:5d959275ac05 229
jmoreno10 3:5d959275ac05 230 break; //break case '9'
jmoreno10 3:5d959275ac05 231 }
jmoreno10 3:5d959275ac05 232 } // switch(j) loop ends
jmoreno10 3:5d959275ac05 233 break; //break write addressed
jmoreno10 3:5d959275ac05 234 } // switch(i) loop ends
jmoreno10 3:5d959275ac05 235 //for(int i = 0; i < 30; i++) buf[i] = 0; // Clear buffer
jmoreno10 3:5d959275ac05 236 } // while(1) loop ends
jmoreno10 3:5d959275ac05 237 } // main loop ends
jmoreno10 3:5d959275ac05 238
jmoreno10 3:5d959275ac05 239 void clearPacket()
jmoreno10 3:5d959275ac05 240 {
jmoreno10 3:5d959275ac05 241 num = 0;
jmoreno10 3:5d959275ac05 242 for(int i = 0; i < 15 ; i++)
jmoreno10 3:5d959275ac05 243 packet[i] = 0;
jmoreno10 3:5d959275ac05 244 }
jmoreno10 3:5d959275ac05 245
jmoreno10 3:5d959275ac05 246 void printPacket()
jmoreno10 3:5d959275ac05 247 {
jmoreno10 3:5d959275ac05 248 pc.printf("\nResponse(Decimal): \t");
jmoreno10 3:5d959275ac05 249 for(int i = 0; i < 15 ; i++)
jmoreno10 3:5d959275ac05 250 {
jmoreno10 3:5d959275ac05 251 pc.printf("%u",packet[i]); // Format specifier
jmoreno10 3:5d959275ac05 252 pc.printf(" ");
Sumobot 0:88a700f174a3 253 }
jmoreno10 3:5d959275ac05 254 }
Sumobot 0:88a700f174a3 255
jmoreno10 3:5d959275ac05 256 void respuesta()
jmoreno10 3:5d959275ac05 257 {
jmoreno10 3:5d959275ac05 258 while(1)
Sumobot 0:88a700f174a3 259 {
jmoreno10 3:5d959275ac05 260 if(stingr.readable())
jmoreno10 3:5d959275ac05 261 { // Se esperan datos provenientes del TX del módulo STX3
jmoreno10 3:5d959275ac05 262 incomingByte = stingr.getc();
jmoreno10 3:5d959275ac05 263 packet[num] = incomingByte;
jmoreno10 3:5d959275ac05 264 pc.printf("%X",incomingByte); // Format specifier
jmoreno10 3:5d959275ac05 265 pc.printf(" ");
jmoreno10 3:5d959275ac05 266 num++;
Sumobot 0:88a700f174a3 267 }
Sumobot 0:88a700f174a3 268 }
jmoreno10 3:5d959275ac05 269 }
jmoreno10 3:5d959275ac05 270
jmoreno10 3:5d959275ac05 271 void waitCTS()
jmoreno10 3:5d959275ac05 272 {
jmoreno10 3:5d959275ac05 273 Thread::wait(200); // Se da un tiempo para que el analizador se estabilice
jmoreno10 3:5d959275ac05 274 incomingByte=0;
jmoreno10 3:5d959275ac05 275 //pc.printf("El valor de CTS es %d\n\r",CTS.read()); // Se lee el valor de la variable CTS, la cual debe ser 1
jmoreno10 3:5d959275ac05 276 //pc.printf("El valor de RTS es %d\n\r",RTS.read()); // Se lee el valor de la variable RTS, la cual debe ser 1
jmoreno10 3:5d959275ac05 277 RTS=0; // Se manda un pulso en bajo en RTS, para inicial el proceso de transmisión
jmoreno10 3:5d959275ac05 278
jmoreno10 3:5d959275ac05 279 while(flag==1)
jmoreno10 3:5d959275ac05 280 {// Flag inicialmente vale 1, así que el ciclo while cambiará hasta que esa condición no se cumpla
jmoreno10 3:5d959275ac05 281 flag=CTS.read(); // Cuando entra el ciclo, se iguala flag a CTS, el cual cuando cambie a 0 provocará que termine el while (máx 125 ms)
jmoreno10 3:5d959275ac05 282 //pc.printf("El valor de flag es %d\n\r", flag); // Se imprime el valor de flag, para identificar cuando termina el ciclo while
jmoreno10 3:5d959275ac05 283 }
jmoreno10 3:5d959275ac05 284 }
jmoreno10 3:5d959275ac05 285
jmoreno10 3:5d959275ac05 286 void postCommand()
jmoreno10 3:5d959275ac05 287 {
jmoreno10 3:5d959275ac05 288 Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones
jmoreno10 3:5d959275ac05 289 //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión
jmoreno10 3:5d959275ac05 290 RTS=1;
jmoreno10 3:5d959275ac05 291 Thread::wait(150);
jmoreno10 3:5d959275ac05 292 //pc.printf("\n\rCTS: %d\n\r",CTS.read());
jmoreno10 3:5d959275ac05 293 flag=1;
jmoreno10 3:5d959275ac05 294 }
jmoreno10 3:5d959275ac05 295
jmoreno10 3:5d959275ac05 296 //0x00 Send Data
jmoreno10 3:5d959275ac05 297 bool sendData(char* b) //char* s
jmoreno10 3:5d959275ac05 298 {
jmoreno10 3:5d959275ac05 299 led4=!led4;
jmoreno10 3:5d959275ac05 300 waitCTS();
jmoreno10 3:5d959275ac05 301 Thread::wait(10);
jmoreno10 3:5d959275ac05 302
jmoreno10 3:5d959275ac05 303 size_t n = strlen(b); //Measure size of b. This includes the zeros
jmoreno10 3:5d959275ac05 304 int number = n+3;
jmoreno10 3:5d959275ac05 305 int len = n+5;
jmoreno10 3:5d959275ac05 306 char header[3] = {0xAA,len,0x00}; //Define header information
jmoreno10 3:5d959275ac05 307 char vec[number];
jmoreno10 3:5d959275ac05 308 //pc.printf("number = %u\n",number);
jmoreno10 3:5d959275ac05 309
jmoreno10 3:5d959275ac05 310 //store all in vec
jmoreno10 3:5d959275ac05 311 for(int k = 0; k < 3; k++)
jmoreno10 3:5d959275ac05 312 vec[k] = header[k];
jmoreno10 3:5d959275ac05 313 for(int k = 3; k < number; k++)
jmoreno10 3:5d959275ac05 314 vec[k] = b[k-3];
Sumobot 0:88a700f174a3 315
jmoreno10 3:5d959275ac05 316 pc.printf("Command(HEX):\t\t");
jmoreno10 3:5d959275ac05 317 //Print b characters in HEX
jmoreno10 3:5d959275ac05 318 for(int k = 0; k < number; k++)
jmoreno10 3:5d959275ac05 319 pc.printf("%X ",vec[k]);
jmoreno10 3:5d959275ac05 320
jmoreno10 3:5d959275ac05 321 char *t = (char *)vec; //a
jmoreno10 3:5d959275ac05 322 char crc1 = ModRTU_CRC(t,t[1]-2)&0xFF;
jmoreno10 3:5d959275ac05 323 char crc2 = ModRTU_CRC(t,t[1]-2)>>8;
jmoreno10 3:5d959275ac05 324
jmoreno10 3:5d959275ac05 325 pc.printf("%X ",crc1); //%X print char in HEX format
jmoreno10 3:5d959275ac05 326 pc.printf("%X ",crc2); //%X print char in HEX format
jmoreno10 3:5d959275ac05 327 pc.printf("\nResponse(HEX):\t\t");
jmoreno10 3:5d959275ac05 328
jmoreno10 3:5d959275ac05 329 //Send Command to STINGR
jmoreno10 3:5d959275ac05 330 for(int k = 0; k < number; k++)
jmoreno10 3:5d959275ac05 331 stingr.putc(vec[k]);
jmoreno10 3:5d959275ac05 332 stingr.putc(crc1);
jmoreno10 3:5d959275ac05 333 stingr.putc(crc2);
jmoreno10 3:5d959275ac05 334
jmoreno10 3:5d959275ac05 335
jmoreno10 3:5d959275ac05 336 postCommand();
jmoreno10 3:5d959275ac05 337 printPacket();
jmoreno10 3:5d959275ac05 338
jmoreno10 3:5d959275ac05 339 //If NAK response
jmoreno10 3:5d959275ac05 340 if (packet[0] == 170 && // 0xAA
jmoreno10 3:5d959275ac05 341 packet[1] == 5 && // 0x05
jmoreno10 3:5d959275ac05 342 packet[2] == 255 && // 0xFF
jmoreno10 3:5d959275ac05 343 packet[3] == 161 && // 0xA1
jmoreno10 3:5d959275ac05 344 packet[4] == 203) // 0xCB
jmoreno10 3:5d959275ac05 345 {
jmoreno10 3:5d959275ac05 346 clearPacket();
jmoreno10 3:5d959275ac05 347 pc.printf("\n");
jmoreno10 3:5d959275ac05 348 return false;
jmoreno10 3:5d959275ac05 349 }
jmoreno10 3:5d959275ac05 350 clearPacket();
jmoreno10 3:5d959275ac05 351 pc.printf("\n");
jmoreno10 3:5d959275ac05 352 return true;
jmoreno10 3:5d959275ac05 353 }
jmoreno10 3:5d959275ac05 354
jmoreno10 3:5d959275ac05 355 //0x01 Query ESN
jmoreno10 3:5d959275ac05 356 bool queryESN()
jmoreno10 3:5d959275ac05 357 {
jmoreno10 3:5d959275ac05 358 led1=!led1;
jmoreno10 3:5d959275ac05 359 pc.printf("\r0x01\t\t\tQuery ESN\n");
jmoreno10 3:5d959275ac05 360 pc.printf("Command(HEX):\t\tAA 5 1 50 D5\n\r");
jmoreno10 3:5d959275ac05 361 pc.printf("Response(HEX):\t\t");
jmoreno10 3:5d959275ac05 362 waitCTS();
jmoreno10 3:5d959275ac05 363 Thread::wait(10);
jmoreno10 3:5d959275ac05 364
jmoreno10 3:5d959275ac05 365 stingr.putc(0XAA);
jmoreno10 3:5d959275ac05 366 stingr.putc(0X05);
jmoreno10 3:5d959275ac05 367 stingr.putc(0X01);
jmoreno10 3:5d959275ac05 368 stingr.putc(0X50);
jmoreno10 3:5d959275ac05 369 stingr.putc(0XD5);
jmoreno10 3:5d959275ac05 370
jmoreno10 3:5d959275ac05 371 postCommand();
jmoreno10 3:5d959275ac05 372 printPacket();
jmoreno10 3:5d959275ac05 373 if (packet[3] == 0 && // 0x00
jmoreno10 3:5d959275ac05 374 packet[4] == 41 && // 0x29
jmoreno10 3:5d959275ac05 375 packet[5] == 67 && // 0x43
jmoreno10 3:5d959275ac05 376 packet[6] == 179) // 0xB3
jmoreno10 3:5d959275ac05 377 {
jmoreno10 3:5d959275ac05 378 clearPacket();
jmoreno10 3:5d959275ac05 379 return true;
jmoreno10 3:5d959275ac05 380 }
jmoreno10 3:5d959275ac05 381 clearPacket();
jmoreno10 3:5d959275ac05 382 return false;
jmoreno10 3:5d959275ac05 383 }
jmoreno10 3:5d959275ac05 384
jmoreno10 3:5d959275ac05 385 //0x03 Abort Transmission
jmoreno10 3:5d959275ac05 386 bool abortTransmission()
jmoreno10 3:5d959275ac05 387 {
jmoreno10 3:5d959275ac05 388 led1=!led1;
jmoreno10 3:5d959275ac05 389 pc.printf("\r0x03\t\t\tAbort Transmission\n");
jmoreno10 3:5d959275ac05 390 pc.printf("Command(HEX):\t\tAA 5 3 42 F6\n\r");
jmoreno10 3:5d959275ac05 391 pc.printf("Response(HEX):\t\t");
jmoreno10 3:5d959275ac05 392 waitCTS();
jmoreno10 3:5d959275ac05 393 Thread::wait(10);
jmoreno10 3:5d959275ac05 394 stingr.putc(0XAA);
jmoreno10 3:5d959275ac05 395 stingr.putc(0X05);
jmoreno10 3:5d959275ac05 396 stingr.putc(0X03);
jmoreno10 3:5d959275ac05 397 stingr.putc(0X42);
jmoreno10 3:5d959275ac05 398 stingr.putc(0XF6);
jmoreno10 3:5d959275ac05 399
jmoreno10 3:5d959275ac05 400 postCommand();
jmoreno10 3:5d959275ac05 401 printPacket();
jmoreno10 3:5d959275ac05 402 if (packet[0] == 170 && // 0xAA
jmoreno10 3:5d959275ac05 403 packet[1] == 5 && // 0x05
jmoreno10 3:5d959275ac05 404 packet[2] == 3 && // 0x03
jmoreno10 3:5d959275ac05 405 packet[3] == 66 && // 0x42
jmoreno10 3:5d959275ac05 406 packet[4] == 246) // 0xF6
jmoreno10 3:5d959275ac05 407 {
jmoreno10 3:5d959275ac05 408 clearPacket();
jmoreno10 3:5d959275ac05 409 return true;
jmoreno10 3:5d959275ac05 410 }
jmoreno10 3:5d959275ac05 411 clearPacket();
jmoreno10 3:5d959275ac05 412 return false;
jmoreno10 3:5d959275ac05 413 }
jmoreno10 3:5d959275ac05 414
jmoreno10 3:5d959275ac05 415 //0x04 Query Bursts
jmoreno10 3:5d959275ac05 416 int queryBursts()
jmoreno10 3:5d959275ac05 417 {
jmoreno10 3:5d959275ac05 418 int bursts = 99;
jmoreno10 3:5d959275ac05 419
jmoreno10 3:5d959275ac05 420 led2=!led2;
jmoreno10 3:5d959275ac05 421 pc.printf("\r0x04\t\t\tQuery Burst Remaining\n");
jmoreno10 3:5d959275ac05 422 pc.printf("Command(HEX):\t\tAA 5 4 FD 82\n\r");
jmoreno10 3:5d959275ac05 423 pc.printf("Response(HEX):\t\t");
jmoreno10 3:5d959275ac05 424 waitCTS();
jmoreno10 3:5d959275ac05 425 Thread::wait(10);
jmoreno10 3:5d959275ac05 426
jmoreno10 3:5d959275ac05 427 stingr.putc(0XAA);
jmoreno10 3:5d959275ac05 428 stingr.putc(0X05);
jmoreno10 3:5d959275ac05 429 stingr.putc(0X04);
jmoreno10 3:5d959275ac05 430 stingr.putc(0XFD);
jmoreno10 3:5d959275ac05 431 stingr.putc(0X82);
jmoreno10 3:5d959275ac05 432
jmoreno10 3:5d959275ac05 433 postCommand();
jmoreno10 3:5d959275ac05 434 printPacket();
jmoreno10 3:5d959275ac05 435
jmoreno10 3:5d959275ac05 436 //If NAK response
jmoreno10 3:5d959275ac05 437 if (packet[0] == 170 && // 0xAA
jmoreno10 3:5d959275ac05 438 packet[1] == 5 && // 0x05
jmoreno10 3:5d959275ac05 439 packet[2] == 255 && // 0xFF
jmoreno10 3:5d959275ac05 440 packet[3] == 161 && // 0xA1
jmoreno10 3:5d959275ac05 441 packet[4] == 203) // 0xCB
jmoreno10 3:5d959275ac05 442 {
jmoreno10 3:5d959275ac05 443 clearPacket();
jmoreno10 3:5d959275ac05 444 return bursts;
Sumobot 0:88a700f174a3 445 }
jmoreno10 3:5d959275ac05 446 bursts = packet[3];
jmoreno10 3:5d959275ac05 447 clearPacket();
jmoreno10 3:5d959275ac05 448 return bursts;
jmoreno10 3:5d959275ac05 449 }
jmoreno10 3:5d959275ac05 450
jmoreno10 3:5d959275ac05 451 //0x05 Query Firmware
jmoreno10 3:5d959275ac05 452 bool queryFirmware()
jmoreno10 3:5d959275ac05 453 {
jmoreno10 3:5d959275ac05 454 led3=!led3;
jmoreno10 3:5d959275ac05 455 pc.printf("\r0x05 Query Firmware Version\n");
jmoreno10 3:5d959275ac05 456 pc.printf("Command(HEX):\t\tAA 5 5 74 93\n\r");
jmoreno10 3:5d959275ac05 457 pc.printf("Response(HEX):\t\t");
jmoreno10 3:5d959275ac05 458 waitCTS();
jmoreno10 3:5d959275ac05 459 Thread::wait(10);
jmoreno10 3:5d959275ac05 460 stingr.putc(0XAA);
jmoreno10 3:5d959275ac05 461 stingr.putc(0X05);
jmoreno10 3:5d959275ac05 462 stingr.putc(0X05);
jmoreno10 3:5d959275ac05 463 stingr.putc(0X74);
jmoreno10 3:5d959275ac05 464 stingr.putc(0X93);
jmoreno10 3:5d959275ac05 465
jmoreno10 3:5d959275ac05 466 postCommand();
jmoreno10 3:5d959275ac05 467 printPacket();
jmoreno10 3:5d959275ac05 468 if (packet[3] == 1 && // 0x01
jmoreno10 3:5d959275ac05 469 packet[4] == 3) // 0x03
jmoreno10 3:5d959275ac05 470 {
jmoreno10 3:5d959275ac05 471 clearPacket();
jmoreno10 3:5d959275ac05 472 return true;
jmoreno10 3:5d959275ac05 473 }
jmoreno10 3:5d959275ac05 474 clearPacket();
jmoreno10 3:5d959275ac05 475 return false;
jmoreno10 3:5d959275ac05 476 }
jmoreno10 3:5d959275ac05 477
jmoreno10 3:5d959275ac05 478 //0x06 Setup
jmoreno10 3:5d959275ac05 479 void _setup()
jmoreno10 3:5d959275ac05 480 {
jmoreno10 3:5d959275ac05 481 led3=!led3;
jmoreno10 3:5d959275ac05 482 pc.printf("\r0x06 Setup\n");
jmoreno10 3:5d959275ac05 483 pc.printf("Command(HEX):\t\tAA 0E 06 00 00 00 00 00 03 18 30 00 CE 9C\n\r");
jmoreno10 3:5d959275ac05 484 pc.printf("Response(HEX):\t\t");
jmoreno10 3:5d959275ac05 485 waitCTS();
jmoreno10 3:5d959275ac05 486 Thread::wait(10);
jmoreno10 3:5d959275ac05 487 stingr.putc(0XAA);
jmoreno10 3:5d959275ac05 488 stingr.putc(0X0E);
jmoreno10 3:5d959275ac05 489 stingr.putc(0X06);
jmoreno10 3:5d959275ac05 490 stingr.putc(0X00);
jmoreno10 3:5d959275ac05 491 stingr.putc(0X00);
jmoreno10 3:5d959275ac05 492 stingr.putc(0X00);
jmoreno10 3:5d959275ac05 493 stingr.putc(0X00);
jmoreno10 3:5d959275ac05 494 stingr.putc(0X00);
jmoreno10 3:5d959275ac05 495 stingr.putc(0X03);
jmoreno10 3:5d959275ac05 496 stingr.putc(0X18);
jmoreno10 3:5d959275ac05 497 stingr.putc(0X30);
jmoreno10 3:5d959275ac05 498 stingr.putc(0X00);
jmoreno10 3:5d959275ac05 499 stingr.putc(0XCE);
jmoreno10 3:5d959275ac05 500 stingr.putc(0X9C);
jmoreno10 3:5d959275ac05 501 postCommand();
jmoreno10 3:5d959275ac05 502 }
jmoreno10 3:5d959275ac05 503
jmoreno10 3:5d959275ac05 504 //0x07 Query Setup
jmoreno10 3:5d959275ac05 505 long int querySetup()
jmoreno10 3:5d959275ac05 506 {
jmoreno10 3:5d959275ac05 507 int numSetup = 0;
jmoreno10 3:5d959275ac05 508 led4=!led4;
jmoreno10 3:5d959275ac05 509 pc.printf("\r0x07 Query Setup\n");
jmoreno10 3:5d959275ac05 510 pc.printf("Command(HEX):\t\tAA 5 7 66 B0\n\r");
jmoreno10 3:5d959275ac05 511 pc.printf("Response(HEX):\t\t");
jmoreno10 3:5d959275ac05 512 waitCTS();
jmoreno10 3:5d959275ac05 513 Thread::wait(10);
jmoreno10 3:5d959275ac05 514
jmoreno10 3:5d959275ac05 515 stingr.putc(0XAA);
jmoreno10 3:5d959275ac05 516 stingr.putc(0X05);
jmoreno10 3:5d959275ac05 517 stingr.putc(0X07);
jmoreno10 3:5d959275ac05 518 stingr.putc(0X66);
jmoreno10 3:5d959275ac05 519 stingr.putc(0XB0);
jmoreno10 3:5d959275ac05 520
jmoreno10 3:5d959275ac05 521 postCommand();
jmoreno10 3:5d959275ac05 522
jmoreno10 3:5d959275ac05 523 //If NAK response
jmoreno10 3:5d959275ac05 524 if (packet[0] == 170 && // 0xAA
jmoreno10 3:5d959275ac05 525 packet[1] == 5 && // 0x05
jmoreno10 3:5d959275ac05 526 packet[2] == 255 && // 0xFF
jmoreno10 3:5d959275ac05 527 packet[3] == 161 && // 0xA1
jmoreno10 3:5d959275ac05 528 packet[4] == 203) // 0xCB
jmoreno10 3:5d959275ac05 529 {
jmoreno10 3:5d959275ac05 530 clearPacket();
jmoreno10 3:5d959275ac05 531 return NULL;
jmoreno10 3:5d959275ac05 532 }
jmoreno10 3:5d959275ac05 533 numSetup = packet[7]*10000000 + packet[8]*100000 + packet[9]*1000 + packet[10];
jmoreno10 3:5d959275ac05 534 clearPacket();
jmoreno10 3:5d959275ac05 535 return numSetup;
jmoreno10 3:5d959275ac05 536 }
jmoreno10 3:5d959275ac05 537
jmoreno10 3:5d959275ac05 538 //0x09 Query Hardware
jmoreno10 3:5d959275ac05 539 void queryHardware()
jmoreno10 3:5d959275ac05 540 {
jmoreno10 3:5d959275ac05 541 led1=!led1;
jmoreno10 3:5d959275ac05 542 pc.printf("\r0x09 Query Hardware Version\n");
jmoreno10 3:5d959275ac05 543 pc.printf("Command(HEX):\t\tAA 5 9 18 59\n\r");
jmoreno10 3:5d959275ac05 544 pc.printf("Response(HEX):\t\t");
jmoreno10 3:5d959275ac05 545 waitCTS();
jmoreno10 3:5d959275ac05 546 Thread::wait(10);
jmoreno10 3:5d959275ac05 547
jmoreno10 3:5d959275ac05 548 stingr.putc(0XAA);
jmoreno10 3:5d959275ac05 549 stingr.putc(0X05);
jmoreno10 3:5d959275ac05 550 stingr.putc(0X09);
jmoreno10 3:5d959275ac05 551 stingr.putc(0X18);
jmoreno10 3:5d959275ac05 552 stingr.putc(0X59);
jmoreno10 3:5d959275ac05 553
jmoreno10 3:5d959275ac05 554 postCommand();
jmoreno10 3:5d959275ac05 555 printPacket();
jmoreno10 3:5d959275ac05 556 clearPacket();
jmoreno10 3:5d959275ac05 557 pc.printf("\n");
jmoreno10 3:5d959275ac05 558 }
jmoreno10 3:5d959275ac05 559
jmoreno10 3:5d959275ac05 560 //NAK Command
jmoreno10 3:5d959275ac05 561 void NAKcommand()
jmoreno10 3:5d959275ac05 562 {
jmoreno10 3:5d959275ac05 563 led2=!led2;
jmoreno10 3:5d959275ac05 564 pc.printf("\rXxXX NAK\n");
jmoreno10 3:5d959275ac05 565 pc.printf("Command(HEX):\t\tAA 5 7 66 B1\n\r");
jmoreno10 3:5d959275ac05 566 pc.printf("Response(HEX):\t\t");
jmoreno10 3:5d959275ac05 567 waitCTS();
jmoreno10 3:5d959275ac05 568 Thread::wait(10);
jmoreno10 3:5d959275ac05 569
jmoreno10 3:5d959275ac05 570 stingr.putc(0XAA);
jmoreno10 3:5d959275ac05 571 stingr.putc(0X05);
jmoreno10 3:5d959275ac05 572 stingr.putc(0X07);
jmoreno10 3:5d959275ac05 573 stingr.putc(0X66);
jmoreno10 3:5d959275ac05 574 stingr.putc(0XB1);
jmoreno10 3:5d959275ac05 575
jmoreno10 3:5d959275ac05 576 postCommand();
jmoreno10 3:5d959275ac05 577 printPacket();
jmoreno10 3:5d959275ac05 578 clearPacket();
jmoreno10 3:5d959275ac05 579 pc.printf("\n");
jmoreno10 3:5d959275ac05 580 }
jmoreno10 3:5d959275ac05 581
jmoreno10 3:5d959275ac05 582 uint16_t ModRTU_CRC(char * buf, int len)
jmoreno10 3:5d959275ac05 583 {
jmoreno10 3:5d959275ac05 584 unsigned char i;
jmoreno10 3:5d959275ac05 585 unsigned short data;
jmoreno10 3:5d959275ac05 586 uint16_t crc = 0xFFFF;
jmoreno10 3:5d959275ac05 587
jmoreno10 3:5d959275ac05 588 do{
jmoreno10 3:5d959275ac05 589 data = (unsigned int)0x00FF & *buf++;
jmoreno10 3:5d959275ac05 590 crc = crc ^ data;
jmoreno10 3:5d959275ac05 591
jmoreno10 3:5d959275ac05 592 for(i = 8; i > 0; i--)
jmoreno10 3:5d959275ac05 593 {
jmoreno10 3:5d959275ac05 594 if(crc & 0x0001)
jmoreno10 3:5d959275ac05 595 crc = (crc >> 1) ^ 0x8408;
jmoreno10 3:5d959275ac05 596 else
jmoreno10 3:5d959275ac05 597 crc >>=1;
jmoreno10 3:5d959275ac05 598 }
jmoreno10 3:5d959275ac05 599
jmoreno10 3:5d959275ac05 600 }while (--len);
jmoreno10 3:5d959275ac05 601
jmoreno10 3:5d959275ac05 602 crc = ~crc;
jmoreno10 3:5d959275ac05 603
jmoreno10 3:5d959275ac05 604 // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
jmoreno10 3:5d959275ac05 605 return (crc);
jmoreno10 3:5d959275ac05 606 }
jmoreno10 3:5d959275ac05 607
jmoreno10 3:5d959275ac05 608 void combine(char* s, char c)
jmoreno10 3:5d959275ac05 609 {
jmoreno10 3:5d959275ac05 610 int len = strlen(s);
jmoreno10 3:5d959275ac05 611 s[len] = c;
jmoreno10 3:5d959275ac05 612 s[len+1] = '\0';
jmoreno10 3:5d959275ac05 613 }