Nurbol Nurdaulet / Mbed 2 deprecated 2sensors_2servo_22_11_11
Committer:
Nurbol
Date:
Tue Nov 22 18:26:01 2011 +0000
Revision:
1:9b749b30afc9
Parent:
0:e5b9c99f23f2

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nurbol 0:e5b9c99f23f2 1 //
Nurbol 0:e5b9c99f23f2 2 // cmd_io.cpp : library of routines to communicate with virtual COM port
Nurbol 0:e5b9c99f23f2 3 // ==========
Nurbol 0:e5b9c99f23f2 4 //
Nurbol 0:e5b9c99f23f2 5 #include "mbed.h"
Nurbol 0:e5b9c99f23f2 6 #include "cmd_io.h"
Nurbol 0:e5b9c99f23f2 7 #include "globals.h"
Nurbol 0:e5b9c99f23f2 8
Nurbol 0:e5b9c99f23f2 9 //************************************************************************
Nurbol 0:e5b9c99f23f2 10 //
Nurbol 0:e5b9c99f23f2 11 // get_cmd - read a command string from the serial port
Nurbol 0:e5b9c99f23f2 12 // =======
Nurbol 0:e5b9c99f23f2 13 //
Nurbol 0:e5b9c99f23f2 14 // Method
Nurbol 0:e5b9c99f23f2 15 // 1. Read string of data until a Newline character
Nurbol 0:e5b9c99f23f2 16 // string is passed as the parameter
Nurbol 0:e5b9c99f23f2 17 // 2. return a sting through the pointer and a count of the number of characters
Nurbol 0:e5b9c99f23f2 18 //
Nurbol 0:e5b9c99f23f2 19 // Notes
Nurbol 0:e5b9c99f23f2 20 //
Nurbol 0:e5b9c99f23f2 21 uint32_t get_cmd(CMD_STRUCT *command)
Nurbol 0:e5b9c99f23f2 22 {
Nurbol 0:e5b9c99f23f2 23 char ch;
Nurbol 0:e5b9c99f23f2 24 uint8_t i;
Nurbol 0:e5b9c99f23f2 25 //
Nurbol 0:e5b9c99f23f2 26 // read string and use newline as terminator
Nurbol 0:e5b9c99f23f2 27 //
Nurbol 0:e5b9c99f23f2 28 for (i= 0 ; i < CMD_STR_BUFFER_SZ ; i++) {
Nurbol 0:e5b9c99f23f2 29 ch = pc.getc();
Nurbol 0:e5b9c99f23f2 30 if (ch == '\r') {
Nurbol 0:e5b9c99f23f2 31 continue;
Nurbol 0:e5b9c99f23f2 32 }
Nurbol 0:e5b9c99f23f2 33 command->cmd_str[i] = ch;
Nurbol 0:e5b9c99f23f2 34 if (ch == '\n') {
Nurbol 0:e5b9c99f23f2 35 command->cmd_str[i] = '\0';
Nurbol 0:e5b9c99f23f2 36 break;
Nurbol 0:e5b9c99f23f2 37 }
Nurbol 0:e5b9c99f23f2 38 }
Nurbol 0:e5b9c99f23f2 39 command->char_cnt = i; // record character count
Nurbol 0:e5b9c99f23f2 40 command->result_status = OK;
Nurbol 0:e5b9c99f23f2 41 return 0;
Nurbol 0:e5b9c99f23f2 42 }
Nurbol 0:e5b9c99f23f2 43
Nurbol 0:e5b9c99f23f2 44 //************************************************************************
Nurbol 0:e5b9c99f23f2 45 //
Nurbol 0:e5b9c99f23f2 46 // parse_cmd - split command into its component parts
Nurbol 0:e5b9c99f23f2 47 // =========
Nurbol 0:e5b9c99f23f2 48 //
Nurbol 0:e5b9c99f23f2 49 // Method
Nurbol 0:e5b9c99f23f2 50 // 1. first character is the command code
Nurbol 0:e5b9c99f23f2 51 // 2. subsequent character define a set of parameters
Nurbol 0:e5b9c99f23f2 52 //
Nurbol 0:e5b9c99f23f2 53 // String is located in the CMD_STRUCT and the resulting
Nurbol 0:e5b9c99f23f2 54 // data is returned to the same structure.
Nurbol 0:e5b9c99f23f2 55 //
Nurbol 0:e5b9c99f23f2 56 // Notes
Nurbol 0:e5b9c99f23f2 57 //
Nurbol 0:e5b9c99f23f2 58 uint32_t parse_cmd(CMD_STRUCT *command)
Nurbol 0:e5b9c99f23f2 59 {
Nurbol 0:e5b9c99f23f2 60 uint8_t param_cnt, i, state;
Nurbol 0:e5b9c99f23f2 61 uint16_t tmp;
Nurbol 0:e5b9c99f23f2 62
Nurbol 0:e5b9c99f23f2 63 command->cmd_code = command->cmd_str[0];
Nurbol 0:e5b9c99f23f2 64 param_cnt = 0;
Nurbol 0:e5b9c99f23f2 65 tmp = 0;
Nurbol 0:e5b9c99f23f2 66 state = 0;
Nurbol 0:e5b9c99f23f2 67 for (i=1 ; i < CMD_STR_BUFFER_SZ ; i++) { // step through characters
Nurbol 0:e5b9c99f23f2 68 if (command->cmd_str[i] == '\0') {
Nurbol 0:e5b9c99f23f2 69 if (state == 1) { // count paramter that is terminated by NEWLINE
Nurbol 0:e5b9c99f23f2 70 command->param[param_cnt] = tmp;
Nurbol 0:e5b9c99f23f2 71 param_cnt++;
Nurbol 0:e5b9c99f23f2 72 }
Nurbol 0:e5b9c99f23f2 73 command->nos_params = param_cnt;
Nurbol 0:e5b9c99f23f2 74 return OK;
Nurbol 0:e5b9c99f23f2 75 }
Nurbol 0:e5b9c99f23f2 76 if ((command->cmd_str[i] == ' ') && (state == 0)) { // skip spaces
Nurbol 0:e5b9c99f23f2 77 continue;
Nurbol 0:e5b9c99f23f2 78 }
Nurbol 0:e5b9c99f23f2 79 if ((command->cmd_str[i] == ' ') && (state == 1)) { // skip spaces
Nurbol 0:e5b9c99f23f2 80 state = 0;
Nurbol 0:e5b9c99f23f2 81 command->param[param_cnt] = tmp;
Nurbol 0:e5b9c99f23f2 82 param_cnt++;
Nurbol 0:e5b9c99f23f2 83 tmp = 0;
Nurbol 0:e5b9c99f23f2 84 continue;
Nurbol 0:e5b9c99f23f2 85 }
Nurbol 0:e5b9c99f23f2 86 state = 1;
Nurbol 0:e5b9c99f23f2 87 if ((command->cmd_str[i] >= '0') && (command->cmd_str[i] <= '9')) {
Nurbol 0:e5b9c99f23f2 88 tmp = (tmp * 10) + (command->cmd_str[i] - '0');
Nurbol 0:e5b9c99f23f2 89 } else {
Nurbol 0:e5b9c99f23f2 90 command->param[param_cnt] = tmp;
Nurbol 0:e5b9c99f23f2 91 return CMD_BAD_CHARACTER;
Nurbol 0:e5b9c99f23f2 92 }
Nurbol 0:e5b9c99f23f2 93 }
Nurbol 0:e5b9c99f23f2 94 return CMD_NO_TERMINATOR;
Nurbol 0:e5b9c99f23f2 95 }
Nurbol 0:e5b9c99f23f2 96
Nurbol 0:e5b9c99f23f2 97 //************************************************************************
Nurbol 0:e5b9c99f23f2 98 //
Nurbol 0:e5b9c99f23f2 99 // reply_to_cmd - return data and status info
Nurbol 0:e5b9c99f23f2 100 // ============
Nurbol 0:e5b9c99f23f2 101 //
Nurbol 0:e5b9c99f23f2 102 // Method
Nurbol 0:e5b9c99f23f2 103 //
Nurbol 0:e5b9c99f23f2 104 // Notes
Nurbol 0:e5b9c99f23f2 105 //
Nurbol 0:e5b9c99f23f2 106 void reply_to_cmd(CMD_STRUCT *command)
Nurbol 0:e5b9c99f23f2 107 {
Nurbol 0:e5b9c99f23f2 108 send_status(command->result_status);
Nurbol 0:e5b9c99f23f2 109 if ((command->result_status == OK) && (command->nos_data > 0)) {
Nurbol 0:e5b9c99f23f2 110 send_data(command);
Nurbol 0:e5b9c99f23f2 111 }
Nurbol 0:e5b9c99f23f2 112 }
Nurbol 0:e5b9c99f23f2 113
Nurbol 0:e5b9c99f23f2 114 //************************************************************************
Nurbol 0:e5b9c99f23f2 115 //
Nurbol 0:e5b9c99f23f2 116 // send_status - command status
Nurbol 0:e5b9c99f23f2 117 // ===========
Nurbol 0:e5b9c99f23f2 118 //
Nurbol 0:e5b9c99f23f2 119 // Notes
Nurbol 0:e5b9c99f23f2 120 // return status value as a positive interger in a string format
Nurbol 0:e5b9c99f23f2 121 // with a terminating newline character.
Nurbol 0:e5b9c99f23f2 122 //
Nurbol 0:e5b9c99f23f2 123 void send_status(uint32_t value)
Nurbol 0:e5b9c99f23f2 124 {
Nurbol 0:e5b9c99f23f2 125 pc.printf("%d\n", value);
Nurbol 0:e5b9c99f23f2 126 return;
Nurbol 0:e5b9c99f23f2 127 }
Nurbol 0:e5b9c99f23f2 128
Nurbol 0:e5b9c99f23f2 129 //************************************************************************
Nurbol 0:e5b9c99f23f2 130 //
Nurbol 0:e5b9c99f23f2 131 // send_data - send data appropriate to the command
Nurbol 0:e5b9c99f23f2 132 // =========
Nurbol 0:e5b9c99f23f2 133 //
Nurbol 0:e5b9c99f23f2 134 // Method
Nurbol 0:e5b9c99f23f2 135 //
Nurbol 0:e5b9c99f23f2 136 // Notes
Nurbol 0:e5b9c99f23f2 137 //
Nurbol 0:e5b9c99f23f2 138 void send_data(CMD_STRUCT *command)
Nurbol 0:e5b9c99f23f2 139 {
Nurbol 0:e5b9c99f23f2 140 char buffer[80];
Nurbol 0:e5b9c99f23f2 141 uint8_t i;
Nurbol 0:e5b9c99f23f2 142 //
Nurbol 0:e5b9c99f23f2 143 // create data string
Nurbol 0:e5b9c99f23f2 144 //
Nurbol 0:e5b9c99f23f2 145 if (command->nos_data == 1) {
Nurbol 0:e5b9c99f23f2 146 sprintf(buffer, "%u\n", (int)command->result_data[0]);
Nurbol 0:e5b9c99f23f2 147 }
Nurbol 0:e5b9c99f23f2 148 if (command->nos_data == 2) {
Nurbol 0:e5b9c99f23f2 149 sprintf(buffer, "%u %u\n", (int)command->result_data[0], (int)command->result_data[1]);
Nurbol 0:e5b9c99f23f2 150 }
Nurbol 0:e5b9c99f23f2 151 //
Nurbol 0:e5b9c99f23f2 152 // send string
Nurbol 0:e5b9c99f23f2 153 //
Nurbol 0:e5b9c99f23f2 154 for (i = 0 ; i < 40 ; i++) {
Nurbol 0:e5b9c99f23f2 155 if (buffer[i] == '\0') { // do not send NULL character
Nurbol 0:e5b9c99f23f2 156 return;
Nurbol 0:e5b9c99f23f2 157 }
Nurbol 0:e5b9c99f23f2 158 pc.putc(buffer[i]);
Nurbol 0:e5b9c99f23f2 159 }
Nurbol 0:e5b9c99f23f2 160 return;
Nurbol 0:e5b9c99f23f2 161 }