Jonathan Moreno
/
PYL_v7_1
AguilaBoard program. No library.
Fork of PYL_v6 by
Diff: main.cpp
- Revision:
- 5:c52a2d06bd93
- Parent:
- 3:5d959275ac05
- Child:
- 6:172a750bbf33
--- a/main.cpp Wed Jun 27 22:01:51 2018 +0000 +++ b/main.cpp Fri Jun 29 22:29:33 2018 +0000 @@ -1,583 +1,186 @@ -#include "mbed.h" //Se declara la librería mbed. +#include "mbed.h" // Se declara la librería mbed. #include "rtos.h" -I2CSlave slave(p9, p10); -DigitalOut led1(LED1); -DigitalOut led2(LED2); -DigitalOut led3(LED3); -DigitalOut led4(LED4); -Serial pc(USBTX, USBRX, 9600); // tx, rx Conunicación Serial con la PC -DigitalIn CTS(p7, PullUp); // Pin Digital de entrada "CTS" en modo Pull-Up, para encontrarse normalmente a VCC cuando no haya un pulso. -DigitalOut RTS(p8, 1); // Pin Digital de Salida "RTS"; Predefinido para valer 1 en su estado inactivo dentro del código. -Serial stingr(p13, p14, 9600); // tx, rx Comunicación Serial con el Módulo STX3 -int flag=1; // Declaración de la Bandera. -int incomingByte=0; -Thread thread; -int packet[15]; //int or char -int num = 0; +// Serial communication to PC +Serial pc(USBTX, USBRX, 9600); + +// STINGR connections +DigitalIn CTS(p7, PullUp); // Entrada "CTS" en modo Pull-Up, para encontrarse normalmente a VCC cuando no haya un pulso. +DigitalOut RTS(p8, 1); // Salida "RTS"; Predefinido para valer 1 en su estado inactivo dentro del código. +Serial device(p9, p10, 9600); // tx, rx Comunicación Serial con el Módulo STINGR -void clearPacket(); -void printPacket(); +// Declared functions +//void stx3(); // stx3() and waitCTS() appear to be same functions +uint16_t ModRTU_CRC(char *buf, int len); // returns CRC bytes void respuesta(); -void waitCTS(); -void postCommand(); +void waitCTS(); -bool queryESN(); -bool abortTransmission(); -bool queryFirmware(); -int queryBursts(); -long int querySetup(); -bool sendData(char* s); -void _setup(); -void queryHardware(); -void NAKcommand(); -uint16_t ModRTU_CRC(char * buf, int len); -void combine(char* s, char c); +// Global variables +int flag = 1; // Declaración de la Bandera. +int incomingByte = 0; // Used to collect bytes from STINGR responses +Thread thread; // Declaration to run threads +int packet[15]; // STINGR response array +int num = 0; // packet[15] index variable +AnalogIn ain(p20); // Initialize pin for analog input +int counter = 0; + int main() -{ - //i2c variables - slave.frequency(400000); - char buf[200]; - char msg[200]; - slave.address(0x1E); +{ + // SETUP___________________________________________________________________ + //thread.start(stx3); + thread.start(respuesta); // STINGR responses to commands - int bursts = 0; - int long numSetup = 0; - thread.start(respuesta); + // Send Setup Command + waitCTS(); - while(1) - { - int i = slave.receive(); - - switch(i) - { - // WRITING RESPONSES - // Slave writes to Master. Master reads. - case I2CSlave::ReadAddressed: - slave.write(msg, strlen(msg) + 1); // Includes null char - printf("Writing to Master:\t<<- %s\n", msg); - break; - - // READING COMMANDS - // Master writes to Slave. Slave reads. - case I2CSlave::WriteAddressed: - slave.read(buf, 200); //Read up to 30 characters from Master - printf("\n\nReading from Master:\t->> %s\n", buf); - char j = buf[0]; - - switch(j) - { - case '1': - { - if (queryESN() == true) - { - pc.printf("\nQuery ESN is correct. VALID\n"); - strncpy(msg,"Query ESN is correct",sizeof(msg)); - } - else - pc.printf("\nNAK response. INVALID"); - break; - } - case '2': - { - bursts = queryBursts(); - if (bursts != 99) - { - char qry[2]; - sprintf(qry,"%d",bursts); - char strt[] = "Bursts Remaining is "; - strcat(strt,qry); - - pc.printf("\nBursts Remaining: \t"); - pc.printf("%u",bursts); - pc.printf("\n"); - - strncpy(msg,strt,sizeof(msg)); - } - else - pc.printf("\nNAK response. INVALID"); - break; - } - case '3': - { - if (queryFirmware() == true) - { - pc.printf("\nResponse Processing:\tQuery Firmware is correct. VALID\n"); - strncpy(msg,"Query Firmware is correct",sizeof(msg)); - } - else - pc.printf("NAK. INVALID"); - break; - } - case '4': - { - numSetup = querySetup(); - if (numSetup == NULL) - pc.printf("NAK"); - - char qryRF[1]; - char qryBursts[2]; - char qryMin[3]; - char qryMax[3]; - - char strt[] = ""; - - //Print Channel - pc.printf("\n RF Channel: "); - pc.printf("%u",numSetup/(10000000)); - int rfprint = numSetup/(10000000); // RF channel - sprintf(qryRF,"%d",rfprint); - strcat(strt,qryRF); - numSetup = numSetup - (numSetup/10000000)*10000000; // Truncate RF Digits - - //Print Bursts - pc.printf("\n # of Bursts: "); - pc.printf("%u",numSetup/(100000)); // Bursts Per Message - int burprint = numSetup/(100000); - sprintf(qryBursts,"%d",burprint); - strcat(strt,qryBursts); - numSetup = numSetup - (numSetup/100000)*100000; // Truncate Burst Digits - - //Print Min Interval - pc.printf("\n Min Burst Interval: "); - pc.printf("%u",numSetup/1000*5); // Min Interval - int minprint = numSetup/1000*5; - sprintf(qryMin,"%d",minprint); - strcat(strt,qryMin); - numSetup = numSetup - (numSetup/1000)*1000; // Truncate Min Interval - pc.printf(" seconds"); - - //Print Max Interval - pc.printf("\n Max Burst Interval: "); - pc.printf("%u",numSetup*5); - int maxprint = numSetup*5; // Max Interval - sprintf(qryMax,"%d",maxprint); - strcat(strt,qryMax); - pc.printf(" seconds\n"); - - strncpy(msg,strt,sizeof(msg)); - - break; - } - case '5': - { - queryHardware(); - break; - } - case '6': - { - NAKcommand(); - break; - } - case '7': - { - _setup(); - break; - } - case '8': - { - int cnt = 0; //Counter for all the characters before pressing "Return" key - - //This loop counts all characters before the "Return" key in the buffer - for (int k = 0; k < 200; k++) - { - if(buf[k] == '\n') - break; - cnt++; - } - - pc.printf("0x00\t\t\tSend Data\n\r"); - cnt--; //Decrement total by 1. Don't count 8. - pc.printf("Data Packet length: \t%u\n",cnt); //Decrement total by 1 - - char str[cnt]; //Declare str array. str will copy buf but without '8' - //Define str array. str will copy buf but without '8' - for (int k = 0; k < cnt; k++) - str[k] = buf[k+1]; //Starts 1 index after '8'. - - //Declare str1 array. str1 copies str but with - //the correct datalength by truncating the extra characters - //found in str - char str1[cnt]; - strncpy(str1,str,cnt); //truncation of extra characters - str1[cnt] = '\0'; //Null character - - pc.printf("Data Packet: \t\t%s \n",str1); - - //Execute Command "Send Data" - //sendData(str1); - if (sendData(str1) == true) - { - pc.printf("\nSend Data is successful. VALID\n"); - strncpy(msg,"Send Data is successful",sizeof(msg)); - } - else - pc.printf("\nNAK response. INVALID"); - - break; - } - case '9': - { - if (abortTransmission() == true) - { - pc.printf("\nResponse Processing:\tTransmission successfully aborted.\n"); - strncpy(msg,"Transmission successfully aborted.",sizeof(msg)); - } - else - pc.printf("\nResponse Processing:\tNAK response. INVALID"); - - break; //break case '9' - } - } // switch(j) loop ends - break; //break write addressed - } // switch(i) loop ends - //for(int i = 0; i < 30; i++) buf[i] = 0; // Clear buffer - } // while(1) loop ends -} // main loop ends - -void clearPacket() -{ - num = 0; - for(int i = 0; i < 15 ; i++) - packet[i] = 0; -} - -void printPacket() -{ - pc.printf("\nResponse(Decimal): \t"); - for(int i = 0; i < 15 ; i++) - { - pc.printf("%u",packet[i]); // Format specifier - pc.printf(" "); - } -} - -void respuesta() -{ - while(1) - { - if(stingr.readable()) - { // Se esperan datos provenientes del TX del módulo STX3 - incomingByte = stingr.getc(); - packet[num] = incomingByte; - pc.printf("%X",incomingByte); // Format specifier - pc.printf(" "); - num++; - } - } -} - -void waitCTS() -{ - Thread::wait(200); // Se da un tiempo para que el analizador se estabilice - incomingByte=0; - //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 - //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 - RTS=0; // Se manda un pulso en bajo en RTS, para inicial el proceso de transmisión + device.putc(0XAA); + device.putc(0X0E); + device.putc(0X06); + device.putc(0X00); + device.putc(0X00); + device.putc(0X00); + device.putc(0X00); - while(flag==1) - {// Flag inicialmente vale 1, así que el ciclo while cambiará hasta que esa condición no se cumpla - 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) - //pc.printf("El valor de flag es %d\n\r", flag); // Se imprime el valor de flag, para identificar cuando termina el ciclo while - } -} - -void postCommand() -{ - Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones + device.putc(0X00); //RF Channel (A) + device.putc(0X01); //Bursts (1) + device.putc(0X01); //Interval min (5 seconds) + device.putc(0X02); //Interval max (10 seconds) + + device.putc(0X00); + device.putc(0X21); // CRC 1 + device.putc(0X39); // CRC 2 + // Post Command -------------------------- + Thread::wait(10); //comment? // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones //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 RTS=1; - Thread::wait(150); - //pc.printf("\n\rCTS: %d\n\r",CTS.read()); + Thread::wait(150); //comment? + pc.printf("\n\rCTS: %d\n\r",CTS.read()); flag=1; -} - -//0x00 Send Data -bool sendData(char* b) //char* s -{ - led4=!led4; - waitCTS(); - Thread::wait(10); - - size_t n = strlen(b); //Measure size of b. This includes the zeros - int number = n+3; - int len = n+5; - char header[3] = {0xAA,len,0x00}; //Define header information - char vec[number]; - //pc.printf("number = %u\n",number); - - //store all in vec - for(int k = 0; k < 3; k++) - vec[k] = header[k]; - for(int k = 3; k < number; k++) - vec[k] = b[k-3]; - - pc.printf("Command(HEX):\t\t"); - //Print b characters in HEX - for(int k = 0; k < number; k++) - pc.printf("%X ",vec[k]); - - char *t = (char *)vec; //a - char crc1 = ModRTU_CRC(t,t[1]-2)&0xFF; - char crc2 = ModRTU_CRC(t,t[1]-2)>>8; - - pc.printf("%X ",crc1); //%X print char in HEX format - pc.printf("%X ",crc2); //%X print char in HEX format - pc.printf("\nResponse(HEX):\t\t"); - - //Send Command to STINGR - for(int k = 0; k < number; k++) - stingr.putc(vec[k]); - stingr.putc(crc1); - stingr.putc(crc2); - - - postCommand(); - printPacket(); - - //If NAK response - if (packet[0] == 170 && // 0xAA - packet[1] == 5 && // 0x05 - packet[2] == 255 && // 0xFF - packet[3] == 161 && // 0xA1 - packet[4] == 203) // 0xCB - { - clearPacket(); - pc.printf("\n"); - return false; - } - clearPacket(); - pc.printf("\n"); - return true; -} - -//0x01 Query ESN -bool queryESN() -{ - led1=!led1; - pc.printf("\r0x01\t\t\tQuery ESN\n"); - pc.printf("Command(HEX):\t\tAA 5 1 50 D5\n\r"); - pc.printf("Response(HEX):\t\t"); - waitCTS(); - Thread::wait(10); - - stingr.putc(0XAA); - stingr.putc(0X05); - stingr.putc(0X01); - stingr.putc(0X50); - stingr.putc(0XD5); - - postCommand(); - printPacket(); - if (packet[3] == 0 && // 0x00 - packet[4] == 41 && // 0x29 - packet[5] == 67 && // 0x43 - packet[6] == 179) // 0xB3 - { - clearPacket(); - return true; - } - clearPacket(); - return false; -} - -//0x03 Abort Transmission -bool abortTransmission() -{ - led1=!led1; - pc.printf("\r0x03\t\t\tAbort Transmission\n"); - pc.printf("Command(HEX):\t\tAA 5 3 42 F6\n\r"); - pc.printf("Response(HEX):\t\t"); - waitCTS(); - Thread::wait(10); - stingr.putc(0XAA); - stingr.putc(0X05); - stingr.putc(0X03); - stingr.putc(0X42); - stingr.putc(0XF6); - - postCommand(); - printPacket(); - if (packet[0] == 170 && // 0xAA - packet[1] == 5 && // 0x05 - packet[2] == 3 && // 0x03 - packet[3] == 66 && // 0x42 - packet[4] == 246) // 0xF6 - { - clearPacket(); - return true; - } - clearPacket(); - return false; -} - -//0x04 Query Bursts -int queryBursts() -{ - int bursts = 99; - - led2=!led2; - pc.printf("\r0x04\t\t\tQuery Burst Remaining\n"); - pc.printf("Command(HEX):\t\tAA 5 4 FD 82\n\r"); - pc.printf("Response(HEX):\t\t"); - waitCTS(); - Thread::wait(10); - - stingr.putc(0XAA); - stingr.putc(0X05); - stingr.putc(0X04); - stingr.putc(0XFD); - stingr.putc(0X82); - - postCommand(); - printPacket(); + // --------------------------------------- + Thread::wait(3000); - //If NAK response - if (packet[0] == 170 && // 0xAA - packet[1] == 5 && // 0x05 - packet[2] == 255 && // 0xFF - packet[3] == 161 && // 0xA1 - packet[4] == 203) // 0xCB - { - clearPacket(); - return bursts; - } - bursts = packet[3]; - clearPacket(); - return bursts; -} - -//0x05 Query Firmware -bool queryFirmware() -{ - led3=!led3; - pc.printf("\r0x05 Query Firmware Version\n"); - pc.printf("Command(HEX):\t\tAA 5 5 74 93\n\r"); - pc.printf("Response(HEX):\t\t"); - waitCTS(); - Thread::wait(10); - stingr.putc(0XAA); - stingr.putc(0X05); - stingr.putc(0X05); - stingr.putc(0X74); - stingr.putc(0X93); + // LOOP____________________________________________________________________ + while(true) + { + printf("Fault sin pc"); + + // read the input voltage. represented as a float in the range [0.0, 1.0] + // scaled by 3300 for a range of [0.0, 3300.0] + float voltage = 3300 * ain.read(); + + // regardless, print the voltage reading (in float format; %f) for debugging + printf("voltage [0,3300]: %f \n", voltage); + + if(voltage == 0) + { + printf("Fault -- Voltage is 0"); + } + + else if(voltage < 400) + { + printf("Preheating"); + //Question: How long does preheating take? + //If preheating is quick, make a rewritable delay. + // 5 second delay loops for preheating + // 30 second delay loops for transmitting + //otherwise, there will be an undesirable long 30 second delay + } + + else // (voltage >= 400) + { + int voltage_diference = voltage - 400; // ?? Why subtract 400 + int ppm = voltage_diference*50.0/16.0; // ?? voltage to ppm conversion? + + // Printing voltage and ppm + printf("voltage es: %f mV \n", voltage); + printf("concentracion de C02 en ppm es: %X \n", ppm); + + // Wake-up STINGR communication + //stx3(); + waitCTS(); + + // Create Command vector ----------------- + // ?? Command length is 7 bytes? + // * 3 header bytes, 2 data bytes, 2 CRC bytes? + int number = 5; + char header[3] = {0xAA,0x07,0x00}; // Define header information + char vec[number]; // 3 header bytes, 2 data bytes + + // store header to vec + for(int k = 0; k < 3; k++) + vec[k] = header[k]; + + // Break ppm integer(2 bytes) into separate c1,c2 uint8_t(bytes) + uint8_t c1 = ppm; + uint8_t c2 = ppm >> 8; + + // store data bytes to vec + vec[3] = c2; + vec[4] = c1; - postCommand(); - printPacket(); - if (packet[3] == 1 && // 0x01 - packet[4] == 3) // 0x03 - { - clearPacket(); - return true; - } - clearPacket(); - return false; -} + // Print characters in HEX (Debugging) + pc.printf("Command(HEX):\t\t"); + for(int k = 0; k < number; k++) + pc.printf("%X ",vec[k]); + + // CRC calculation ----------------------- + char *t = (char *)vec; + char crc1 = ModRTU_CRC(t,t[1]-2)&0xFF; + char crc2 = ModRTU_CRC(t,t[1]-2)>>8; + + pc.printf("%X ",crc1); //%X print char in HEX format + pc.printf("%X ",crc2); //%X print char in HEX format + pc.printf("\nResponse: "); + + // Send Command to STINGR ---------------- + for(int k = 0; k < number; k++) + device.putc(vec[k]); + device.putc(crc1); + device.putc(crc2); + + // Post Command -------------------------- + Thread::wait(10); //comment? // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones + //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 + RTS=1; + Thread::wait(150); //comment? + pc.printf("\n\rCTS: %d\n\r",CTS.read()); + flag=1; + // --------------------------------------- + counter++; + + }// else statement ends + + if (counter < 30) + { + for(int u = 0; u < 2; u++) + Thread::wait(60000); // LOOP delay. 1 minuto (Note: units are in milliseconds) + } + else + { + for(int u = 0; u < 30; u++) + Thread::wait(60000); // LOOP delay. 1 minuto (Note: units are in milliseconds) + } + }// LOOP (while statement) ends____________________________________________ + +}// main function ends -//0x06 Setup -void _setup() -{ - led3=!led3; - pc.printf("\r0x06 Setup\n"); - pc.printf("Command(HEX):\t\tAA 0E 06 00 00 00 00 00 03 18 30 00 CE 9C\n\r"); - pc.printf("Response(HEX):\t\t"); - waitCTS(); - Thread::wait(10); - stingr.putc(0XAA); - stingr.putc(0X0E); - stingr.putc(0X06); - stingr.putc(0X00); - stingr.putc(0X00); - stingr.putc(0X00); - stingr.putc(0X00); - stingr.putc(0X00); - stingr.putc(0X03); - stingr.putc(0X18); - stingr.putc(0X30); - stingr.putc(0X00); - stingr.putc(0XCE); - stingr.putc(0X9C); - postCommand(); -} - -//0x07 Query Setup -long int querySetup() +/* +void stx3() { - int numSetup = 0; - led4=!led4; - pc.printf("\r0x07 Query Setup\n"); - pc.printf("Command(HEX):\t\tAA 5 7 66 B0\n\r"); - pc.printf("Response(HEX):\t\t"); - waitCTS(); - Thread::wait(10); - - stingr.putc(0XAA); - stingr.putc(0X05); - stingr.putc(0X07); - stingr.putc(0X66); - stingr.putc(0XB0); - - postCommand(); - - //If NAK response - if (packet[0] == 170 && // 0xAA - packet[1] == 5 && // 0x05 - packet[2] == 255 && // 0xFF - packet[3] == 161 && // 0xA1 - packet[4] == 203) // 0xCB - { - clearPacket(); - return NULL; + wait(200); // Se da un tiempo para que el analizador se estabilice + incomingByte=0; + 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 + 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 + RTS=0; + // Se manda un pulso en bajo en RTS, para inicial el proceso de transmisión + while(flag==1) + { // Flag inicialmente vale 1, así que el ciclo while cambiará hasta que esa condición no se cumpla + 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) + pc.printf("El valor de flag es %d\n\r", flag); // Se imprime el valor de flag, para identificar cuando termina el ciclo while } - numSetup = packet[7]*10000000 + packet[8]*100000 + packet[9]*1000 + packet[10]; - clearPacket(); - return numSetup; } - -//0x09 Query Hardware -void queryHardware() -{ - led1=!led1; - pc.printf("\r0x09 Query Hardware Version\n"); - pc.printf("Command(HEX):\t\tAA 5 9 18 59\n\r"); - pc.printf("Response(HEX):\t\t"); - waitCTS(); - Thread::wait(10); - - stingr.putc(0XAA); - stingr.putc(0X05); - stingr.putc(0X09); - stingr.putc(0X18); - stingr.putc(0X59); - - postCommand(); - printPacket(); - clearPacket(); - pc.printf("\n"); -} - -//NAK Command -void NAKcommand() -{ - led2=!led2; - pc.printf("\rXxXX NAK\n"); - pc.printf("Command(HEX):\t\tAA 5 7 66 B1\n\r"); - pc.printf("Response(HEX):\t\t"); - waitCTS(); - Thread::wait(10); - - stingr.putc(0XAA); - stingr.putc(0X05); - stingr.putc(0X07); - stingr.putc(0X66); - stingr.putc(0XB1); - - postCommand(); - printPacket(); - clearPacket(); - pc.printf("\n"); -} +*/ uint16_t ModRTU_CRC(char * buf, int len) { @@ -605,9 +208,40 @@ return (crc); } -void combine(char* s, char c) +void respuesta() +{ + while(1) + { + if(device.readable()) + { // Se esperan datos provenientes del TX del módulo STX3 + incomingByte = device.getc(); + packet[num] = incomingByte; + pc.printf("%X",incomingByte); // Format specifier + pc.printf(" "); + num++; + } + } +} + +void clearPacket() //reuired function for respuesta { - int len = strlen(s); - s[len] = c; - s[len+1] = '\0'; -} \ No newline at end of file + num = 0; + for(int i = 0; i < 15 ; i++) + packet[i] = 0; +} + +void waitCTS() +{ + Thread::wait(200); // Se da un tiempo para que el analizador se estabilice + incomingByte=0; + //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 + //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 + RTS=0; // Se manda un pulso en bajo en RTS, para inicial el proceso de transmisión + + while(flag==1) + {// Flag inicialmente vale 1, así que el ciclo while cambiará hasta que esa condición no se cumpla + 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) + //pc.printf("El valor de flag es %d\n\r", flag); // Se imprime el valor de flag, para identificar cuando termina el ciclo while + } +} +