git.droids-corp.org
/
protos
/
xbee-avr.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
use callout from aversive
[protos/xbee-avr.git]
/
main.c
diff --git
a/main.c
b/main.c
index
8e2aa0e
..
3959ee4
100644
(file)
--- a/
main.c
+++ b/
main.c
@@
-26,7
+26,7
@@
*/
/* fuses:
*/
/* fuses:
- * avrdude -p atmega1284p -P usb -c avrispmkii -U lfuse:w:0xff:m -U hfuse:w:0x9
9
:m -U efuse:w:0xff:m
+ * avrdude -p atmega1284p -P usb -c avrispmkii -U lfuse:w:0xff:m -U hfuse:w:0x9
1
:m -U efuse:w:0xff:m
*/
#include <aversive.h>
*/
#include <aversive.h>
@@
-52,12
+52,13
@@
#include <rdline.h>
#include <timer.h>
#include <rdline.h>
#include <timer.h>
+#include "eeprom_config.h"
#include "beep.h"
#include "main.h"
struct xbeeboard xbeeboard;
volatile uint16_t global_ms;
#include "beep.h"
#include "main.h"
struct xbeeboard xbeeboard;
volatile uint16_t global_ms;
-struct callout_m
anage
r cm;
+struct callout_m
g
r cm;
#define TIMEOUT_MS 1000
#define TIMEOUT_MS 1000
@@
-202,15
+203,16
@@
static int dump_atcmd(struct xbee_ctx *ctx, struct xbee_atresp_hdr *frame,
result = (void *)frame->data;
len -= offsetof(struct xbee_atresp_hdr, data);
if (cmd.flags & XBEE_ATCMD_F_PARAM_U8 && len == sizeof(uint8_t))
result = (void *)frame->data;
len -= offsetof(struct xbee_atresp_hdr, data);
if (cmd.flags & XBEE_ATCMD_F_PARAM_U8 && len == sizeof(uint8_t))
- printf_P(PSTR("<%s> is 0x%x\r\n"), atcmd_str, result->u8);
+ printf_P(PSTR("<%s> is 0x%x (%d)\r\n"), atcmd_str, result->u8,
+ result->u8);
else if (cmd.flags & XBEE_ATCMD_F_PARAM_U16 && len == sizeof(uint16_t))
else if (cmd.flags & XBEE_ATCMD_F_PARAM_U16 && len == sizeof(uint16_t))
- printf_P(PSTR("<%s> is 0x%x\r\n"),
+ printf_P(PSTR("<%s> is 0x%x
(%d)
\r\n"),
atcmd_str,
atcmd_str,
- ntohs(result->u16));
+ ntohs(result->u16)
, ntohs(result->u16)
);
else if (cmd.flags & XBEE_ATCMD_F_PARAM_U32 && len == sizeof(uint32_t))
else if (cmd.flags & XBEE_ATCMD_F_PARAM_U32 && len == sizeof(uint32_t))
- printf_P(PSTR("<%s> is 0x%"PRIx32"\r\n"),
+ printf_P(PSTR("<%s> is 0x%"PRIx32"
(%"PRIu32")
\r\n"),
atcmd_str,
atcmd_str,
- ntohl(result->u32));
+ ntohl(result->u32)
, ntohs(result->u32)
);
else if (cmd.flags & XBEE_ATCMD_F_PARAM_S16 && len == sizeof(int16_t))
printf_P(PSTR("<%s> is %d\r\n"), atcmd_str, ntohs(result->s16));
else if (len == 0)
else if (cmd.flags & XBEE_ATCMD_F_PARAM_S16 && len == sizeof(int16_t))
printf_P(PSTR("<%s> is %d\r\n"), atcmd_str, ntohs(result->s16));
else if (len == 0)
@@
-236,6
+238,7
@@
int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len)
return -1;
switch (rch->type) {
return -1;
switch (rch->type) {
+#if 0
case RC_PROTO_TYPE_CHANNEL: {
struct rc_proto_channel *rcc =
(struct rc_proto_channel *) recvframe->data;
case RC_PROTO_TYPE_CHANNEL: {
struct rc_proto_channel *rcc =
(struct rc_proto_channel *) recvframe->data;
@@
-247,7
+250,7
@@
int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len)
val += 512;
spi_servo_set(0, val);
break;
val += 512;
spi_servo_set(0, val);
break;
-
}
+ }
case RC_PROTO_TYPE_RANGE: {
struct rc_proto_range *rcr =
(struct rc_proto_range *) recvframe->data;
case RC_PROTO_TYPE_RANGE: {
struct rc_proto_range *rcr =
(struct rc_proto_range *) recvframe->data;
@@
-260,6
+263,17
@@
int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len)
rc_proto_rx_range(rcr->power_level);
rc_proto_rx_range(rcr->power_level);
+ break;
+ }
+#endif
+ case RC_PROTO_HELLO: {
+ struct rc_proto_hello *rch =
+ (struct rc_proto_hello *) recvframe->data;
+
+ if (xbee_debug)
+ printf_P(PSTR("recv hello len=%d\r\n"),
+ rch->datalen);
+
break;
}
default:
break;
}
default:
@@
-270,11
+284,11
@@
int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len)
}
/* socat /dev/ttyUSB0,raw,echo=0,b115200 /dev/ttyACM1,raw,echo=0,b115200 */
}
/* socat /dev/ttyUSB0,raw,echo=0,b115200 /dev/ttyACM1,raw,echo=0,b115200 */
-
void xbee
_rx(struct xbee_dev *dev, int channel, int type,
+
int8_t xbeeapp
_rx(struct xbee_dev *dev, int channel, int type,
void *frame, unsigned len, void *opaque)
{
struct xbee_ctx *ctx = opaque;
void *frame, unsigned len, void *opaque)
{
struct xbee_ctx *ctx = opaque;
- int
do_hexdump = xbee_hexdump
;
+ int
8_t ret = 0
;
if (xbee_debug)
printf_P(PSTR("type=0x%x, channel=%d, ctx=%p\r\n"),
if (xbee_debug)
printf_P(PSTR("type=0x%x, channel=%d, ctx=%p\r\n"),
@@
-316,24
+330,28
@@
void xbee_rx(struct xbee_dev *dev, int channel, int type,
/* this answer contains an atcmd answer at offset 10 */
if (dump_atcmd(ctx, frame + 10, len - 10) < 0)
/* this answer contains an atcmd answer at offset 10 */
if (dump_atcmd(ctx, frame + 10, len - 10) < 0)
- do_hexdump = 1;
+ ret = -1;
+
break;
}
case XBEE_TYPE_ATRESP: {
if (dump_atcmd(ctx, frame, len) < 0)
break;
}
case XBEE_TYPE_ATRESP: {
if (dump_atcmd(ctx, frame, len) < 0)
- do_hexdump = 1;
+ ret = -1;
+
break;
}
case XBEE_TYPE_XMIT_STATUS: {
if (parse_xmit_status(ctx, frame, len) < 0)
break;
}
case XBEE_TYPE_XMIT_STATUS: {
if (parse_xmit_status(ctx, frame, len) < 0)
- do_hexdump = 1;
+ ret = -1;
+
break;
}
case XBEE_TYPE_RECV: {
if (xbee_recv_data(frame, len) < 0)
break;
}
case XBEE_TYPE_RECV: {
if (xbee_recv_data(frame, len) < 0)
- do_hexdump = 1;
+ ret = -1;
+
break;
}
break;
}
@@
-346,11
+364,13
@@
void xbee_rx(struct xbee_dev *dev, int channel, int type,
case XBEE_TYPE_NODE_ID:
default:
printf_P(PSTR("Invalid frame\r\n"));
case XBEE_TYPE_NODE_ID:
default:
printf_P(PSTR("Invalid frame\r\n"));
-
do_hexdump =
1;
+
ret = -
1;
break;
}
break;
}
- if (do_hexdump)
+ if (ret < 0)
+ hexdump("undecoded rx frame", frame, len);
+ else if (xbee_hexdump)
hexdump("undecoded rx frame", frame, len);
/* restart command line if it was a blocking query */
hexdump("undecoded rx frame", frame, len);
/* restart command line if it was a blocking query */
@@
-376,7
+396,7
@@
static int xbeeapp_send(struct xbee_ctx *ctx, int type, void *buf, unsigned len,
/* register a channel */
channel = xbee_register_channel(xbee_dev, XBEE_CHANNEL_ANY,
/* register a channel */
channel = xbee_register_channel(xbee_dev, XBEE_CHANNEL_ANY,
- xbee_rx, NULL);
+ xbee
app
_rx, NULL);
if (channel < 0) {
printf_P(PSTR("cannot send: no free channel\r\n"));
return -1;
if (channel < 0) {
printf_P(PSTR("cannot send: no free channel\r\n"));
return -1;
@@
-394,8
+414,7
@@
static int xbeeapp_send(struct xbee_ctx *ctx, int type, void *buf, unsigned len,
hexdump("xmit frame", buf, len);
/* transmit the frame on this channel */
hexdump("xmit frame", buf, len);
/* transmit the frame on this channel */
- ret = xbee_proto_xmit(xbee_dev, channel, type, buf,
- len);
+ ret = xbee_tx(xbee_dev, channel, type, buf, len);
if (ret < 0) {
printf_P(PSTR("cannot send\r\n"));
xbee_unregister_channel(xbee_dev, channel);
if (ret < 0) {
printf_P(PSTR("cannot send\r\n"));
xbee_unregister_channel(xbee_dev, channel);
@@
-482,7
+501,7
@@
void xbee_stdin_disable(void)
xbee_cmdline_input_enabled = 0;
}
xbee_cmdline_input_enabled = 0;
}
-static void evt_timeout(struct callout_m
anage
r *cm, struct callout *clt,
+static void evt_timeout(struct callout_m
g
r *cm, struct callout *clt,
void *arg)
{
struct xbee_ctx *ctx = arg;
void *arg)
{
struct xbee_ctx *ctx = arg;
@@
-502,7
+521,8
@@
static void evt_timeout(struct callout_manager *cm, struct callout *clt,
void xbee_load_timeout(struct xbee_ctx *ctx)
{
void xbee_load_timeout(struct xbee_ctx *ctx)
{
- callout_reset(&cm, &ctx->timeout, TIMEOUT_MS, SINGLE, evt_timeout, ctx);
+ callout_init(&ctx->timeout, evt_timeout, ctx, 0);
+ callout_schedule(&cm, &ctx->timeout, TIMEOUT_MS);
}
void xbee_unload_timeout(struct xbee_ctx *ctx)
}
void xbee_unload_timeout(struct xbee_ctx *ctx)
@@
-573,7
+593,7
@@
void xbee_mainloop(void)
else {
if (xbee_cmdline_input_enabled)
cmdline_poll();
else {
if (xbee_cmdline_input_enabled)
cmdline_poll();
- xbee_
proto_
rx(xbee_dev);
+ xbee_rx(xbee_dev);
}
}
}
}
}
}
@@
-637,10
+657,7
@@
int main(void)
spi_servo_init();
beep_init();
spi_servo_init();
beep_init();
- printf_P(PSTR("\r\n"));
- rdline_newline(&xbeeboard.rdl, xbeeboard.prompt);
-
- callout_manager_init(&cm, get_time_ms);
+ callout_mgr_init(&cm, get_time_ms);
//callout_reset(&cm, &t1, 500, PERIODICAL, do_led_blink, NULL);
/* initialize libxbee */
//callout_reset(&cm, &t1, 500, PERIODICAL, do_led_blink, NULL);
/* initialize libxbee */
@@
-656,13
+673,17
@@
int main(void)
/* register default channel with a callback */
if (xbee_register_channel(xbee_dev, XBEE_DEFAULT_CHANNEL,
/* register default channel with a callback */
if (xbee_register_channel(xbee_dev, XBEE_DEFAULT_CHANNEL,
- xbee_rx, NULL) < 0) {
+ xbee
app
_rx, NULL) < 0) {
fprintf(stderr, "cannot register default channel\n");
return -1;
}
fprintf(stderr, "cannot register default channel\n");
return -1;
}
-
sei();
sei();
+ eeprom_load_config();
+
+ printf_P(PSTR("\r\n"));
+ rdline_newline(&xbeeboard.rdl, xbeeboard.prompt);
+
xbee_mainloop();
return 0;
}
xbee_mainloop();
return 0;
}