altos: Make sure pa to altitude conversion is done with 32 bits
[fw/altos] / src / core / ao_send_packet.c
1 /*
2  * Copyright © 2012 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
16  */
17
18 #include "ao.h"
19
20 #define AO_MAX_SEND     128
21
22 static __xdata uint8_t ao_send[AO_MAX_SEND];
23
24 static uint8_t
25 getnibble(void)
26 {
27         char    c;
28
29         c = getchar();
30         if ('0' <= c && c <= '9')
31                 return c - '0';
32         if ('a' <= c && c <= 'f')
33                 return c - ('a' - 10);
34         if ('A' <= c && c <= 'F')
35                 return c - ('A' - 10);
36         ao_cmd_status = ao_cmd_lex_error;
37         return 0;
38 }
39
40 static void
41 ao_send_packet(void)
42 {
43         __pdata uint16_t count;
44         uint8_t b;
45         __pdata uint8_t i;
46
47         ao_cmd_hex();
48         count = ao_cmd_lex_i;
49         if (ao_cmd_status != ao_cmd_success)
50                 return;
51         if (count > AO_MAX_SEND - 2) {
52                 ao_cmd_status = ao_cmd_syntax_error;
53                 return;
54         }
55         for (i = 0; i < count; i++) {
56                 b = getnibble() << 4;
57                 b |= getnibble();
58                 if (ao_cmd_status != ao_cmd_success)
59                         return;
60                 ao_send[i] = b;
61         }
62         ao_radio_send(ao_send, count);
63 }
64
65 static __code struct ao_cmds ao_send_packet_cmds[] = {
66         { ao_send_packet, "S <len>\0Send packet. Data on next line" },
67         { 0, NULL }
68 };
69
70 void
71 ao_send_packet_init(void)
72 {
73         ao_cmd_register(&ao_send_packet_cmds[0]);
74 }