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