Boris Tournier
/
WappAutomation2_With_Reset_WO_Switch_Cable
WappAutomation 2 : - WITH RESET - WITHOUT Switch Cable Tested on TEL50
main.cpp@12:81209b6a2318, 2019-12-13 (annotated)
- Committer:
- cybermars
- Date:
- Fri Dec 13 14:17:55 2019 +0000
- Revision:
- 12:81209b6a2318
- Parent:
- 11:275b5ff86ab0
Wapp automation 2 :; - WITH RESET; - WITHOUT Switch Cable
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dalbanf | 0:8814d243dfec | 1 | #include "mbed.h" |
dalbanf | 0:8814d243dfec | 2 | #include "MFRC522.h" |
dalbanf | 0:8814d243dfec | 3 | #include "EthernetInterface.h" |
dalbanf | 0:8814d243dfec | 4 | |
dalbanf | 0:8814d243dfec | 5 | |
dalbanf | 0:8814d243dfec | 6 | //***************************** Change this for each new prober installation ******************************** |
cybermars | 11:275b5ff86ab0 | 7 | #define PROBER_NAME "tl50" |
cybermars | 11:275b5ff86ab0 | 8 | #define IP "10.129.97.130" |
dalbanf | 0:8814d243dfec | 9 | /*Please update the list below: |
dalbanf | 0:8814d243dfec | 10 | TEL12 : 10.129.97.100 |
dalbanf | 0:8814d243dfec | 11 | TEL20 : 10.129.97.101 |
dalbanf | 0:8814d243dfec | 12 | TEL23 : 10.129.97.102 |
dalbanf | 0:8814d243dfec | 13 | TEL36 : 10.129.97.103 |
dalbanf | 5:2b7c8f43efd9 | 14 | TEL01 : 10.129.97.105 |
dalbanf | 5:2b7c8f43efd9 | 15 | TEL19 : 10.129.97.106 |
dalbanf | 5:2b7c8f43efd9 | 16 | TEL27 : 10.129.97.107 |
dalbanf | 6:f7c355fcb302 | 17 | TEL37 : 10.129.97.108 |
dalbanf | 6:f7c355fcb302 | 18 | TEL38 : 10.129.97.109 |
dalbanf | 6:f7c355fcb302 | 19 | TEL39 : 10.129.97.110 |
dalbanf | 6:f7c355fcb302 | 20 | TEL40 : 10.129.97.111 |
dalbanf | 6:f7c355fcb302 | 21 | TEL16 : 10.129.97.112 |
dalbanf | 6:f7c355fcb302 | 22 | TEL21 : 10.129.97.113 |
dalbanf | 6:f7c355fcb302 | 23 | TEL22 : 10.129.97.114 |
dalbanf | 6:f7c355fcb302 | 24 | TEL34 : 10.129.97.115 |
dalbanf | 7:64d536d218c3 | 25 | TEL30 : 10.129.97.116 |
dalbanf | 7:64d536d218c3 | 26 | TEL32 : 10.129.97.117 |
dalbanf | 7:64d536d218c3 | 27 | TEL26 : 10.129.97.118 |
dalbanf | 7:64d536d218c3 | 28 | TEL25 : 10.129.97.119 |
dalbanf | 7:64d536d218c3 | 29 | TEL28 : 10.129.97.120 |
dalbanf | 7:64d536d218c3 | 30 | TEL29 : 10.129.97.121 |
dalbanf | 7:64d536d218c3 | 31 | TEL31 : 10.129.97.122 |
dalbanf | 7:64d536d218c3 | 32 | TEL33 : 10.129.97.123 |
dalbanf | 7:64d536d218c3 | 33 | TEL42 : 10.129.97.124 |
dalbanf | 7:64d536d218c3 | 34 | TEL43 : 10.129.97.125 |
dalbanf | 7:64d536d218c3 | 35 | TEL44 : 10.129.97.126 |
cybermars | 10:4eebb90e8e06 | 36 | TEL45 : 10.129.97.127 |
cybermars | 10:4eebb90e8e06 | 37 | TEL46 : 10.129.97.128 |
cybermars | 10:4eebb90e8e06 | 38 | TEL47 : 10.129.97.129 |
cybermars | 10:4eebb90e8e06 | 39 | TEL48 : 10.129.97.104 |
cybermars | 11:275b5ff86ab0 | 40 | TEL50 : 10.129.97.130 |
dalbanf | 0:8814d243dfec | 41 | ************************************************************************************************************/ |
dalbanf | 0:8814d243dfec | 42 | |
dalbanf | 0:8814d243dfec | 43 | |
dalbanf | 0:8814d243dfec | 44 | //******************************************* RFID Antenna ************************************************** |
dalbanf | 0:8814d243dfec | 45 | //Cheap 13.56 Mhz RFID-RC522 module (This code is based on Martin Olejar's MFRC522 library. Minimal changes) |
dalbanf | 1:24db8b26b816 | 46 | //On Nucleo-F429ZI, SPI1 and SPI2 could not be used in the same time with EthernetInterface -> SPI4 used |
dalbanf | 0:8814d243dfec | 47 | //RFID IRQ=pin5 -> Not used. Leave open |
dalbanf | 0:8814d243dfec | 48 | //RFID MISO=pin4 -> Nucleo SPI_MISO -> White -> PE_5 |
dalbanf | 0:8814d243dfec | 49 | //RFID MOSI=pin3 -> Nucleo SPI_MOSI -> Green -> PE_6 |
dalbanf | 0:8814d243dfec | 50 | //RFID SCK=pin2 -> Nucleo SPI_SCK -> Yellow -> PE_2 |
dalbanf | 0:8814d243dfec | 51 | //RFID SDA=pin1 -> Nucleo SPI_CS -> Blue -> PE_4 |
dalbanf | 0:8814d243dfec | 52 | //RFID RST=pin7 -> Nucleo DigitalOut -> Brown -> D8 |
dalbanf | 0:8814d243dfec | 53 | //*********************************************************************************************************** |
dalbanf | 0:8814d243dfec | 54 | |
dalbanf | 0:8814d243dfec | 55 | |
dalbanf | 0:8814d243dfec | 56 | //********************************************* Antenna LED ************************************************* |
dalbanf | 0:8814d243dfec | 57 | //Anode -> +3.3v pin |
dalbanf | 0:8814d243dfec | 58 | //Cathode -> D3 pin |
dalbanf | 0:8814d243dfec | 59 | //Use LED_ON and LED_OFF to use the LED |
dalbanf | 0:8814d243dfec | 60 | //*********************************************************************************************************** |
dalbanf | 0:8814d243dfec | 61 | |
dalbanf | 0:8814d243dfec | 62 | |
dalbanf | 0:8814d243dfec | 63 | //****************************************** Interlock Relay ************************************************ |
dalbanf | 0:8814d243dfec | 64 | //Power + -> +5v pin |
dalbanf | 0:8814d243dfec | 65 | //Power - -> GND pin |
dalbanf | 0:8814d243dfec | 66 | //Command -> D4 pin |
dalbanf | 0:8814d243dfec | 67 | //Use RELAY_OPEN and RELAY_CLOSE to use the relay |
dalbanf | 0:8814d243dfec | 68 | //*********************************************************************************************************** |
dalbanf | 0:8814d243dfec | 69 | |
dalbanf | 0:8814d243dfec | 70 | |
dalbanf | 0:8814d243dfec | 71 | #define MF_RESET D8 // Nucleo Pin for MFRC522 reset |
dalbanf | 0:8814d243dfec | 72 | #define LED_ON 0 |
dalbanf | 0:8814d243dfec | 73 | #define LED_OFF 1 |
dalbanf | 1:24db8b26b816 | 74 | #define RELAY_CLOSED 0 |
dalbanf | 1:24db8b26b816 | 75 | #define RELAY_OPEN 1 |
dalbanf | 0:8814d243dfec | 76 | |
dalbanf | 0:8814d243dfec | 77 | #define INTERLOCK_DELAY 5000 // Delay (in milliseconds) between alarm received and relay off to simulate open interlock |
dalbanf | 0:8814d243dfec | 78 | #define APCD_READ_DELAY 500 // Delay (in milliseconds) before read the APCD data |
dalbanf | 0:8814d243dfec | 79 | #define SOCKETCONNECTION_ATTEMPT 5 // Number of attempts for socket connection |
dalbanf | 0:8814d243dfec | 80 | #define TIMEOUT_WAITTAG 20 // Timeout in case of New Tag Present detected |
dalbanf | 0:8814d243dfec | 81 | |
dalbanf | 4:caf61234018c | 82 | #define GATEWAY "10.129.97.254" //The gateway to go out the prober VLAN |
dalbanf | 0:8814d243dfec | 83 | #define MASK "255.255.255.0" |
dalbanf | 7:64d536d218c3 | 84 | #define SERVER "10.18.47.90" //Automation server IP Address - { 164, 129, 103, 88 } for Dev Automation server |
dalbanf | 4:caf61234018c | 85 | #define PORT 7778 //Automation port |
dalbanf | 0:8814d243dfec | 86 | |
dalbanf | 4:caf61234018c | 87 | #define MBX_OPEN "MBX_OPEN srvpat" //"MBX_OPEN srv_pat" |
cybermars | 12:81209b6a2318 | 88 | #define MBX_CLOSE "MBX_DISCONNECT" |
dalbanf | 0:8814d243dfec | 89 | #define MBX_COUNT "MBX_COUNT STM32Insrv_" PROBER_NAME |
dalbanf | 0:8814d243dfec | 90 | #define MBX_GET "MBX_GET 5,STM32Insrv_" PROBER_NAME |
dalbanf | 0:8814d243dfec | 91 | #define MBX_PUT_BEGIN "MBX_PUT STM32Outsrv, CMD/A=\"WAPP\" MID/A=\"gnb3t" PROBER_NAME "\" MTY/A=\"E\" WAPPID/A=\"" |
dalbanf | 0:8814d243dfec | 92 | #define MBX_PUT_END "\"" |
dalbanf | 0:8814d243dfec | 93 | |
dalbanf | 0:8814d243dfec | 94 | |
dalbanf | 0:8814d243dfec | 95 | Serial PC(USBTX, USBRX); |
dalbanf | 0:8814d243dfec | 96 | MFRC522 Antenna(PE_6, PE_5, PE_2, PE_4, MF_RESET); |
dalbanf | 0:8814d243dfec | 97 | EthernetInterface eth; |
dalbanf | 0:8814d243dfec | 98 | TCPSocket apcd; |
dalbanf | 0:8814d243dfec | 99 | DigitalIn WappExchangeSwitch(D2); |
dalbanf | 0:8814d243dfec | 100 | DigitalOut TagReadLED(D3); |
dalbanf | 0:8814d243dfec | 101 | DigitalOut Interlock(D4); |
dalbanf | 0:8814d243dfec | 102 | DigitalOut red(LED3); |
dalbanf | 0:8814d243dfec | 103 | DigitalOut blue(LED2); |
dalbanf | 0:8814d243dfec | 104 | DigitalOut green(LED1); |
dalbanf | 0:8814d243dfec | 105 | |
dalbanf | 0:8814d243dfec | 106 | char bufTagID[256]; |
dalbanf | 0:8814d243dfec | 107 | int APCDsendData (char *tcpCmd); |
dalbanf | 0:8814d243dfec | 108 | char *APCDgetData (); |
dalbanf | 0:8814d243dfec | 109 | |
dalbanf | 0:8814d243dfec | 110 | |
dalbanf | 0:8814d243dfec | 111 | //IsTagPresent(): function to read the Tag ID |
dalbanf | 0:8814d243dfec | 112 | // Return false if no Tag present |
dalbanf | 0:8814d243dfec | 113 | // Return true if a Tag ID was read (Tag ID is saved int the bufTagID buffer) |
cybermars | 12:81209b6a2318 | 114 | bool IsTagPresent() |
cybermars | 12:81209b6a2318 | 115 | { |
dalbanf | 9:cfa9a379dbd3 | 116 | /* |
dalbanf | 0:8814d243dfec | 117 | if (Antenna.PICC_IsNewCardPresent() && WappExchangeSwitch == 1){ |
dalbanf | 0:8814d243dfec | 118 | PC.printf("TAG detected ... "); |
cybermars | 12:81209b6a2318 | 119 | |
dalbanf | 0:8814d243dfec | 120 | //Select one of the cards |
dalbanf | 0:8814d243dfec | 121 | int count = 0; |
dalbanf | 0:8814d243dfec | 122 | while (!Antenna.PICC_ReadCardSerial() && WappExchangeSwitch == 1 && count < TIMEOUT_WAITTAG){ |
dalbanf | 0:8814d243dfec | 123 | count++; |
dalbanf | 0:8814d243dfec | 124 | wait_ms(100); |
dalbanf | 0:8814d243dfec | 125 | } |
dalbanf | 0:8814d243dfec | 126 | if (count == TIMEOUT_WAITTAG){ |
dalbanf | 0:8814d243dfec | 127 | PC.printf("Timeout occured -> no Tag present\r\n"); |
dalbanf | 0:8814d243dfec | 128 | return false; |
dalbanf | 0:8814d243dfec | 129 | } |
cybermars | 12:81209b6a2318 | 130 | if (WappExchangeSwitch == 0) return false; |
cybermars | 12:81209b6a2318 | 131 | |
dalbanf | 0:8814d243dfec | 132 | //Light during 1s Tag LED to indicate that a tag was read |
dalbanf | 0:8814d243dfec | 133 | TagReadLED = LED_ON; |
dalbanf | 0:8814d243dfec | 134 | wait_ms(500); |
cybermars | 12:81209b6a2318 | 135 | TagReadLED = LED_OFF; |
cybermars | 12:81209b6a2318 | 136 | |
dalbanf | 0:8814d243dfec | 137 | //Save Tag ID into buffer |
dalbanf | 0:8814d243dfec | 138 | PC.printf("ID = "); |
dalbanf | 0:8814d243dfec | 139 | int pos = 0; |
dalbanf | 0:8814d243dfec | 140 | char hexbuf[2]; |
dalbanf | 0:8814d243dfec | 141 | for (int i = 0; i < 256; i++) bufTagID[i] = '\0'; |
dalbanf | 0:8814d243dfec | 142 | for (uint8_t i = 0; i < Antenna.uid.size; i++) { |
dalbanf | 0:8814d243dfec | 143 | sprintf(hexbuf, "%02x", Antenna.uid.uidByte[i]); |
dalbanf | 0:8814d243dfec | 144 | PC.putc(hexbuf[0]); |
dalbanf | 0:8814d243dfec | 145 | PC.putc(hexbuf[1]); |
dalbanf | 0:8814d243dfec | 146 | bufTagID[pos] = hexbuf[0]; |
dalbanf | 0:8814d243dfec | 147 | pos++; |
dalbanf | 0:8814d243dfec | 148 | bufTagID[pos] = hexbuf[1]; |
dalbanf | 0:8814d243dfec | 149 | pos++; |
dalbanf | 0:8814d243dfec | 150 | } |
cybermars | 12:81209b6a2318 | 151 | PC.printf("\r\n"); |
dalbanf | 0:8814d243dfec | 152 | return true; |
dalbanf | 0:8814d243dfec | 153 | } |
dalbanf | 0:8814d243dfec | 154 | else return false; |
dalbanf | 9:cfa9a379dbd3 | 155 | */ |
cybermars | 12:81209b6a2318 | 156 | |
dalbanf | 9:cfa9a379dbd3 | 157 | //Look for new cards during 5s |
dalbanf | 9:cfa9a379dbd3 | 158 | int timeout = 0; |
cybermars | 12:81209b6a2318 | 159 | while ( ! Antenna.PICC_IsNewCardPresent() == 1 && timeout < TIMEOUT_WAITTAG) { |
dalbanf | 9:cfa9a379dbd3 | 160 | wait_ms(100); |
dalbanf | 9:cfa9a379dbd3 | 161 | timeout++; |
dalbanf | 9:cfa9a379dbd3 | 162 | } |
dalbanf | 9:cfa9a379dbd3 | 163 | if (timeout >= TIMEOUT_WAITTAG) { |
dalbanf | 9:cfa9a379dbd3 | 164 | PC.printf("Timeout occured -> no Tag present\r\n"); |
dalbanf | 9:cfa9a379dbd3 | 165 | return false; |
dalbanf | 9:cfa9a379dbd3 | 166 | } |
cybermars | 12:81209b6a2318 | 167 | //if (WappExchangeSwitch == 0) return false; |
cybermars | 12:81209b6a2318 | 168 | PC.printf("TAG detected ... "); |
dalbanf | 9:cfa9a379dbd3 | 169 | |
dalbanf | 9:cfa9a379dbd3 | 170 | //pc.printf("Yes, tag is present... Try to read Tag ID\r\n"); |
cybermars | 12:81209b6a2318 | 171 | |
dalbanf | 9:cfa9a379dbd3 | 172 | //Select one of the cards |
dalbanf | 9:cfa9a379dbd3 | 173 | timeout = 0; |
cybermars | 12:81209b6a2318 | 174 | while ( ! Antenna.PICC_ReadCardSerial() == 1 && timeout < TIMEOUT_WAITTAG) { |
dalbanf | 9:cfa9a379dbd3 | 175 | wait_ms(100); |
dalbanf | 9:cfa9a379dbd3 | 176 | timeout++; |
dalbanf | 9:cfa9a379dbd3 | 177 | } |
dalbanf | 9:cfa9a379dbd3 | 178 | if (timeout >= TIMEOUT_WAITTAG) { |
dalbanf | 9:cfa9a379dbd3 | 179 | PC.printf("Timeout occured during ReadCardSerial\r\n"); |
dalbanf | 9:cfa9a379dbd3 | 180 | return false; |
dalbanf | 9:cfa9a379dbd3 | 181 | } |
cybermars | 12:81209b6a2318 | 182 | //if (WappExchangeSwitch == 0) return false; |
cybermars | 12:81209b6a2318 | 183 | |
dalbanf | 9:cfa9a379dbd3 | 184 | //Light during 1s Tag LED to indicate that a tag was read |
dalbanf | 9:cfa9a379dbd3 | 185 | TagReadLED = LED_ON; |
dalbanf | 9:cfa9a379dbd3 | 186 | wait_ms(500); |
cybermars | 12:81209b6a2318 | 187 | TagReadLED = LED_OFF; |
cybermars | 12:81209b6a2318 | 188 | |
dalbanf | 9:cfa9a379dbd3 | 189 | //Save Tag ID into buffer |
dalbanf | 9:cfa9a379dbd3 | 190 | PC.printf("ID = "); |
dalbanf | 9:cfa9a379dbd3 | 191 | int pos = 0; |
dalbanf | 9:cfa9a379dbd3 | 192 | char hexbuf[2]; |
dalbanf | 9:cfa9a379dbd3 | 193 | for (int i = 0; i < 256; i++) bufTagID[i] = '\0'; |
dalbanf | 9:cfa9a379dbd3 | 194 | for (uint8_t i = 0; i < Antenna.uid.size; i++) { |
dalbanf | 9:cfa9a379dbd3 | 195 | sprintf(hexbuf, "%02x", Antenna.uid.uidByte[i]); |
dalbanf | 9:cfa9a379dbd3 | 196 | PC.putc(hexbuf[0]); |
dalbanf | 9:cfa9a379dbd3 | 197 | PC.putc(hexbuf[1]); |
dalbanf | 9:cfa9a379dbd3 | 198 | bufTagID[pos] = hexbuf[0]; |
dalbanf | 9:cfa9a379dbd3 | 199 | pos++; |
dalbanf | 9:cfa9a379dbd3 | 200 | bufTagID[pos] = hexbuf[1]; |
dalbanf | 9:cfa9a379dbd3 | 201 | pos++; |
dalbanf | 9:cfa9a379dbd3 | 202 | } |
dalbanf | 9:cfa9a379dbd3 | 203 | PC.printf("\r\n"); |
cybermars | 12:81209b6a2318 | 204 | |
dalbanf | 9:cfa9a379dbd3 | 205 | return true; |
dalbanf | 0:8814d243dfec | 206 | } |
dalbanf | 0:8814d243dfec | 207 | |
dalbanf | 0:8814d243dfec | 208 | //APCDGetWappAlarm: function to check from APCD mailbox if a wapp alarm was sent by automation |
dalbanf | 0:8814d243dfec | 209 | // return 1 in case of alarm |
dalbanf | 0:8814d243dfec | 210 | // return 2 if apcd.connect failed |
dalbanf | 0:8814d243dfec | 211 | // return 0 if there is no alarm |
cybermars | 12:81209b6a2318 | 212 | int APCDGetWappAlarm() |
cybermars | 12:81209b6a2318 | 213 | { |
dalbanf | 0:8814d243dfec | 214 | int result = 2; |
dalbanf | 0:8814d243dfec | 215 | int rtrn = 2; |
dalbanf | 0:8814d243dfec | 216 | int attempt = 0; |
cybermars | 12:81209b6a2318 | 217 | |
dalbanf | 0:8814d243dfec | 218 | //Open a TCP socket |
dalbanf | 0:8814d243dfec | 219 | rtrn = apcd.open(ð); |
dalbanf | 0:8814d243dfec | 220 | PC.printf("\r\nAPCDGetWappAlarm:\r\n"); |
dalbanf | 0:8814d243dfec | 221 | PC.printf("\tOpen socket -> %d\r\n", rtrn); |
dalbanf | 0:8814d243dfec | 222 | blue = 1; |
cybermars | 12:81209b6a2318 | 223 | |
dalbanf | 0:8814d243dfec | 224 | //Try APCD connection |
dalbanf | 0:8814d243dfec | 225 | rtrn = apcd.connect(SERVER, PORT); |
cybermars | 12:81209b6a2318 | 226 | while (rtrn < 0 && attempt < SOCKETCONNECTION_ATTEMPT) { |
dalbanf | 0:8814d243dfec | 227 | wait_ms(500); |
dalbanf | 0:8814d243dfec | 228 | rtrn = apcd.connect(SERVER, PORT); |
dalbanf | 0:8814d243dfec | 229 | attempt++; |
dalbanf | 0:8814d243dfec | 230 | } |
dalbanf | 0:8814d243dfec | 231 | PC.printf("\tConnection -> %d\r\n", rtrn); |
cybermars | 12:81209b6a2318 | 232 | |
cybermars | 12:81209b6a2318 | 233 | if (rtrn == 0) { //Automation server connection successfully |
dalbanf | 0:8814d243dfec | 234 | APCDsendData(MBX_OPEN); //Open the APCD bus |
dalbanf | 0:8814d243dfec | 235 | APCDgetData(); |
cybermars | 12:81209b6a2318 | 236 | |
dalbanf | 0:8814d243dfec | 237 | //Get message's number in the mailbox |
dalbanf | 0:8814d243dfec | 238 | PC.printf("\tAPCD -> %s\r\n", MBX_COUNT); |
cybermars | 12:81209b6a2318 | 239 | APCDsendData(MBX_COUNT); |
cybermars | 12:81209b6a2318 | 240 | |
dalbanf | 0:8814d243dfec | 241 | //Extract the data from the string received |
dalbanf | 0:8814d243dfec | 242 | char buf[256]; |
dalbanf | 0:8814d243dfec | 243 | sprintf(buf,"%s", APCDgetData()); |
dalbanf | 0:8814d243dfec | 244 | unsigned short int answerLen = strlen(buf); |
dalbanf | 0:8814d243dfec | 245 | PC.printf("\tAnswer -> %s\r\n", buf); |
cybermars | 12:81209b6a2318 | 246 | if (answerLen > 10) { //Answer will be MBX_COUNT,xx where xx is the number of message |
dalbanf | 0:8814d243dfec | 247 | int nbMsg = 0; |
dalbanf | 0:8814d243dfec | 248 | char nb[10]; |
dalbanf | 0:8814d243dfec | 249 | int pos = 10; |
cybermars | 12:81209b6a2318 | 250 | while (buf[pos] != '\0' && pos < 20) { |
dalbanf | 0:8814d243dfec | 251 | nb[pos-10] = buf[pos]; |
dalbanf | 0:8814d243dfec | 252 | pos++; |
dalbanf | 0:8814d243dfec | 253 | } |
dalbanf | 0:8814d243dfec | 254 | nb[pos-10] = '\0'; |
dalbanf | 0:8814d243dfec | 255 | nbMsg = atoi(nb); |
dalbanf | 0:8814d243dfec | 256 | PC.printf("\tMsg count -> %d\r\n", nbMsg); |
cybermars | 12:81209b6a2318 | 257 | //If there is a message or more, get all message (=> mailbox will be empty) |
cybermars | 12:81209b6a2318 | 258 | if (nbMsg > 0) { |
dalbanf | 0:8814d243dfec | 259 | result = 1; |
cybermars | 12:81209b6a2318 | 260 | while (nbMsg > 0) { //Get all VFEI message in the mailbox |
dalbanf | 0:8814d243dfec | 261 | PC.printf("\tAPCD -> %s\r\n", MBX_GET); |
dalbanf | 0:8814d243dfec | 262 | APCDsendData(MBX_GET); |
dalbanf | 0:8814d243dfec | 263 | APCDgetData(); |
dalbanf | 0:8814d243dfec | 264 | nbMsg--; |
dalbanf | 0:8814d243dfec | 265 | } |
cybermars | 12:81209b6a2318 | 266 | } else result = 0; |
dalbanf | 0:8814d243dfec | 267 | } |
cybermars | 12:81209b6a2318 | 268 | |
dalbanf | 0:8814d243dfec | 269 | //Close the APCD bus |
cybermars | 12:81209b6a2318 | 270 | APCDsendData(MBX_CLOSE); |
dalbanf | 0:8814d243dfec | 271 | PC.printf("\tAPCD -> %s\r\n", MBX_CLOSE); |
dalbanf | 0:8814d243dfec | 272 | APCDgetData(); |
cybermars | 12:81209b6a2318 | 273 | } else result = 2; |
cybermars | 12:81209b6a2318 | 274 | |
dalbanf | 0:8814d243dfec | 275 | apcd.close(); |
cybermars | 12:81209b6a2318 | 276 | blue = 0; |
dalbanf | 0:8814d243dfec | 277 | return result; |
dalbanf | 0:8814d243dfec | 278 | } |
dalbanf | 0:8814d243dfec | 279 | |
dalbanf | 0:8814d243dfec | 280 | //APCDSendTagID: function to send the VFEI message with TagID to the automation |
dalbanf | 0:8814d243dfec | 281 | // return 1 if data sent correctly |
dalbanf | 0:8814d243dfec | 282 | // return 2 if apcd.connect failed |
dalbanf | 0:8814d243dfec | 283 | // return 0 if sent data lenght doesn't match with message lenght |
cybermars | 12:81209b6a2318 | 284 | int APCDSendTagID() |
cybermars | 12:81209b6a2318 | 285 | { |
dalbanf | 0:8814d243dfec | 286 | int attempt = 0; |
dalbanf | 0:8814d243dfec | 287 | int result = 2; |
dalbanf | 0:8814d243dfec | 288 | int rtrn = 2; |
dalbanf | 0:8814d243dfec | 289 | PC.printf("\r\nAPCDSendTagID:\r\n"); |
dalbanf | 0:8814d243dfec | 290 | |
dalbanf | 0:8814d243dfec | 291 | //Build VFEI message |
dalbanf | 0:8814d243dfec | 292 | char concatBuffer[256]; |
dalbanf | 0:8814d243dfec | 293 | sprintf(concatBuffer, "%s%s%s\0", MBX_PUT_BEGIN, bufTagID, MBX_PUT_END); |
dalbanf | 0:8814d243dfec | 294 | PC.printf("\tVFEI message : %s\r\n", concatBuffer); |
cybermars | 12:81209b6a2318 | 295 | |
dalbanf | 0:8814d243dfec | 296 | //Open a TCP socket |
dalbanf | 0:8814d243dfec | 297 | rtrn = apcd.open(ð); |
dalbanf | 0:8814d243dfec | 298 | PC.printf("\tOpen socket -> %d\r\n", rtrn); |
dalbanf | 0:8814d243dfec | 299 | blue = 1; |
dalbanf | 0:8814d243dfec | 300 | |
dalbanf | 0:8814d243dfec | 301 | //Try APCD connection |
dalbanf | 0:8814d243dfec | 302 | rtrn = apcd.connect(SERVER, PORT); |
cybermars | 12:81209b6a2318 | 303 | while (rtrn < 0 && attempt < SOCKETCONNECTION_ATTEMPT) { |
dalbanf | 0:8814d243dfec | 304 | wait_ms(500); |
dalbanf | 0:8814d243dfec | 305 | rtrn = apcd.connect(SERVER, PORT); |
dalbanf | 0:8814d243dfec | 306 | attempt++; |
dalbanf | 0:8814d243dfec | 307 | } |
dalbanf | 0:8814d243dfec | 308 | PC.printf("\tConnection -> %d\r\n", rtrn); |
dalbanf | 0:8814d243dfec | 309 | |
dalbanf | 0:8814d243dfec | 310 | //Send VFEI message if possible |
cybermars | 12:81209b6a2318 | 311 | if (rtrn == 0) { |
dalbanf | 0:8814d243dfec | 312 | PC.printf("\tAPCD -> %s\r\n", MBX_OPEN); |
dalbanf | 0:8814d243dfec | 313 | APCDsendData(MBX_OPEN); //Open the APCD bus |
dalbanf | 0:8814d243dfec | 314 | APCDgetData(); |
dalbanf | 0:8814d243dfec | 315 | rtrn = APCDsendData(concatBuffer); //Send the VFEI message |
dalbanf | 0:8814d243dfec | 316 | APCDgetData(); |
dalbanf | 0:8814d243dfec | 317 | PC.printf("\tAPCD -> %s\r\n", MBX_CLOSE); |
dalbanf | 0:8814d243dfec | 318 | APCDsendData(MBX_CLOSE); //Close the APCD bus |
dalbanf | 0:8814d243dfec | 319 | APCDgetData(); |
dalbanf | 0:8814d243dfec | 320 | result = 1; |
cybermars | 12:81209b6a2318 | 321 | } else result = 2; |
cybermars | 12:81209b6a2318 | 322 | |
dalbanf | 0:8814d243dfec | 323 | apcd.close(); |
dalbanf | 0:8814d243dfec | 324 | blue = 0; |
dalbanf | 0:8814d243dfec | 325 | return result; |
dalbanf | 0:8814d243dfec | 326 | } |
dalbanf | 0:8814d243dfec | 327 | |
dalbanf | 0:8814d243dfec | 328 | //APCDsendData: function to send data to APCD bus |
dalbanf | 0:8814d243dfec | 329 | // Return 1 if data sent correctly, 0 in other case |
dalbanf | 0:8814d243dfec | 330 | // Author: F. Frezot from Arduino code |
cybermars | 12:81209b6a2318 | 331 | int APCDsendData (char *tcpCmd) |
cybermars | 12:81209b6a2318 | 332 | { |
dalbanf | 0:8814d243dfec | 333 | unsigned short int dataLength = strlen(tcpCmd); |
dalbanf | 0:8814d243dfec | 334 | unsigned char len[2]; |
cybermars | 12:81209b6a2318 | 335 | |
dalbanf | 0:8814d243dfec | 336 | len[0] = ((dataLength>>8)&0xFF); //MSB |
dalbanf | 0:8814d243dfec | 337 | len[1] = ((dataLength>>0)&0xFF); //LSB |
dalbanf | 0:8814d243dfec | 338 | |
dalbanf | 0:8814d243dfec | 339 | int rtrnLenght = apcd.send(len, sizeof(len)); |
dalbanf | 0:8814d243dfec | 340 | rtrnLenght = apcd.send(tcpCmd, dataLength); |
dalbanf | 0:8814d243dfec | 341 | if (rtrnLenght == dataLength) return 1; |
dalbanf | 0:8814d243dfec | 342 | else return 0; |
dalbanf | 0:8814d243dfec | 343 | } |
cybermars | 12:81209b6a2318 | 344 | |
dalbanf | 0:8814d243dfec | 345 | |
dalbanf | 0:8814d243dfec | 346 | //APCDgetData: function to read data from APCD bus |
dalbanf | 0:8814d243dfec | 347 | // Return a char array with data read |
dalbanf | 0:8814d243dfec | 348 | // Author: F. Frezot from Arduino code |
cybermars | 12:81209b6a2318 | 349 | char *APCDgetData () |
cybermars | 12:81209b6a2318 | 350 | { |
dalbanf | 0:8814d243dfec | 351 | char MSB[1]; |
dalbanf | 0:8814d243dfec | 352 | char LSB[1]; |
dalbanf | 0:8814d243dfec | 353 | unsigned short int dataLength; |
dalbanf | 0:8814d243dfec | 354 | char readBuf[256] = "\0"; |
cybermars | 12:81209b6a2318 | 355 | |
dalbanf | 0:8814d243dfec | 356 | wait_ms(APCD_READ_DELAY); |
dalbanf | 0:8814d243dfec | 357 | |
dalbanf | 0:8814d243dfec | 358 | apcd.recv(MSB, 1); |
dalbanf | 0:8814d243dfec | 359 | apcd.recv(LSB, 1); |
cybermars | 12:81209b6a2318 | 360 | dataLength = ((MSB[0]<<8)&0xFF00)|(LSB[0]<<0)&0x00FF; |
dalbanf | 0:8814d243dfec | 361 | apcd.recv(readBuf, dataLength); |
cybermars | 12:81209b6a2318 | 362 | |
dalbanf | 0:8814d243dfec | 363 | return (readBuf); |
cybermars | 12:81209b6a2318 | 364 | } |
dalbanf | 0:8814d243dfec | 365 | |
cybermars | 12:81209b6a2318 | 366 | int main() |
cybermars | 12:81209b6a2318 | 367 | { |
dalbanf | 0:8814d243dfec | 368 | // Init Serial and nucleo board LED (off) |
cybermars | 12:81209b6a2318 | 369 | PC.baud(9600); |
dalbanf | 0:8814d243dfec | 370 | PC.printf("Running ...\r\n"); |
dalbanf | 0:8814d243dfec | 371 | green = 0; |
dalbanf | 0:8814d243dfec | 372 | red = 0; |
dalbanf | 0:8814d243dfec | 373 | blue = 0; |
cybermars | 12:81209b6a2318 | 374 | |
dalbanf | 0:8814d243dfec | 375 | // Init RC522 Chip |
dalbanf | 0:8814d243dfec | 376 | PC.printf("\tInit RFID..."); |
dalbanf | 0:8814d243dfec | 377 | wait_ms(500); |
dalbanf | 0:8814d243dfec | 378 | Antenna.PCD_Init(); |
dalbanf | 0:8814d243dfec | 379 | wait_ms(100); |
cybermars | 12:81209b6a2318 | 380 | Antenna.PCD_AntennaOff(); //Turn off the RFID antenna. |
dalbanf | 0:8814d243dfec | 381 | TagReadLED = LED_OFF; //Turn off the LED who indicate if a TAG was read |
dalbanf | 0:8814d243dfec | 382 | PC.printf("DONE\r\n"); |
dalbanf | 0:8814d243dfec | 383 | |
dalbanf | 1:24db8b26b816 | 384 | //PC.printf("\tClose relay for prober Interlock\r\n"); |
dalbanf | 1:24db8b26b816 | 385 | //Interlock = RELAY_CLOSED; //Close relay for prober interlock |
cybermars | 12:81209b6a2318 | 386 | |
dalbanf | 0:8814d243dfec | 387 | //Ethernet Init |
dalbanf | 0:8814d243dfec | 388 | PC.printf("\tInit Ethernet..."); |
dalbanf | 0:8814d243dfec | 389 | eth.set_network(IP, MASK, GATEWAY); |
dalbanf | 0:8814d243dfec | 390 | int rtrn = eth.connect(); |
cybermars | 10:4eebb90e8e06 | 391 | int reset_eth = 0; |
cybermars | 12:81209b6a2318 | 392 | if (rtrn == 0) { |
dalbanf | 0:8814d243dfec | 393 | PC.printf("DONE\r\n"); |
dalbanf | 0:8814d243dfec | 394 | const char *ip = eth.get_ip_address(); |
dalbanf | 0:8814d243dfec | 395 | const char *mac = eth.get_mac_address(); |
dalbanf | 0:8814d243dfec | 396 | PC.printf("\tIP address = %s\n\r", ip ? ip : "No IP"); |
dalbanf | 0:8814d243dfec | 397 | PC.printf("\tMAC address = %s\n\r", mac ? mac : "No MAC"); |
dalbanf | 0:8814d243dfec | 398 | PC.printf("Running DONE\r\n\r\n"); |
cybermars | 12:81209b6a2318 | 399 | } else { |
dalbanf | 0:8814d243dfec | 400 | PC.printf("FAIL -> Check if Network cable is plug-in then reset the board\r\n"); |
dalbanf | 0:8814d243dfec | 401 | red = 0; |
dalbanf | 0:8814d243dfec | 402 | green = 0; |
dalbanf | 0:8814d243dfec | 403 | PC.printf("Running FAIL -> Program aborted\r\n\r\n"); |
cybermars | 12:81209b6a2318 | 404 | while (reset_eth <= 900) { |
dalbanf | 0:8814d243dfec | 405 | blue = !blue; |
dalbanf | 0:8814d243dfec | 406 | TagReadLED = !TagReadLED; |
dalbanf | 0:8814d243dfec | 407 | wait_ms(200); |
cybermars | 10:4eebb90e8e06 | 408 | reset_eth++; |
dalbanf | 0:8814d243dfec | 409 | } |
cybermars | 10:4eebb90e8e06 | 410 | NVIC_SystemReset(); // reset system if no ethernet connection succeeded after 180sec Added by B. Tournier |
cybermars | 12:81209b6a2318 | 411 | |
dalbanf | 0:8814d243dfec | 412 | } |
cybermars | 12:81209b6a2318 | 413 | |
dalbanf | 0:8814d243dfec | 414 | //Waiting Tag and WAPP alarm |
dalbanf | 0:8814d243dfec | 415 | int count = 0; |
cybermars | 10:4eebb90e8e06 | 416 | int reset_trigger = 0; |
dalbanf | 0:8814d243dfec | 417 | while (true) { |
dalbanf | 0:8814d243dfec | 418 | //Check if Tag read |
cybermars | 12:81209b6a2318 | 419 | //if (true) { |
dalbanf | 0:8814d243dfec | 420 | //Turn on the antenna |
dalbanf | 0:8814d243dfec | 421 | Antenna.PCD_AntennaOn(); |
dalbanf | 0:8814d243dfec | 422 | wait_ms(100); |
cybermars | 12:81209b6a2318 | 423 | |
dalbanf | 0:8814d243dfec | 424 | //Waiting Tag ID |
cybermars | 12:81209b6a2318 | 425 | if (IsTagPresent()) { |
dalbanf | 0:8814d243dfec | 426 | green = 0; |
cybermars | 12:81209b6a2318 | 427 | int rtrn = APCDSendTagID(); |
cybermars | 12:81209b6a2318 | 428 | if (rtrn == 1) { |
dalbanf | 0:8814d243dfec | 429 | PC.printf("\tTag ID sent correctly (Code=%d)\r\n", rtrn); |
dalbanf | 0:8814d243dfec | 430 | red = 0; |
dalbanf | 0:8814d243dfec | 431 | //Blink Tag LED during 3s |
cybermars | 12:81209b6a2318 | 432 | for (int i = 0; i < 10; i++) { |
dalbanf | 0:8814d243dfec | 433 | TagReadLED = !TagReadLED; |
dalbanf | 0:8814d243dfec | 434 | wait_ms(500); |
dalbanf | 0:8814d243dfec | 435 | } |
dalbanf | 0:8814d243dfec | 436 | //Tag LED continuous ON during 1s |
dalbanf | 0:8814d243dfec | 437 | TagReadLED = LED_ON; |
dalbanf | 0:8814d243dfec | 438 | wait_ms(2000); |
cybermars | 12:81209b6a2318 | 439 | |
dalbanf | 0:8814d243dfec | 440 | //Turn off Tag LED |
cybermars | 12:81209b6a2318 | 441 | TagReadLED = LED_OFF; |
cybermars | 12:81209b6a2318 | 442 | } else { |
dalbanf | 0:8814d243dfec | 443 | PC.printf("\tWARNING: Fail to send Tag ID (Code=%d)\r\n", rtrn); |
dalbanf | 0:8814d243dfec | 444 | red = 1; |
dalbanf | 0:8814d243dfec | 445 | } |
dalbanf | 0:8814d243dfec | 446 | } |
dalbanf | 0:8814d243dfec | 447 | Antenna.PCD_AntennaOff(); |
cybermars | 12:81209b6a2318 | 448 | //} |
dalbanf | 0:8814d243dfec | 449 | |
dalbanf | 4:caf61234018c | 450 | //Check alarm each 4s |
cybermars | 12:81209b6a2318 | 451 | if (count >= 8) { // Count value = each xx seconds * 2. Example: Count >= 4 for check alarm each 2s |
dalbanf | 0:8814d243dfec | 452 | green = 0; |
dalbanf | 0:8814d243dfec | 453 | count = -1; |
dalbanf | 0:8814d243dfec | 454 | int rtrn = APCDGetWappAlarm(); |
cybermars | 12:81209b6a2318 | 455 | if (rtrn == 1) { |
dalbanf | 0:8814d243dfec | 456 | red = 0; |
cybermars | 12:81209b6a2318 | 457 | PC.printf("Wapp alarm received"); |
cybermars | 12:81209b6a2318 | 458 | //wait_ms(INTERLOCK_DELAY); |
cybermars | 12:81209b6a2318 | 459 | //Interlock = RELAY_OPEN; //Activate the relay on prober interlock |
cybermars | 12:81209b6a2318 | 460 | wait_ms(2000); |
cybermars | 12:81209b6a2318 | 461 | //Interlock = RELAY_CLOSED; |
cybermars | 12:81209b6a2318 | 462 | //PC.printf(" -> Close interlock relay\r\n"); |
cybermars | 12:81209b6a2318 | 463 | } else if (rtrn == 2) { |
dalbanf | 0:8814d243dfec | 464 | PC.printf("WARNING: Fail to check if alarm is present (Code=%d)\r\n", rtrn); |
dalbanf | 0:8814d243dfec | 465 | red = 1; |
cybermars | 12:81209b6a2318 | 466 | } else if (rtrn == 0) { |
dalbanf | 0:8814d243dfec | 467 | red = 0; |
dalbanf | 0:8814d243dfec | 468 | } |
cybermars | 12:81209b6a2318 | 469 | } |
dalbanf | 0:8814d243dfec | 470 | |
dalbanf | 0:8814d243dfec | 471 | green = !green; |
dalbanf | 0:8814d243dfec | 472 | count++; |
cybermars | 10:4eebb90e8e06 | 473 | reset_trigger++; |
dalbanf | 0:8814d243dfec | 474 | wait_ms(500); |
cybermars | 12:81209b6a2318 | 475 | if (reset_trigger >= 14400) { |
cybermars | 10:4eebb90e8e06 | 476 | NVIC_SystemReset(); // reset system each 2 hours |
cybermars | 10:4eebb90e8e06 | 477 | } |
dalbanf | 0:8814d243dfec | 478 | } |
cybermars | 10:4eebb90e8e06 | 479 | } |