*** empty log message ***

This commit is contained in:
Antoine Drouin
2005-05-27 07:57:17 +00:00
parent 87922c31e5
commit c4c4b3fd41
5 changed files with 772 additions and 0 deletions
+4
View File
@@ -89,5 +89,9 @@ $(OBJDIR)/nav.o : $(ACINCLUDE)/flight_plan.h
$(OBJDIR)/gps_ubx.o : $(VARINCLUDE)/ubx_protocol.h
$(OBJDIR)/if_calib.o : $(ACINCLUDE)/inflight_calib.h
wavecard_glib : wavecard_glib.c wavecard.c
gcc -Wall -o wavecard_glib wavecard.c wavecard_glib.c `pkg-config --cflags glib-2.0` `pkg-config --libs glib-2.0`
clean : avr_clean
rm -f *.out *.cm* messages.h flight_plan.h ubx_protocol.h inflight_calib.h
+112
View File
@@ -0,0 +1,112 @@
#include <inttypes.h>
#include <stdlib.h>
#include "wavecard.h"
typedef uint8_t bool_t;
uint8_t wc_payload[WC_MAX_PAYLOAD];
static uint8_t wc_status;
const uint16_t poly = 0x8408;
uint16_t crc;
uint8_t wc_length, payload_idx;
#define UNINIT 0
#define GOT_SYNC1 1
#define GOT_STX 2
#define GOT_LENGTH 3
#define GOT_PAYLOAD 4
#define GOT_CRC1 5
#define GOT_CRC2 6
bool_t waiting_ack, wc_msg_received;
uint8_t wc_protocol_error, wc_ovrn, wc_error;
void parse_payload() {
switch (wc_payload[0]) {
case WC_ACK:
if (waiting_ack)
waiting_ack = FALSE;
else
wc_protocol_error++;
break;
case WC_NAK:
case WC_ERROR:
wc_protocol_error++;
break;
default:
WcSendAck();
}
wc_msg_received = FALSE;
}
inline void parse_wc( uint8_t c ) {
// printf("s=%d\n", wc_status);
switch (wc_status) {
case UNINIT:
if (c == WC_SYNC)
wc_status++;
break;
case GOT_SYNC1:
if (c != WC_STX)
goto error;
crc = 0;
wc_status++;
break;
case GOT_STX:
if (wc_msg_received) {
wc_ovrn++;
goto error;
}
wc_length = c;
update_crc(c);
wc_status++;
payload_idx = 0;
break;
case GOT_LENGTH:
wc_payload[payload_idx] = c;
update_crc(c);
payload_idx++;
if (payload_idx == wc_length-3)
wc_status++;
break;
case GOT_PAYLOAD:
if (c != (crc & 0xff))
goto error;
wc_status++;
break;
case GOT_CRC1:
if (c != (crc >> 8))
goto error;
wc_status++;
break;
case GOT_CRC2:
if (c != WC_ETX)
goto error;
wc_msg_received = TRUE;
goto restart;
break;
}
return;
error:
wc_error++;
restart:
wc_status = UNINIT;
return;
}
/***
#define WcPut1CtlByte(_byte) { \
tx_buf[tx_head] = _byte; \
tx_head++; \
if (tx_head >= TX_BUF_SIZE) tx_head = 0; \
}
***/
+267
View File
@@ -0,0 +1,267 @@
#ifndef WAVECARD_H
#define WAVECARD_H
#define WC_CTL_BYTE_LEN 4
#define WC_ADDR_LEN 6
#include "wavecard_glib.h"
extern uint16_t crc;
extern const uint16_t poly;
extern uint8_t wc_msg_received;
#define WC_MAX_PAYLOAD 256
extern uint8_t wc_payload[WC_MAX_PAYLOAD];
extern uint8_t wc_length;
void parse_payload(void);
#define WC_SYNC 0xff
#define WC_STX 0x02
#define WC_ETX 0x03
#define WC_ACK 0x06
#define WC_NAK 0x15
#define WC_ERROR 0x00
#define WC_REQ_WRITE_RADIO_PARAM 0x40
#define WC_RES_WRITE_RADIO_PARAM 0x41
#define WC_REQ_READ_RADIO_PARAM 0x50
#define WC_RES_READ_RADIO_PARAM 0x51
#define WC_REQ_SELECT_CHANNEL 0x60
#define WC_RES_SELECT_CHANNEL 0x61
#define WC_REQ_READ_CHANNEL 0x62
#define WC_RES_READ_CHANNEL 0x63
#define WC_REQ_SELECT_PHYCONFIG 0x64
#define WC_RES_SELECT_PHYCONFIG 0x65
#define WC_REQ_READ_PHYCONFIG 0x66
#define WC_RES_READ_PHYCONFIG 0x67
#define WC_REQ_READ_REMOTE_RSSI 0x68
#define WC_RES_READ_REMOTE_RSSI 0x69
#define WC_REQ_READ_LOCAL_RSSI 0x6A
#define WC_RES_READ_LOCAL_RSSI 0x6B
#define WC_REQ_FIRMWARE_VERSION 0xA0
#define WC_RES_FIRMWARE_VERSION 0xA1
#define WC_MODE_TEST 0xB0
#define WC_REQ_SEND_FRAME 0x20
#define WC_RES_SEND_FRAME 0x21
#define WC_REQ_SEND_MESSAGE 0x22
#define WC_REQ_SEND_POLLING 0x26
#define WC_REQ_SEND_BROADCAST 0x28
#define WC_RECEIVED_FRAME 0x30
#define WC_RECEPTION_ERROR 0x31
#define WC_RECEIVED_FRAME_POLLING 0x32
#define WC_RECEIVED_FRAME_BROADCAST 0x34
#define WC_RECEIVED_MULTIFRAME 0x36
#define WC_REQ_SEND_SERVICE 0x80
#define WC_RES_SEND_SERVICE 0x81
#define WC_SERVICE_RESPONSE 0x82
#define WC_RADIO_PARAM_AWAKENING_PERIOD 0x00
#define WC_RADIO_PARAM_WAKE_UP_TYPE 0x01
#define WC_RADIO_PARAM_WAKE_UP_LENGTH 0x02
#define WC_RADIO_PARAM_RADIO_ACKNOLEDGE 0x04
#define WC_RADIO_PARAM_RADIO_ADDRESS 0x05
#define WC_RADIO_PARAM_RELAY_ROUTE 0x07
#define WC_RADIO_PARAM_POLLING_ROUTE 0x08
#define WC_RADIO_PARAM_GROUP_NUMBER 0x09
#define WC_RADIO_PARAM_POLLING_TIME 0x0A
#define WC_RADIO_PARAM_RADIO_USER_TIMEOUT 0x0C
#define WC_RADIO_PARAM_RECEPT_ERROR_STATUS 0x0E
#define WC_RADIO_PARAM_SWITCH_MODE_STATUS 0x10
void parse_wc( uint8_t);
#define update_crc(_byte) { \
uint8_t i; \
crc ^= _byte; \
for(i = 0; i < 8; i++) { \
uint8_t carry = crc & 0x1; \
crc /= 2; \
if (carry) \
crc ^= poly; \
} \
}
#define WcPut1PayloadByte(_byte) { \
WcPut1CtlByte(_byte); \
update_crc(_byte);\
}
#define WcStart() \
WcPut1CtlByte(WC_SYNC); \
WcPut1CtlByte(WC_STX); \
crc = 0;
#define WcEnd() \
WcPut1CtlByte(crc&0xff); \
WcPut1CtlByte(crc>>8); \
WcPut1CtlByte(WC_ETX);
#define WcSendAck() \
g_message("sending ACK"); \
WcStart(); \
WcPut1PayloadByte(WC_CTL_BYTE_LEN); \
WcPut1PayloadByte(WC_ACK); \
WcEnd()
#define WcSendFirmwareReq() \
g_message("sending REQ_FIRMWARE_VERSION"); \
WcStart(); \
WcPut1PayloadByte(WC_CTL_BYTE_LEN); \
WcPut1PayloadByte(WC_REQ_FIRMWARE_VERSION); \
WcEnd()
#define WcSendReadRadioParamReq(no_param) \
g_message("sending REQ_READ_RADIO_PARAM %d", no_param); \
WcStart(); \
WcPut1PayloadByte( WC_CTL_BYTE_LEN + 1); \
WcPut1PayloadByte(WC_REQ_READ_RADIO_PARAM); \
WcPut1PayloadByte(no_param); \
WcEnd()
#define WcSendWriteRadioParamReq(no_param, value) \
g_message("sending REQ_WRITE_RADIO_PARAM %d %d", no_param, value); \
WcStart(); \
WcPut1PayloadByte( WC_CTL_BYTE_LEN + 2); \
WcPut1PayloadByte(WC_REQ_WRITE_RADIO_PARAM); \
WcPut1PayloadByte(no_param); \
WcPut1PayloadByte(value); \
WcEnd()
#define WcSendReqSendService(addr, type) \
{ \
uint8_t i; \
g_message("sending REQ_SEND_SERVICE %02x %02x %02x %02x %02x %02x", addr[0], addr[1], addr[2] , addr[3], addr[4], addr[5]); \
WcStart(); \
WcPut1PayloadByte(WC_CTL_BYTE_LEN + WC_ADDR_LEN + 1); \
WcPut1PayloadByte(WC_REQ_SEND_SERVICE); \
WcPut1PayloadByte(addr[0]);\
WcPut1PayloadByte(addr[1]);\
WcPut1PayloadByte(addr[2]);\
WcPut1PayloadByte(addr[3]);\
WcPut1PayloadByte(addr[4]);\
WcPut1PayloadByte(addr[5]);\
WcPut1PayloadByte(type); \
WcEnd() \
}
#define WcSendMsg(addr, len, msg) \
{ \
uint8_t i; \
GString* str = g_string_new( "sending REQ_SEND_MESSAGE " ); \
wc_glib_append_addr(str, addr); \
g_string_append_printf(str, "%*s ", len, msg); \
g_message(str->str); \
g_string_free(str, TRUE); \
WcStart(); \
WcPut1PayloadByte(WC_CTL_BYTE_LEN + WC_ADDR_LEN + len ); \
WcPut1PayloadByte(WC_REQ_SEND_MESSAGE); \
WcPut1PayloadByte(addr[0]); \
WcPut1PayloadByte(addr[1]); \
WcPut1PayloadByte(addr[2]); \
WcPut1PayloadByte(addr[3]); \
WcPut1PayloadByte(addr[4]); \
WcPut1PayloadByte(addr[5]); \
WcPut1PayloadByte(msg[0]); \
WcPut1PayloadByte(msg[1]); \
WcPut1PayloadByte(msg[2]); \
WcPut1PayloadByte(msg[3]); \
WcPut1PayloadByte(msg[4]); \
WcPut1PayloadByte(msg[5]); \
WcPut1PayloadByte(msg[6]); \
WcPut1PayloadByte(msg[7]); \
WcPut1PayloadByte(msg[8]); \
WcPut1PayloadByte(msg[9]); \
WcPut1PayloadByte(msg[10]); \
WcPut1PayloadByte(msg[11]); \
WcPut1PayloadByte(msg[12]); \
WcEnd() \
} \
#define WcSendReqReadRemoteRssi(addr) \
{ \
GString* str = g_string_new( "sending REQ_READ_REMOTE_RSSI " ); \
wc_glib_append_addr(str, addr); \
g_message(str->str); \
g_string_free(str, TRUE); \
WcStart(); \
WcPut1PayloadByte(WC_CTL_BYTE_LEN + WC_ADDR_LEN ); \
WcPut1PayloadByte(WC_REQ_READ_REMOTE_RSSI); \
WcPut1PayloadByte(addr[0]); \
WcPut1PayloadByte(addr[1]); \
WcPut1PayloadByte(addr[2]); \
WcPut1PayloadByte(addr[3]); \
WcPut1PayloadByte(addr[4]); \
WcPut1PayloadByte(addr[5]); \
WcEnd() \
} \
#define WcSendReqReadLocalRssi(addr) \
{ \
GString* str = g_string_new( "sending REQ_READ_LOCAL_RSSI " ); \
wc_glib_append_addr(str, addr); \
g_message(str->str); \
g_string_free(str, TRUE); \
WcStart(); \
WcPut1PayloadByte(WC_CTL_BYTE_LEN + WC_ADDR_LEN ); \
WcPut1PayloadByte(WC_REQ_READ_LOCAL_RSSI); \
WcPut1PayloadByte(addr[0]); \
WcPut1PayloadByte(addr[1]); \
WcPut1PayloadByte(addr[2]); \
WcPut1PayloadByte(addr[3]); \
WcPut1PayloadByte(addr[4]); \
WcPut1PayloadByte(addr[5]); \
WcEnd() \
} \
#define WcSendReqReadPhyconfig() \
{ \
g_message("sending REQ_READ_PHYCONFIG "); \
WcStart(); \
WcPut1PayloadByte(WC_CTL_BYTE_LEN ); \
WcPut1PayloadByte(WC_REQ_READ_PHYCONFIG); \
WcEnd() \
} \
#define WcSendReqSelectPhyconfig(cfg) \
{ \
g_message("sending REQ_SELECT_PHYCONFIG "); \
WcStart(); \
WcPut1PayloadByte(WC_CTL_BYTE_LEN + 2); \
WcPut1PayloadByte(WC_REQ_SELECT_PHYCONFIG); \
WcPut1PayloadByte(cfg>>8); \
WcPut1PayloadByte(cfg&0xff); \
WcEnd() \
} \
#define WcSendReqReadChannel() \
{ \
g_message("sending REQ_READ_CHANNEL "); \
WcStart(); \
WcPut1PayloadByte(WC_CTL_BYTE_LEN ); \
WcPut1PayloadByte(WC_REQ_READ_CHANNEL); \
WcEnd() \
} \
#define WcSendReqSelectChannel(channel) \
{ \
g_message("sending REQ_SELECT_CHANNEL "); \
WcStart(); \
WcPut1PayloadByte(WC_CTL_BYTE_LEN + 1); \
WcPut1PayloadByte(WC_REQ_SELECT_CHANNEL); \
WcPut1PayloadByte(channel); \
WcEnd() \
} \
#endif /* WAVECARD_H */
+355
View File
@@ -0,0 +1,355 @@
// gcc -Wall -o wavecard.c wavecard_glib.c `pkg-config --cflags glib-2.0` `pkg-config --libs glib-2.0`
#include <signal.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <inttypes.h>
#include <getopt.h>
#include <glib.h>
#include "wavecard.h"
#include "wavecard_glib.h"
uint8_t t1_addr[WC_ADDR_LEN] = { 0x01, 0x18, 0x04, 0xc0, 0x01, 0x34 };
//uint8_t gs_addr[WC_ADDR_LEN] = { 0x01, 0x18, 0x04, 0xc0, 0x00, 0x4f };
uint8_t gs_addr[WC_ADDR_LEN] = { 0x01, 0x18, 0x04, 0xc0, 0x01, 0x2d };
uint8_t* hosts_adress[] = { t1_addr, gs_addr};
uint8_t nb_hosts = 2;
struct WcGlib wc_glib;
static void wc_glib_setup_sig_handler( void );
static void wc_glib_quit( int i );
static guint usage (int argc, char** argv);
static guint parse_options (int argc, char** argv);
static GIOChannel* open_serial_port( const gchar* serial_dev) {
GIOChannel* input_channel;
struct termios orig_termios;
struct termios cur_termios;
int fd = open(serial_dev, O_RDWR | O_NONBLOCK);
if (fd == -1) {
g_message("opening serial device %s : %s", serial_dev, strerror(errno));
return NULL;
}
if (tcgetattr(fd, &orig_termios)) {
g_message("getting serial device attr (%s) : %s", serial_dev, strerror(errno));
return NULL;
}
cur_termios = orig_termios;
/* input modes */
cur_termios.c_iflag &= ~(IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR
|ICRNL |IUCLC|IXON|IXANY|IXOFF|IMAXBEL);
/* pas IGNCR sinon il vire les 0x0D */
cur_termios.c_iflag |= BRKINT;
/* output_flags */
cur_termios.c_oflag &=~(OPOST|OLCUC|ONLCR|OCRNL|ONOCR|ONLRET|OFILL|OFDEL);
/* control modes */
cur_termios.c_cflag &= ~(CSIZE|CSTOPB|CREAD|PARENB|PARODD|HUPCL|CLOCAL|CRTSCTS);
cur_termios.c_cflag |= CREAD|CS8|CLOCAL;
/* local modes */
cur_termios.c_lflag &= ~(ISIG|ICANON|IEXTEN|ECHO|FLUSHO|PENDIN);
cur_termios.c_lflag |= NOFLSH;
if (cfsetispeed(&cur_termios, B9600)) {
g_message("setting serial device speed (%s) : %s", serial_dev, strerror(errno));
return NULL;
}
if (tcsetattr(fd, TCSADRAIN, &cur_termios)) {
g_message("setting serial device attr (%s) : %s", serial_dev, strerror(errno));
return NULL;
}
input_channel = g_io_channel_unix_new(fd);
g_io_channel_set_encoding(input_channel, NULL, NULL);
return input_channel;
}
static void print_hex(gsize len, guchar* buf) {
const char d2h[] = "0123456789ABCDEF";
int i=0;
for (i=0; i<len; i++)
printf("%c%c ", d2h[(int)buf[i]/16], d2h[(int)buf[i]%16]);
printf("\n");
}
#define LINE_LEN 8
static void print_both(gsize len, guchar* buf) {
const char d2h[] = "0123456789ABCDEF";
int i,j;
for (i=0; i<len && i < LINE_LEN; i++) {
printf("%c%c ", d2h[(int)buf[i]/16], d2h[(int)buf[i]%16]);
}
if (i<LINE_LEN)
for (j=0; j<LINE_LEN-i; j++)
printf(" ");
printf("\t");
for (i=0; i<len && i < LINE_LEN; i++)
if (isalnum(buf[i]))
printf("%c", buf[i]);
else
printf(".");
printf("\n");
if (i<len) print_both(len-i, buf+i);
}
static void wc_glib_print_addr(uint8_t* addr) {
int i;
for(i = 0; i < WC_ADDR_LEN ; i++)
printf("%02x ", addr[i]);
}
static void wc_glib_append_addr(GString* str, uint8_t* addr) {
int i;
for(i = 0; i < WC_ADDR_LEN ; i++)
g_string_append_printf(str, "%02x ", addr[i]);
}
static void priv_parse_payload() {
printf("got_message ");
int i;
for(i = 0; i < wc_length - 3; i++)
printf("%02x ", wc_payload[i]);
printf("\n");
switch (wc_payload[0]) {
case WC_RES_READ_RADIO_PARAM :
g_message("got WC_RES_READ_RADIO_PARAM");
if (wc_payload[1] == 0) {
switch (wc_glib.radio_param) {
case WC_RADIO_PARAM_AWAKENING_PERIOD :
g_message("awakening period %d", wc_payload[2]);
break;
case WC_RADIO_PARAM_WAKE_UP_TYPE:
g_message("wake_up_type %d", wc_payload[2]);
break;
case WC_RADIO_PARAM_RADIO_ACKNOLEDGE :
g_message("radio_acknoledge %d", wc_payload[2]);
break;
case WC_RADIO_PARAM_WAKE_UP_LENGTH : {
uint16_t* len = (uint16_t*)&wc_payload[2];
g_message("wake_up_length %d", *len);
}
break;
case WC_RADIO_PARAM_RADIO_ADDRESS :
memcpy(wc_glib.self_addr, wc_payload, WC_ADDR_LEN);
GString* str = g_string_new("self_address ");
wc_glib_append_addr(str, &wc_payload[2]);
g_message(str->str);
g_string_free(str, TRUE);
if (!memcmp(&wc_payload[2], gs_addr, WC_ADDR_LEN))
wc_glib.distant_addr = t1_addr;
else
wc_glib.distant_addr = gs_addr;
break;
case WC_RADIO_PARAM_SWITCH_MODE_STATUS:
g_message("switch_mode_status %s", wc_payload[2]?"ON":"OFF");
break;
default:
g_message("radio param %02x %d", wc_glib.radio_param, wc_payload[2]);
break;
}
}
else
g_message("WC_RES_READ_RADIO_PARAM failed");
break;
case WC_RES_WRITE_RADIO_PARAM :
g_message("WC_RES_WRITE_RADIO_PARAM %s", wc_payload[1]?"FAILED":"OK");
break;
case WC_RES_SEND_SERVICE :
g_message("got WC_RES_SEND_SERVICE");
break;
case WC_SERVICE_RESPONSE :
g_message("got WC_SERVICE_RESPONSE");
printf("addr : "); wc_glib_print_addr(&wc_payload[1]);
printf("\n");
g_message("acquitement %d", wc_payload[7]);
g_message("type %d", wc_payload[8]);
g_message("rssi %d", wc_payload[9]);
g_message("periode reveil %d", wc_payload[10]);
g_message("type_2 %d", wc_payload[11]);
break;
case WC_RES_SEND_FRAME :
g_message("got WC_RES_SEND_FRAME");
break;
case WC_RES_READ_REMOTE_RSSI :
g_message("got WC_RES_READ_REMOTE_RSSI %d", wc_payload[1] );
break;
case WC_RES_READ_LOCAL_RSSI :
g_message("got WC_RES_READ_LOCAL_RSSI %d", wc_payload[1] );
break;
case WC_RECEIVED_FRAME :
g_message("got WC_RECEIVED_FRAME");
GString* str = g_string_new("sender_address ");
wc_glib_append_addr(str, &wc_payload[1]);
g_string_append_printf(str, "data : %*s ", wc_length - WC_ADDR_LEN, &wc_payload[1+WC_ADDR_LEN]);
g_message(str->str);
g_string_free(str, TRUE);
break;
case WC_ACK :
g_message("got ACK");
break;
case WC_NAK :
g_message("got NAK");
break;
default:
g_message("received unhandled %02x", wc_payload[0]);
}
}
static gboolean on_data_received(GIOChannel *source, GIOCondition condition, gpointer data) {
guchar buf[128];
gsize len;
GError *err = NULL;
g_io_channel_read_chars(source, buf, 3, &len, &err);
int i;
// g_message("received");
// print_both(len, buf);
for (i=0; i<len; i++)
parse_wc(buf[i]);
if (wc_msg_received) {
priv_parse_payload();
parse_payload();
}
return TRUE;
}
uint8_t hello[] = "HELLO WORLD W";
static gboolean timeout_callback(gpointer data) {
static uint8_t foo1 = 1;
if ( foo1 == 1) {
wc_glib.radio_param = WC_RADIO_PARAM_RADIO_ADDRESS;
WcSendReadRadioParamReq(WC_RADIO_PARAM_RADIO_ADDRESS);
}
else if ( foo1 == 2) {
wc_glib.radio_param = WC_RADIO_PARAM_SWITCH_MODE_STATUS;
//WcSendWriteRadioParamReq(WC_RADIO_PARAM_SWITCH_MODE_STATUS, 0);
WcSendReadRadioParamReq(WC_RADIO_PARAM_SWITCH_MODE_STATUS);
}
else if ( foo1 == 3) {
//wc_glib.radio_param = WC_RADIO_PARAM_RADIO_ACKNOLEDGE;
//WcSendWriteRadioParamReq(WC_RADIO_PARAM_RADIO_ACKNOLEDGE, 1);
WcSendReadRadioParamReq(WC_RADIO_PARAM_RADIO_ACKNOLEDGE);
}
// else if ( foo1 == 2) {
// WcSendReqSelectChannel(0x01);
// WcSendReqReadChannel();
// }
else if ( foo1 == 4) {
//WcSendReqSelectPhyconfig(0x00a3);
WcSendReqReadPhyconfig();
}
// else if ( foo1 == 4) {
// WcSendReqReadRemoteRssi(wc_glib.distant_addr);
// }
// else if (foo1 == 5) {
// WcSendReqReadLocalRssi(wc_glib.distant_addr);
// }
else if (foo1 == 6) {
WcSendReqSendService(wc_glib.distant_addr, 0x20);
}
// else if (foo1 == 7) {
// WcSendFirmwareReq();
// }
else if (foo1 > 7) {
static uint8_t foo = 1;
hello[12] = foo++;
if (!wc_glib.options.silent) WcSendMsg(wc_glib.distant_addr, strlen(hello), hello);
}
foo1++;
return TRUE;
}
int main (int argc, char** argv) {
if (parse_options(argc, argv))
return usage(argc, argv);
wc_glib_setup_sig_handler();
wc_glib.in_ch = open_serial_port(wc_glib.options.serial_device);
in_ch = wc_glib.in_ch;
g_io_add_watch (wc_glib.in_ch, G_IO_IN , on_data_received, NULL);
g_timeout_add(2000, timeout_callback, in_ch);
wc_glib.ml = g_main_loop_new(NULL, FALSE);
wc_glib.distant_addr = t1_addr;
g_main_loop_run(wc_glib.ml);
return 0;
}
static void wc_glib_setup_sig_handler( void ) {
struct sigaction act;
act.sa_handler = wc_glib_quit;
act.sa_restorer = NULL;
if (sigaction(SIGINT, &act, NULL) < 0)
g_message("Could not install signal handler for quitting\n i will be unable to close log\n");
}
static void wc_glib_quit( int i ) {
printf("\nquitting\n");
g_main_loop_quit(wc_glib.ml);
}
static guint usage (int argc, char** argv) {
g_message("%s [-h] [-d serial_device]", argv[0]);
return -1;
}
static guint parse_options (int argc, char** argv) {
const gchar *optstr = "h:d:s";
gchar ch;
wc_glib.options.serial_device = "/dev/ttyS0";
wc_glib.options.silent = FALSE;
while ((ch=getopt(argc,argv,optstr)) != -1) {
switch(ch) {
case 'h':
return -1;
case 'd':
wc_glib.options.serial_device = strdup(optarg);
break;
case 's':
wc_glib.options.silent = TRUE;
break;
case '?':
printf("unrecognized option: %c\n",optopt);
return -1;
default:
printf("error? condition unaccounted for?\n");
break;
}
}
g_message("%s starting", argv[0]);
g_message(" serial device : %s", wc_glib.options.serial_device);
return 0;
}
+34
View File
@@ -0,0 +1,34 @@
#ifndef WAVECARD_GLIB_H
#define WAVECARD_GLIB_H
#include <glib.h>
#include <stdio.h>
#include "wavecard.h"
struct WcGlibOptions {
gchar* serial_device;
gboolean silent;
};
struct WcGlib {
GMainLoop* ml;
GIOChannel* in_ch;
uint8_t radio_param;
uint8_t self_addr[WC_ADDR_LEN];
uint8_t* distant_addr;
struct WcGlibOptions options;
};
GIOChannel* in_ch;
extern struct WcGlib wc_glib;
#define WcPut1CtlByte(_byte) { \
int bytes_written; \
uint8_t b = _byte; \
g_io_channel_write_chars (wc_glib.in_ch, &b, 1, &bytes_written, NULL); \
g_io_channel_flush(wc_glib.in_ch, NULL); \
}
#endif /* WAVECARD_GLIB_H */