#include <errno.h>
#include <ctype.h>
-#include <scheduler.h>
-#include <clock_time.h>
#include <parse.h>
#include <rdline.h>
#include <timer.h>
#include "main.h"
struct xbeeboard xbeeboard;
-volatile uint16_t global_ms;
-struct callout_manager cm;
+volatile uint32_t global_ms;
#define TIMEOUT_MS 1000
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:
return -1;
}
}
/* socat /dev/ttyUSB0,raw,echo=0,b115200 /dev/ttyACM1,raw,echo=0,b115200 */
-void xbeeapp_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;
- int do_hexdump = xbee_hexdump;
+ int8_t ret = 0;
if (xbee_debug)
printf_P(PSTR("type=0x%x, channel=%d, ctx=%p\r\n"),
/* 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)
- do_hexdump = 1;
+ ret = -1;
+
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)
- do_hexdump = 1;
+ ret = -1;
+
break;
}
case XBEE_TYPE_NODE_ID:
default:
printf_P(PSTR("Invalid frame\r\n"));
- do_hexdump = 1;
+ ret = -1;
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 */
xbee_cmdline_input_enabled = 0;
}
-static void evt_timeout(struct callout_manager *cm, struct callout *clt,
+static void evt_timeout(struct callout_mgr *cm, struct callout *clt,
void *arg)
{
struct xbee_ctx *ctx = arg;
/* free event */
xbee_unregister_channel(xbee_dev, ctx->channel);
+
+ callout_stop(cm, clt);
}
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(&xbeeboard.mainloop_cm, &ctx->timeout, TIMEOUT_MS);
}
void xbee_unload_timeout(struct xbee_ctx *ctx)
{
- callout_stop(&cm, &ctx->timeout);
+ callout_stop(&xbeeboard.mainloop_cm, &ctx->timeout);
}
void bootloader(void)
void xbee_mainloop(void)
{
while (1) {
- callout_manage(&cm);
+ callout_manage(&xbeeboard.mainloop_cm);
if (xbee_raw) {
int16_t c;
/* return time in milliseconds on unsigned 16 bits */
static uint16_t get_time_ms(void)
{
- return global_ms;
+ return (uint16_t)global_ms;
}
static void main_timer_interrupt(void)
cpt++;
- /* interrupt every 2048 cycles */
- cycles += 2048;
- if (cycles >= 12000) {
- cycles -= 12000;
- global_ms ++;
- }
-
/* LED blink */
if (global_ms & 0x80)
LED1_ON();
else
BUZZER_OFF();
- /* call scheduler every 682us with interrupt unlocked */
+ /* interrupt every 2048 cycles */
+ cycles += 2048;
+ if (cycles >= 12000) {
+ cycles -= 12000;
+ global_ms ++;
+ }
+
+ /* called every 682us (at 12 Mhz), but global_ms is not incremented at
+ * each call */
sei();
- if ((cpt & 0x3) == 0)
- scheduler_interrupt();
+ callout_manage(&xbeeboard.intr_cm);
}
int main(void)
fdevopen(cmdline_dev_send, cmdline_dev_recv);
xbee_file = fdevopen(xbee_dev_send, xbee_dev_recv);
- scheduler_init();
timer_init();
timer0_register_OV_intr(main_timer_interrupt);
+ callout_mgr_init(&xbeeboard.intr_cm, get_time_ms);
+ callout_mgr_init(&xbeeboard.mainloop_cm, get_time_ms);
+
cmdline_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_reset(&cm, &t1, 500, PERIODICAL, do_led_blink, NULL);
-
/* initialize libxbee */
err = xbee_init();
if (err < 0)
sei();
eeprom_load_config();
+
+ printf_P(PSTR("\r\n"));
+ rdline_newline(&xbeeboard.rdl, xbeeboard.prompt);
+
xbee_mainloop();
return 0;
}