diff --git a/groundStation/src/backend/backend.c b/groundStation/src/backend/backend.c index ca3e9b8bef5a13523ab2fada71181d0dbe975c63..9bf8aa57b5b3b802c7dd27e093b21b175e66912a 100644 --- a/groundStation/src/backend/backend.c +++ b/groundStation/src/backend/backend.c @@ -616,8 +616,9 @@ static void client_recv(int fd) { buffer[newline] = '\0'; printf("Client(%d) : '%s'\n",fd, buffer); - unsigned char * packet; - if(formatCommand(buffer, &packet) == -1) { + unsigned char packet[1024]; + ssize_t packetSize; + if((packetSize = formatCommand(buffer, packet)) == -1) { /* buffer was not a quad command, handling internally to * backend instead of forwarding to quad */ @@ -658,13 +659,14 @@ static void client_recv(int fd) { } } + /* Don't know about this */ int datalen = (packet[6] << 8) | (packet[5]); printf("sending %lf '", getFloat(packet, 7)); for(int i = 0; i < datalen + 8; ++i) { printf(" 0x%.2x", (signed) packet[i]); } printf("'\n"); - writeQuad((char *) packet, datalen +8); + writeQuad((char *) packet, packetSize); } char * rest = &buffer[newline] + 1; @@ -680,7 +682,7 @@ static void quad_recv() { */ int validPacket; - unsigned char *data; + unsigned char data[256]; metadata_t metadata; static unsigned char respBuf[2048]; static size_t respBufLen; @@ -703,7 +705,7 @@ static void quad_recv() { } // Validate the message is correctly formatted - validPacket = parse_packet((unsigned char *) respBuf, &data, &metadata); + validPacket = parse_packet((unsigned char *) respBuf, data, &metadata); if (validPacket == -1) { warnx("Doesn't have start byte."); /* nuke packet */ diff --git a/groundStation/src/backend/communication.c b/groundStation/src/backend/communication.c index 8e328dd7ea149a396a35eeed5e4e75c44137a0db..af5d92a2db9a0332497edffa16bd448d0ccfeca7 100644 --- a/groundStation/src/backend/communication.c +++ b/groundStation/src/backend/communication.c @@ -4,151 +4,84 @@ #include <ctype.h> static int msgNum = 0; - -tokenList_t tokenize(char* cmd) { - int maxTokens = 16; - tokenList_t ret; - ret.numTokens = 0; - ret.tokens = malloc(sizeof(char*) * maxTokens); - ret.tokens[0] = NULL; - - int i = 0; - char* token = strtok(cmd, " "); - while (token != NULL && i < maxTokens - 1) { - ret.tokens[i++] = token; - ret.tokens[i] = NULL; - ret.numTokens++; - token = strtok(NULL, " "); - } - - return ret; -} - -int checkFloat(char *floatString, float *value) { - char *tmp; - *value = strtod(floatString, &tmp); - if(!(isspace(*tmp) || *tmp == 0)) { - fprintf(stderr, "%s is not a valid floating-point number\n", floatString); - return 0; - } - return 1; -} - -int checkInt(char *intString, int *value) { - char *tmp; - long temp_long; - temp_long = strtol(intString, &tmp, 0); // base 10 number inputted - if(temp_long < INT_MIN || temp_long > INT_MAX || !(isspace(*tmp) || *tmp == 0)) { - fprintf(stderr, "%s is not a valid integer number\n", intString); - return 0; - } - printf("temp: %ld\n\n", temp_long); - *value = (int) temp_long; - return 1; -} - //-------------------------------- // Ground Station //-------------------------------- // Formatting commands from ground station CLI -int formatCommand(char *command, unsigned char **formattedCommand) { +int formatCommand(char *command, unsigned char *formattedCommand) { //fprintf(stderr, "length = %li , received '%s'\n", strlen(command), command); - char cmd[strlen(command)]; - strncpy(cmd, command, strlen(command)); - cmd[strlen(command)] = '\0'; + char cmd[512]; + strncpy(cmd, command, 512); + + char * cmdText = strtok(cmd, " "); - tokenList_t tokens = tokenize(cmd); - float floatValue = 0.0; - int intValue = 0; - int valid; metadata_t metadata; // ---------------------------------------------- - if(tokens.numTokens > 0) { + if(cmdText != NULL) { for(int type = 0; type < MAX_TYPE_ID; type++) { - if(strcmp(tokens.tokens[0], MessageTypes[type].cmdText) == 0) + if(strcmp(cmdText, MessageTypes[type].cmdText) == 0) { printf("Sending\n\ttype: %d, \n\tcommand: %s\n", type, MessageTypes[type].cmdText); + metadata.begin_char = (char) BEGIN_CHAR; + metadata.msg_type = type; + metadata.msg_id = msgNum++; + metadata.data_len = 0; + + /* TODO: Format data correctly - * - Switch on Type instead of cmdDataType * - Implement a case for every type - * - Format the tokens as appropriate for the type, + * - Format the tokens into data as appropriate for the type, * based on the quad's callbacks.c. - * - Pass the formatted tokens and metadata into + * - Pass the data and metadata into * formatPacket * - Purge cmdDataType from existence */ - // Make sure the second token is the right type - switch (MessageTypes[type].cmdDataType) - { - // 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.data_len = sizeof(floatValue); - } else { - metadata.data_len = 0; - } - metadata.msg_id = msgNum++; - formatPacket(&metadata, &floatValue, formattedCommand); + /* Static data buffer */ + char data[256]; + switch (type) { + // In each case, us strtok(NULL, " ") to tokenize, + // format, + // and append to data buffer (increase + // metadat.data_len appropriately). + case DEBUG_ID: break; - - // Validate the integer input - 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.data_len = sizeof(intValue); - } else { - metadata.data_len = 0; - } - - metadata.msg_id = msgNum++; - formatPacket(&metadata, &intValue, formattedCommand); - + case PACKETLOG_ID: break; - - // Validate the string input (doesn't need to happen) - 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); - + case GETPACKETLOGS_ID: + break; + case UPDATE_ID: + break; + case BEGINUPDATE_ID: + break; + case LOG_ID: + break; + case RESPONSE_ID: + break; + case SETCONTROL_ID: + break; + case GETCONTROL_ID: + break; + case RESPCONTROL_ID: break; default: - return -1; + break; + } - return 0; + return formatPacket(&metadata, data, formattedCommand); } } } - // Only gets here if the command does not exist return -1; } // QUAD & Ground Station // Format the log data from log_message -//int formatData(unsigned char *log_msg, unsigned char *formattedCommand) -int formatPacket(metadata_t *metadata, void *data, unsigned char **formattedCommand) +int formatPacket(metadata_t *metadata, void *data, unsigned char *formattedCommand) { - *formattedCommand = malloc(sizeof(unsigned char) * metadata->data_len + 8); //---------------------------------------------------------------------------------------------- // index|| 0 | 1 | 2 | 3 & 4 | 5 & 6 | 7+ | end | //---------------------------------------------------------------------------------------------| @@ -158,21 +91,21 @@ int formatPacket(metadata_t *metadata, void *data, unsigned char **formattedComm //---------------------------------------------------------------------------------------------- // Begin Char: - (*formattedCommand)[0] = metadata->begin_char; + formattedCommand[0] = metadata->begin_char; // Msg type: - (*formattedCommand)[1] = metadata->msg_type; - (*formattedCommand)[2] = ((metadata->msg_type >> 8) & 0x000000ff); + formattedCommand[1] = metadata->msg_type; + 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); + 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; + formattedCommand[5] = metadata->data_len & 0x000000ff; + formattedCommand[6] = (metadata->data_len >> 8) & 0x000000ff; - memcpy(&((*formattedCommand)[7]), data, metadata->data_len); + memcpy(&(formattedCommand[7]), data, metadata->data_len); // Checksum // receive data and calculate checksum @@ -180,12 +113,13 @@ int formatPacket(metadata_t *metadata, void *data, unsigned char **formattedComm char data_checksum = 0; for(i = 0; i < 7 + metadata->data_len; i++) { - data_checksum ^= (*formattedCommand)[i]; + data_checksum ^= formattedCommand[i]; } - (*formattedCommand)[7 + metadata->data_len] = data_checksum; + formattedCommand[7 + metadata->data_len] = data_checksum; - return 0; + /* Return data length */ + return metadata->data_len + 7; } // returns the length of the data in bytes (datalen from packet) and fills data @@ -196,7 +130,7 @@ int formatPacket(metadata_t *metadata, void *data, unsigned char **formattedComm // data is an unallocated (char *) (pass it to this function as &data) // meta_data is a pointer to an instance of metadata_t // -int parse_packet(unsigned char * packet, unsigned char ** data, metadata_t * meta_data) +int parse_packet(unsigned char * packet, unsigned char * data, metadata_t * meta_data) { //---------------------------------------------------------------------------------------------- // index|| 0 | 1 | 2 | 3 & 4 | 5 & 6 | 7+ | end | @@ -221,10 +155,9 @@ int parse_packet(unsigned char * packet, unsigned char ** data, metadata_t * met int i; // receive data - *data = malloc(meta_data->data_len); for(i = 0; i < meta_data->data_len; i++) { - (*data)[i] = packet[7+i]; + data[i] = packet[7+i]; } // calculate checksum @@ -245,11 +178,11 @@ int parse_packet(unsigned char * packet, unsigned char ** data, metadata_t * met // Process the command received int processCommand(unsigned char *packet, modular_structs_t *structs) { int validPacket; - unsigned char *data; + unsigned char data[256]; metadata_t metadata; // Validate the message is correctly formatted - validPacket = parse_packet(packet, &data, &metadata); + validPacket = parse_packet(packet, data, &metadata); if(validPacket != 0) { return -1; } diff --git a/groundStation/src/backend/communication.h b/groundStation/src/backend/communication.h index 364814e3674b25a868e5e516e0bc626dd976b295..f3439f26605357edb7b6575cabfce8ffc6fdb36d 100644 --- a/groundStation/src/backend/communication.h +++ b/groundStation/src/backend/communication.h @@ -7,13 +7,10 @@ #include <limits.h> #include "type_def.h" -tokenList_t tokenize(char* cmd); -int checkFloat(char *floatString, float *value); -int checkInt(char *intString, int *value); -int formatCommand(char *command, unsigned char **formattedCommand); -int formatPacket(metadata_t *metadata, void *data, unsigned char **formattedCommand); -int parse_packet(unsigned char * packet, unsigned char ** data, metadata_t * meta_data); +int formatCommand(char *command, unsigned char *formattedCommand); +int formatPacket(metadata_t *metadata, void *data, unsigned char *formattedCommand); +int parse_packet(unsigned char * packet, unsigned char * data, metadata_t * meta_data); int processCommand(unsigned char *command, modular_structs_t *structs); int logData(unsigned char *log_msg, unsigned char *formattedCommand); -#endif /* __COMMUNICATION_H */ \ No newline at end of file +#endif /* __COMMUNICATION_H */