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