diff --git a/Firmware/Tools/VcServerTest.c b/Firmware/Tools/VcServerTest.c index 28de675f..d4ebcfab 100644 --- a/Firmware/Tools/VcServerTest.c +++ b/Firmware/Tools/VcServerTest.c @@ -7,9 +7,9 @@ #define POLL_TIMEOUT_USEC 1000 #endif // POLL_TIMEOUT_USEC -#define ONE_SECOND_COUNT 20 // (1000000 / POLL_TIMEOUT_USEC) +#define ONE_SECOND_COUNT (1000000 / POLL_TIMEOUT_USEC) #define COMMAND_POLL_COUNT (ONE_SECOND_COUNT / 10) //100 mSec -#define STALL_CHECK_COUNT 15 * ONE_SECOND_COUNT //15 Sec +#define STALL_CHECK_COUNT 5 * ONE_SECOND_COUNT //5 Sec #define BUFFER_SIZE 2048 #define INPUT_BUFFER_SIZE BUFFER_SIZE @@ -22,7 +22,7 @@ #define GET_DEVICE_INFO "ati" #define GET_MY_VC_ADDRESS "ati30" #define GET_UNIQUE_ID "ati8" -#define GET_VC_STATE "ati12" +#define GET_VC_STATE "ati31" #define GET_VC_STATUS "ata" #define LINK_RESET_COMMAND "atz" #define MY_VC_ADDRESS "myVc: " @@ -35,11 +35,11 @@ #define DISPLAY_COMMAND_COMPLETE 0 #define DISPLAY_DATA_ACK 0 #define DISPLAY_DATA_NACK 1 +#define DISPLAY_RESOURCE_USAGE 0 #define DISPLAY_STATE_TRANSITION 0 #define DISPLAY_UNKNOWN_COMMANDS 0 #define DISPLAY_VC_STATE 0 #define DUMP_RADIO_TO_PC 0 -#define SEND_ATC_COMMAND 1 #define QUEUE_T uint32_t #define QUEUE_T_BITS ((int)(sizeof(QUEUE_T) * 8)) @@ -90,43 +90,22 @@ typedef enum { //List commands in priority order - CMD_ATI11 = 0, //Get myVC + CMD_ATI30 = 0, //Get myVC CMD_ATB, //Break all VC links + CMD_ATI, //Get the device type + CMD_ATI8, //Get the radio's unique ID CMD_ATA, //Get VC status + + //Connect to the remote radio CMD_AT_CMDVC, //Select target VC CMD_ATC, //Start the 3-way handshake CMD_WAIT_CONNECTED, //Wait until the client is connected - CMD_AT_CMDVC_2, //Select target VC - CMD_ATI12, //Get the VC state - CMD_GET_SERVER_MODEL, //Get the model name - CMD_GET_CLIENT_MODEL, //Get the model name - CMD_ATI, //Get the device type - CMD_ATI8, //Get the radio's unique ID - CMD_AT_DISABLE_CONTROLLER, //Disable the sprinkler controller - CMD_AT_DAY_OF_WEEK, //Set the day of week - CMD_AT_TIME_OF_DAY, //Set the time of day - CMD_ATI89, //Display the date and time - - //Select the solenoids for each of the zone - CMD_SELECT_ZONE, //Select the zone number - CMD_SELECT_SOLENOID, //Select the solenoid for the zone - COMPLETE_ZONE_CONFIGURATION,//Verify that all of the zones are configured - - //Set the start times - CMD_SET_DAY_OF_WEEK, //Set the day of the week - CMD_SET_START_TIME, //Set the start time - CMD_SET_ALL_START_TIMES, //Verify that all of the start times are set - - //Set the zone durations - CMD_SET_DAY_OF_WEEK_2, //Set the day of the week - CMD_SELECT_ZONE_2, //Select the zone number - CMD_SET_ZONE_DURATION, //Set the zone on duration - CMD_SET_ALL_DURATIONS, //Verify that all of the durations are set -/* -#define SET_MANUAL_ON "AT-ZoneManualOn=" -#define SET_ZONE_DURATION "AT-ZoneDuration=" -*/ + //Get remote radio connection status, type and ID + CMD_AT_CMDVC_2, //Select target VC + CMD_ATI31, //Get the VC state + CMD_ATI_2, //Get the device type + CMD_ATI8_2, //Get the radio's unique ID //Last in the list CMD_LIST_SIZE @@ -134,15 +113,11 @@ typedef enum const char * const commandName[] = { - "ATI11", "ATIB", "ATA", "AT-CMDVC", "ATC", "WAIT_CONNECT", "AT-CMDVC_2", "ATI12", - "ATI93", "ATI81", "ATI", "ATI8", "AT-EnableController=0", - "AT-DayOfWeek", "AT-TimeOfDay", "ATI89", - "AT-CommandZone", "AT-LatchingSolenoid", "COMPLETE_ZONE_CONFIGURATION", - "AT-CommandDay", "AT-StartTime", "CMD_SET_ALL_START_TIMES", - "AT-CommandDay-2", "AT-CommandZone-2", "AT-ZoneDuration", "CMD_SET_ALL_DURATIONS", + "ATI30", "ATIB", "ATI", "ATI8", "ATA", "AT-CMDVC", "ATC", + "WAIT_CONNECT", + "AT-CMDVC_2", "ATI31", "ATI_2", "ATI8_2", }; - typedef struct _VIRTUAL_CIRCUIT { int vcState; @@ -161,7 +136,7 @@ int myVc = VC_SERVER; uint8_t outputBuffer[VC_SERIAL_HEADER_BYTES + BUFFER_SIZE]; uint32_t pcActiveCommand = CMD_LIST_SIZE; char pcCommandBuffer[128]; -uint8_t pcCommandQueue[COMMAND_QUEUE_SIZE]; +QUEUE_T pcCommandQueue[COMMAND_QUEUE_SIZE]; uint32_t pcCommandTimer; int pcCommandVc = MAX_VC; uint8_t remoteCommandVc; @@ -470,7 +445,6 @@ int hostToStdout(VC_SERIAL_MESSAGE_HEADER * header, uint8_t * data, uint8_t byte void radioToPcLinkStatus(VC_SERIAL_MESSAGE_HEADER * header, uint8_t * data, uint8_t length) { - int durationBase; int newState; int previousState; int srcVc; @@ -554,9 +528,15 @@ void radioToPcLinkStatus(VC_SERIAL_MESSAGE_HEADER * header, uint8_t * data, uint { if (DEBUG_PC_CMD_ISSUE) printf("VC %d ALIVE\n", srcVc); - COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, virtualCircuitList[srcVc].commandTimer, CMD_AT_CMDVC); - COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, virtualCircuitList[srcVc].commandTimer, CMD_ATC); - COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, virtualCircuitList[srcVc].commandTimer, CMD_WAIT_CONNECTED); + COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, + virtualCircuitList[srcVc].commandTimer, + CMD_AT_CMDVC); + COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, + virtualCircuitList[srcVc].commandTimer, + CMD_ATC); + COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, + virtualCircuitList[srcVc].commandTimer, + CMD_WAIT_CONNECTED); } if (DISPLAY_VC_STATE) @@ -595,24 +575,25 @@ void radioToPcLinkStatus(VC_SERIAL_MESSAGE_HEADER * header, uint8_t * data, uint { if (virtualCircuitList[srcVc].activeCommand == CMD_ATC) COMMAND_COMPLETE(virtualCircuitList[srcVc].commandQueue, virtualCircuitList[srcVc].activeCommand); - - //Get the device information - if (srcVc == VC_SERVER) - { - COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATI); - COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATI8); - } - else - { - COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, virtualCircuitList[srcVc].commandTimer, CMD_AT_CMDVC_2); - COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, virtualCircuitList[srcVc].commandTimer, CMD_ATI12); - COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, virtualCircuitList[srcVc].commandTimer, CMD_ATI); - COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, virtualCircuitList[srcVc].commandTimer, CMD_ATI8); - } } COMMAND_COMPLETE(pcCommandQueue, pcActiveCommand); if (DISPLAY_VC_STATE) printf("======= VC %d CONNECTED ======\n", srcVc); + if (srcVc != myVc) + { + COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, + virtualCircuitList[srcVc].commandTimer, + CMD_AT_CMDVC_2); + COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, + virtualCircuitList[srcVc].commandTimer, + CMD_ATI31); + COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, + virtualCircuitList[srcVc].commandTimer, + CMD_ATI_2); + COMMAND_ISSUE(virtualCircuitList[srcVc].commandQueue, + virtualCircuitList[srcVc].commandTimer, + CMD_ATI8_2); + } break; } @@ -673,20 +654,23 @@ void radioCommandComplete(VC_SERIAL_MESSAGE_HEADER * header, uint8_t * data, uin { if (pcCommandVc < MAX_VC) { - COMMAND_COMPLETE(virtualCircuitList[pcCommandVc].commandQueue, virtualCircuitList[pcCommandVc].activeCommand); + COMMAND_COMPLETE(virtualCircuitList[pcCommandVc].commandQueue, + virtualCircuitList[pcCommandVc].activeCommand); } COMMAND_COMPLETE(pcCommandQueue, pcActiveCommand); } else if (virtualCircuitList[pcCommandVc].activeCommand < CMD_LIST_SIZE) { //This was a VC command - COMMAND_COMPLETE(virtualCircuitList[srcVc].commandQueue, virtualCircuitList[srcVc].activeCommand); + COMMAND_COMPLETE(virtualCircuitList[srcVc].commandQueue, + virtualCircuitList[srcVc].activeCommand); } } else { //This was a VC command - COMMAND_COMPLETE(virtualCircuitList[srcVc].commandQueue, virtualCircuitList[srcVc].activeCommand); + COMMAND_COMPLETE(virtualCircuitList[srcVc].commandQueue, + virtualCircuitList[srcVc].activeCommand); } vcMsg = (VC_COMMAND_COMPLETE_MESSAGE *)data; @@ -863,27 +847,39 @@ void issuePcCommands() pcActiveCommand = cmd; switch (cmd) { - case CMD_ATB: //Break all of the VC links - if (DEBUG_PC_CMD_ISSUE) - printf("Issuing ATB command\n"); - cmdToRadio((uint8_t *)BREAK_LINKS_COMMAND, strlen(BREAK_LINKS_COMMAND)); - return; - - case CMD_ATI11: //Get myVC + case CMD_ATI30: //Get myVC if (myVc == VC_UNASSIGNED) { //Get myVc address if (DEBUG_PC_CMD_ISSUE) - printf("Issuing ATI11 command\n"); + printf("Issuing ATI30 command\n"); findMyVc = true; cmdToRadio((uint8_t *)GET_MY_VC_ADDRESS, strlen(GET_MY_VC_ADDRESS)); return; } if (DEBUG_PC_CMD_ISSUE) - printf("Skipping ATI11 command, myVC already known\n"); + printf("Skipping ATI30 command, myVC already known\n"); COMMAND_COMPLETE(pcCommandQueue, pcActiveCommand); break; + case CMD_ATB: //Break all of the VC links + if (DEBUG_PC_CMD_ISSUE) + printf("Issuing ATB command\n"); + cmdToRadio((uint8_t *)BREAK_LINKS_COMMAND, strlen(BREAK_LINKS_COMMAND)); + return; + + case CMD_ATI: + if (DEBUG_PC_CMD_ISSUE) + printf("Issuing ATI command\n"); + cmdToRadio((uint8_t *)GET_DEVICE_INFO, strlen(GET_DEVICE_INFO)); + return; + + case CMD_ATI8: + if (DEBUG_PC_CMD_ISSUE) + printf("Issuing ATI8 command\n"); + cmdToRadio((uint8_t *)GET_UNIQUE_ID, strlen(GET_UNIQUE_ID)); + return; + case CMD_ATA: //Get all the VC states if (DEBUG_PC_CMD_ISSUE) printf("Issuing ATA command\n"); @@ -906,24 +902,12 @@ void issuePcCommands() cmdToRadio((uint8_t *)START_3_WAY_HANDSHAKE, strlen(START_3_WAY_HANDSHAKE)); return; - case CMD_ATI12: + case CMD_ATI31: //Get the VC state if (DEBUG_PC_CMD_ISSUE) - printf("Issuing ATI12 command\n"); + printf("Issuing ATI31 command\n"); cmdToRadio((uint8_t *)GET_VC_STATE, strlen(GET_VC_STATE)); return; - - case CMD_ATI: - if (DEBUG_PC_CMD_ISSUE) - printf("Issuing ATI command\n"); - cmdToRadio((uint8_t *)GET_DEVICE_INFO, strlen(GET_DEVICE_INFO)); - return; - - case CMD_ATI8: - if (DEBUG_PC_CMD_ISSUE) - printf("Issuing ATI8 command\n"); - cmdToRadio((uint8_t *)GET_UNIQUE_ID, strlen(GET_UNIQUE_ID)); - return; } } } @@ -1070,7 +1054,7 @@ bool issueVcCommands(int vcIndex) //Get the VC state COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_AT_CMDVC_2); - COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATI12); + COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATI31); break; case CMD_AT_CMDVC_2: @@ -1078,23 +1062,23 @@ bool issueVcCommands(int vcIndex) if (commandProcessorIdle(vcIndex)) { if (DEBUG_PC_CMD_ISSUE) - printf("Migrating AT-CMDVC and ATI12 commands to PC command queue\n"); + printf("Migrating AT-CMDVC_2 and ATI31 commands to PC command queue\n"); COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_AT_CMDVC_2); - if (COMMAND_PENDING(virtualCircuitList[vcIndex].commandQueue, CMD_ATI12)) - COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATI12); + if (COMMAND_PENDING(virtualCircuitList[vcIndex].commandQueue, CMD_ATI31)) + COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATI31); return true; } virtualCircuitList[vcIndex].activeCommand = CMD_LIST_SIZE; return true; - case CMD_ATI12: + case CMD_ATI31: return true; - case CMD_ATI: + case CMD_ATI_2: sendVcCommand(GET_DEVICE_INFO, vcIndex); return true; - case CMD_ATI8: + case CMD_ATI8_2: sendVcCommand(GET_UNIQUE_ID, vcIndex); return true; } @@ -1212,7 +1196,9 @@ int main(int argc, char **argv) //Perform the initialization commands pcCommandTimer = 1; - COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATI11); //Get myVC + COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATI30); //Get myVC + COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATI); //Get Radio type + COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATI8); //Get Radio unique ID COMMAND_ISSUE(pcCommandQueue, pcCommandTimer, CMD_ATA); //Get all the VC states //Break the links if requested @@ -1300,7 +1286,7 @@ int main(int argc, char **argv) // Check the resource usage //---------------------------------------- - if (!(timeoutCount % (ONE_SECOND_COUNT * 60))) + if (DISPLAY_RESOURCE_USAGE && (!(timeoutCount % (ONE_SECOND_COUNT * 60)))) { struct rusage usage; int s_days;