#include <time.h>
#include <netinet/in.h>
#include <sys/queue.h>
+#include <linux/joystick.h>
#include <getopt.h>
#include "xbee_buf.h"
#include "xbee_proto.h"
#include "xbee.h"
+#include "joystick.h"
+#include "rc_proto.h"
#include "main.h"
#define TIMEOUT_US 1000000
/* events */
static struct event stdin_read_event, xbee_read_event;
+static struct event joystick_read_event;
static struct cmdline *xbee_cl;
int xbee_hexdump = 0;
int xbee_debug = 0;
FILE *xbee_logfile;
+static char *joystick_devname = NULL;
+struct joystick_info joyinfo;
void xbeeapp_log(int always_on_stdout, const char *fmt, ...)
{
/* dump frame */
if (atcmd_frame_status(frame, len) == 0) {
+ /* callback */
+ if (ctx->func != NULL)
+ ctx->func(frame, len, ctx->arg);
+
if (len == sizeof(struct xbee_atresp_hdr))
xbeeapp_log(ctx->foreground, "<%s>: ok\n",
ctx->atcmd_query->name);
return 0;
}
+int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len)
+{
+ int datalen = len - sizeof(*recvframe);
+ struct rc_proto_hdr *rch = (struct rc_proto_hdr *) &recvframe->data;
+
+ if (datalen < sizeof(struct rc_proto_hdr))
+ return -1;
+
+ switch (rch->type) {
+ case RC_PROTO_TYPE_CHANNEL:
+ if (datalen != sizeof(struct rc_proto_channel))
+ return -1;
+ break;
+ case RC_PROTO_TYPE_RANGE: {
+ struct rc_proto_range *rcr =
+ (struct rc_proto_range *) recvframe->data;
+
+ if (datalen != sizeof(struct rc_proto_range))
+ return -1;
+
+ if (rcr->power_level >= MAX_POWER_LEVEL)
+ return -1;
+
+ rc_proto_rx_range(rcr->power_level);
+
+ break;
+ }
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+
void xbee_rx(struct xbee_dev *dev, int channel, int type,
void *frame, unsigned len, void *opaque)
{
}
case XBEE_TYPE_RECV: {
- struct xbee_recv_hdr *recvframe = frame;
- int recvlen = len - sizeof(*recvframe);
- int on_stdout = 1;
-
- /* if we receive a range-test frame, ask for RSSI now */
- if (recvlen >= strlen("range") &&
- !strncmp((char *)recvframe->data,
- "range", strlen("range"))) {
- xbeeapp_send_atcmd("DB", NULL, 0, 0);
- on_stdout = 0;
- }
- hexdump(on_stdout, "rx data", recvframe->data,
- recvlen);
+ if (xbee_recv_data(frame, len) < 0)
+ do_hexdump = 1;
break;
}
/* send an AT command with parameters filled by caller. Disable
* command line until we get the answer or until a timeout occurs */
-int xbeeapp_send_atcmd(const char *atcmd_str, void *param, unsigned param_len,
- int foreground)
+int xbeeapp_send_atcmd(const char *atcmd_str,
+ void *param, unsigned param_len, int foreground,
+ int (*func)(void *frame, unsigned len, void *arg),
+ void *arg)
{
struct xbee_ctx *ctx;
struct xbee_atcmd *cmd;
memset(ctx, 0, sizeof(*ctx));
ctx->type = ATCMD;
ctx->atcmd_query = cmd;
+ ctx->func = func;
+ ctx->arg = arg;
memcpy(&frame.atcmd.cmd, atcmd_str, 2);
memcpy(&frame.buf, param, param_len);
argvopt = argv;
- while ((opt = getopt_long(argc, argvopt, "hd:s:",
+ while ((opt = getopt_long(argc, argvopt, "hd:s:j:",
lgopts, &option_index)) != EOF) {
switch (opt) {
xbee_raw = 1;
break;
+ case 'j':
+ joystick_devname = optarg;
+ break;
+
/* long options */
case 0:
/* if (!strcmp(lgopts[option_index].name, "option")) */
if (err < 0)
return -1;
+ /* init rc_proto */
+ rc_proto_init();
+
+ /* init joystick */
+ if (joystick_devname != NULL) {
+ if (joystick_init(joystick_devname, &joyinfo) < 0) {
+ fprintf(stderr, "error in joystick init\n");
+ return -1;
+ }
+ event_set(&joystick_read_event, joyinfo.fd, EV_READ | EV_PERSIST,
+ joystick_input, &joyinfo);
+ event_add(&joystick_read_event, NULL);
+ }
+
/* open xbee device */
xbee_dev = xbee_open(xbee_devname, xbee_baud);
if (xbee_dev == NULL)
if (access(xbeerc_path, R_OK) == 0) {
xbee_cl = cmdline_file_new(&main_ctx, "xbeerc> ",
- "/home/zer0/.xbeerc", 1);
+ xbeerc_path, 1);
if (xbee_cl != NULL) {
cmdline_interact(xbee_cl);
cmdline_free(xbee_cl);