From 3d03ba5a85131d4eb158efc4901448f04858fa90 Mon Sep 17 00:00:00 2001 From: Jake <j@kedrahos.com> Date: Sun, 29 Jan 2017 16:48:04 -0600 Subject: [PATCH] Compiling, but format is wrong See todos in format_command and parse_packet. --- groundStation/src/backend/backend.c | 17 ++- groundStation/src/backend/callbacks.h | 2 + groundStation/src/backend/communication.c | 172 +++++++++++----------- groundStation/src/backend/type_def.h | 3 +- 4 files changed, 97 insertions(+), 97 deletions(-) diff --git a/groundStation/src/backend/backend.c b/groundStation/src/backend/backend.c index 7efcbc855..ca3e9b8be 100644 --- a/groundStation/src/backend/backend.c +++ b/groundStation/src/backend/backend.c @@ -277,15 +277,14 @@ void sendStartPacket() { metadata_t metadata = { (char) BEGIN_CHAR, - 0x04, - 0x01, - 0x01, + BEGINUPDATE_ID, + 1, 0 }; packet[0] = metadata.begin_char; // BEGIN //PACKET_START_BYTE; - packet[1] = metadata.msg_type; // UPDATE //'U'; // U for vrpn camera update, C for command - packet[2] = metadata.msg_subtype; // BEGIN UPDATE + packet[1] = metadata.msg_type & 0xff; // UPDATE //'U'; // U for vrpn camera update, C for command + packet[2] = (metadata.msg_type >> 8) & 0xff; // BEGIN UPDATE packet[3] = (currMessageID & 0x000000ff); // MSG ID(1) packet[4] = ((currMessageID >> 8) & 0x000000ff); // MSG ID(2) packet[5] = 0; // DATALEN(1) @@ -733,7 +732,13 @@ static void quad_recv() { if (validPacket == 0) { /* At least enough data read to check checksum, and it was good!*/ - char * cmdText = MessageTypes[(int)metadata.msg_type].subtypes[(int)metadata.msg_subtype].cmdText; + char * cmdText = MessageTypes[(int)metadata.msg_type].cmdText; + + /* TODO: Parse data correctly + * - Switch on msg_type + * - Parse data appropriately and format into a string + * - Send append data string to cmdText and send to clients + */ float value = getFloat((unsigned char *)respBuf, 7); //printf("Quad : %s, %lf\n", cmdText, value); diff --git a/groundStation/src/backend/callbacks.h b/groundStation/src/backend/callbacks.h index d04d4fda5..fff664df6 100644 --- a/groundStation/src/backend/callbacks.h +++ b/groundStation/src/backend/callbacks.h @@ -8,4 +8,6 @@ typedef void (command_cb)(unsigned char *command, int dataLen, modular_structs_t *structs); +float getFloat(unsigned char * str, int pos); + #endif /* __CALLBACKS_H */ diff --git a/groundStation/src/backend/communication.c b/groundStation/src/backend/communication.c index ca4e82632..8e328dd7e 100644 --- a/groundStation/src/backend/communication.c +++ b/groundStation/src/backend/communication.c @@ -63,77 +63,79 @@ int formatCommand(char *command, unsigned char **formattedCommand) { int intValue = 0; int valid; metadata_t metadata; - + // ---------------------------------------------- if(tokens.numTokens > 0) { - for(int type = 0; type < MAX_TYPE; type++) + for(int type = 0; type < MAX_TYPE_ID; type++) { - for(int subtype = 0; subtype < MAX_SUBTYPE; subtype++) + if(strcmp(tokens.tokens[0], MessageTypes[type].cmdText) == 0) { - if(strcmp(tokens.tokens[0], MessageTypes[type].subtypes[subtype].cmdText) == 0) + printf("Sending\n\ttype: %d, \n\tcommand: %s\n", type, MessageTypes[type].cmdText); + /* TODO: Format data correctly + * - Switch on Type instead of cmdDataType + * - Implement a case for every type + * - Format the tokens as appropriate for the type, + * based on the quad's callbacks.c. + * - Pass the formatted tokens and metadata into + * formatPacket + * - Purge cmdDataType from existence + */ + // Make sure the second token is the right type + switch (MessageTypes[type].cmdDataType) { - printf("Sending\n\ttype: %d, \n\tsubtype: %d\n\tcommand: %s\n", type, subtype, MessageTypes[type].subtypes[subtype].cmdText); - - // Make sure the second token is the right type - switch (MessageTypes[type].subtypes[subtype].cmdDataType) - { - // Validate the float input - case floatType: - metadata.begin_char = (char) BEGIN_CHAR; - metadata.msg_type = MessageTypes[type].ID; - metadata.msg_subtype = MessageTypes[type].subtypes[subtype].ID; - - if(MessageTypes[type].ID == 0x01) { - valid = checkFloat(tokens.tokens[1], &floatValue); - if(!valid) { - return -1; - } - metadata.data_len = sizeof(floatValue); - } else { - metadata.data_len = 0; + // Validate the float input + case floatType: + metadata.begin_char = (char) BEGIN_CHAR; + metadata.msg_type = type; + + if(type == 0x01) { + valid = checkFloat(tokens.tokens[1], &floatValue); + if(!valid) { + return -1; } - - metadata.msg_id = msgNum++; - formatPacket(&metadata, &floatValue, formattedCommand); - break; - + metadata.data_len = sizeof(floatValue); + } else { + metadata.data_len = 0; + } + + metadata.msg_id = msgNum++; + formatPacket(&metadata, &floatValue, formattedCommand); + break; + // Validate the integer input - case intType: - metadata.begin_char = (char) BEGIN_CHAR; - metadata.msg_type = MessageTypes[type].ID; - metadata.msg_subtype = MessageTypes[type].subtypes[subtype].ID; - - if(MessageTypes[type].ID == 0x01) { - valid = checkInt(tokens.tokens[1], &intValue); - if(!valid) { - return -1; - } - metadata.data_len = sizeof(intValue); - } else { - metadata.data_len = 0; + case intType: + metadata.begin_char = (char) BEGIN_CHAR; + metadata.msg_type = type; + + if(type == 0x01) { + valid = checkInt(tokens.tokens[1], &intValue); + if(!valid) { + return -1; } - - metadata.msg_id = msgNum++; - formatPacket(&metadata, &intValue, formattedCommand); - - break; - + metadata.data_len = sizeof(intValue); + } else { + metadata.data_len = 0; + } + + metadata.msg_id = msgNum++; + formatPacket(&metadata, &intValue, formattedCommand); + + break; + // Validate the string input (doesn't need to happen) - case stringType: - metadata.begin_char = (char) BEGIN_CHAR; - metadata.msg_type = MessageTypes[type].ID; - metadata.msg_subtype = MessageTypes[type].subtypes[subtype].ID; - metadata.msg_id = msgNum++; - metadata.data_len = strlen(tokens.tokens[1]); - - formatPacket(&metadata, &tokens.tokens[1], formattedCommand); - - break; - default: - return -1; - } - return 0; + case stringType: + metadata.begin_char = (char) BEGIN_CHAR; + metadata.msg_type = type; + metadata.msg_id = msgNum++; + metadata.data_len = strlen(tokens.tokens[1]); + + formatPacket(&metadata, &tokens.tokens[1], formattedCommand); + + break; + default: + return -1; } + return 0; } } } @@ -150,30 +152,28 @@ int formatPacket(metadata_t *metadata, void *data, unsigned char **formattedComm //---------------------------------------------------------------------------------------------- // index|| 0 | 1 | 2 | 3 & 4 | 5 & 6 | 7+ | end | //---------------------------------------------------------------------------------------------| - // msg param|| beg char | msg type | msg subtype | msg id | data len (bytes) | data | checksum | + // msg param|| beg char | msg type | msg id | data len (bytes) | data | checksum | //-------------------------------------------------------------------------------------------- | // bytes|| 1 | 1 | 1 | 2 | 2 | var | 1 | //---------------------------------------------------------------------------------------------- - + // Begin Char: (*formattedCommand)[0] = metadata->begin_char; // Msg type: (*formattedCommand)[1] = metadata->msg_type; - - // Msg subtype - (*formattedCommand)[2] = metadata->msg_subtype; - + (*formattedCommand)[2] = ((metadata->msg_type >> 8) & 0x000000ff); + //Msg id (msgNum is 2 bytes) (*formattedCommand)[3] = (metadata->msg_id & 0x000000ff); (*formattedCommand)[4] = ((metadata->msg_id >> 8) & 0x000000ff); - + // Data length and data - bytes 5&6 for len, 7+ for data (*formattedCommand)[5] = metadata->data_len & 0x000000ff; (*formattedCommand)[6] = (metadata->data_len >> 8) & 0x000000ff; - + memcpy(&((*formattedCommand)[7]), data, metadata->data_len); - + // Checksum // receive data and calculate checksum int i; @@ -182,9 +182,9 @@ int formatPacket(metadata_t *metadata, void *data, unsigned char **formattedComm { data_checksum ^= (*formattedCommand)[i]; } - + (*formattedCommand)[7 + metadata->data_len] = data_checksum; - + return 0; } @@ -201,26 +201,25 @@ int parse_packet(unsigned char * packet, unsigned char ** data, metadata_t * met //---------------------------------------------------------------------------------------------- // index|| 0 | 1 | 2 | 3 & 4 | 5 & 6 | 7+ | end | //---------------------------------------------------------------------------------------------| - // msg param|| beg char | msg type | msg subtype | msg id | data len (bytes) | data | checksum | + // msg param|| beg char | msg type | msg id | data len (bytes) | data | checksum | //-------------------------------------------------------------------------------------------- | // bytes|| 1 | 1 | 1 | 2 | 2 | var | 1 | //---------------------------------------------------------------------------------------------- - + // first byte must be the begin char if(packet[0] != 0xBE) return -1; // receive metadata meta_data->begin_char = packet[0]; - meta_data->msg_type = packet[1]; - meta_data->msg_subtype = packet[2]; + meta_data->msg_type = packet[2] << 8 | packet[1]; meta_data->msg_id = (packet[4] << 8) | (packet[3]); meta_data->data_len = (packet[6] << 8) | (packet[5]); unsigned char packet_checksum = packet[7+meta_data->data_len]; //fprintf(stderr, "datalen: %d\n", meta_data->data_len); - + int i; - + // receive data *data = malloc(meta_data->data_len); for(i = 0; i < meta_data->data_len; i++) @@ -243,30 +242,25 @@ int parse_packet(unsigned char * packet, unsigned char ** data, metadata_t * met return 0; } -// QUAD & Ground Station // Process the command received int processCommand(unsigned char *packet, modular_structs_t *structs) { int validPacket; unsigned char *data; metadata_t metadata; - + // Validate the message is correctly formatted validPacket = parse_packet(packet, &data, &metadata); if(validPacket != 0) { return -1; } - + if(metadata.data_len >= 0) { - /* Null check*/ - if (MessageTypes[(unsigned char)metadata.msg_type].subtypes[ - (unsigned char) metadata.msg_subtype].functionPtr) { - // Call the appropriate subtype function - (* (MessageTypes[(unsigned char)metadata.msg_type].subtypes[(unsigned char)metadata.msg_subtype].functionPtr))(data, metadata.data_len, structs); - } - + (* (MessageTypes[(unsigned char)metadata.msg_type].functionPtr))( + data, metadata.data_len, structs); + return 0; } - + // Only gets here if there is an error return -1; } diff --git a/groundStation/src/backend/type_def.h b/groundStation/src/backend/type_def.h index 2a2b8249a..27b5d192e 100644 --- a/groundStation/src/backend/type_def.h +++ b/groundStation/src/backend/type_def.h @@ -27,8 +27,7 @@ enum flight_mode{ //---------------------------------------------------------------------------------------------- typedef struct { char begin_char; - char msg_type; - char msg_subtype; + int msg_type; int msg_id; int data_len; } metadata_t; -- GitLab