tux-droid-svn Mailing List for Tux Droid CE (Page 227)
Status: Beta
Brought to you by:
ks156
You can subscribe to this list here.
2007 |
Jan
|
Feb
(32) |
Mar
(108) |
Apr
(71) |
May
(38) |
Jun
(128) |
Jul
(1) |
Aug
(14) |
Sep
(77) |
Oct
(104) |
Nov
(90) |
Dec
(71) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(81) |
Feb
(18) |
Mar
(40) |
Apr
(102) |
May
(151) |
Jun
(74) |
Jul
(151) |
Aug
(257) |
Sep
(447) |
Oct
(379) |
Nov
(404) |
Dec
(430) |
2009 |
Jan
(173) |
Feb
(236) |
Mar
(519) |
Apr
(300) |
May
(112) |
Jun
(232) |
Jul
(314) |
Aug
(58) |
Sep
(203) |
Oct
(293) |
Nov
(26) |
Dec
(109) |
2010 |
Jan
(19) |
Feb
(25) |
Mar
(33) |
Apr
(1) |
May
|
Jun
(3) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: jaguarondi <c2m...@c2...> - 2007-06-08 13:46:39
|
Author: jaguarondi Date: 2007-06-08 15:45:59 +0200 (Fri, 08 Jun 2007) New Revision: 357 Modified: daemon/trunk/libs/USBDaemon_command_tux.c daemon/trunk/libs/USBDaemon_command_tux.h daemon/trunk/libs/USBDaemon_status_table.c daemon/trunk/libs/USBDaemon_status_table.h daemon/trunk/libs/USBDaemon_usb_enum.c daemon/trunk/libs/USBDaemon_usb_enum.h daemon/trunk/libs/USBDaemon_usb_readWrite.c firmware/tuxdefs/commands.h Log: * Added commands to handle ID connections and sleep mode. They are grouped in the TUX_CONNECTION_CMD category. The USB_TUX_CONNECTION commands are commands available on the dongle itself while TUX_CONNECTION commands are higher level functions made avalable to the clients. The daemon doesn't automatically connect to a tux at startup. The client should issue TUX_CONNECTION_CONNECT with the id of tux first. An updated firmware with id and sleep is required. * ATR2406 channels 0, 1, 93 and 94 are removed to meet FCC requirements. * Few naming and style corrections. Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-06-07 07:28:06 UTC (rev 356) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-06-08 13:45:59 UTC (rev 357) @@ -33,18 +33,28 @@ #include "USBDaemon_tcp_server.h" #include "USBDaemon_pidfile.h" +/*_____________________ D E F I N I T I O N S ______________________________*/ + +typedef union +{ + uint16_t w; + uint8_t b[2]; +} union_uint16_t; + /*_____________________ F U N C T I O N S __________________________________*/ -unsigned char connect_to_tux(uint16_t id); -unsigned char disconnect_from_tux(void); -unsigned char change_id(uint16_t id); -unsigned char wakeup_tux(void); -unsigned char free_wifi_channel(unsigned char wifi_channel); -unsigned char random_tux_connection(void); +void tux_connection(unsigned char const data[], unsigned char result[]); +int disconnect_from_tux(void); +int connect_to_tux(uint16_t id); +int id_request(uint16_t *id); +int id_lookup(uint16_t *id); +int change_id(uint16_t id); +int wakeup_tux(void); +int avoid_wifi_channel(unsigned char wifi_channel); +int random_tux_connection(void); + /************************************************************************** */ - /* COMMANDS FROM CLIENTS DISPATCHER */ - /************************************************************************** */ void commands_dispatcher(unsigned char client_id, /* Client source */ tcp_frame_t src_frame) /* Source frame */ @@ -142,7 +152,7 @@ /* B3----Data Type */ switch (src_frame[2]) { - /* Data type command */ + /* Data type command */ case DATA_TP_CMD: tcp_frame[2] = DATA_TP_ACK_CMD; tcp_frame[3] = src_frame[3]; @@ -163,7 +173,7 @@ break; } break; - /* Data type request */ + /* Data type request */ case DATA_TP_REQ: tcp_frame[2] = DATA_TP_RSP; tcp_frame[3] = src_frame[3]; @@ -184,6 +194,12 @@ break; } break; + /* USB connection command */ + case TUX_CONNECTION_CMD: + tcp_frame[2] = DATA_TP_RSP; + tcp_frame[3] = src_frame[3]; + tux_connection(data, result); + break; /* Unknowed data type */ default: ACK_DP = ACK_DP_UKN_DATA_TP; @@ -232,18 +248,14 @@ } /************************************************************************ */ - /* FOR Sub daemon */ - /************************************************************************ */ /******************************************************************** */ - /* sub_daemon_cmd_struct() */ - /******************************************************************** */ -void sub_daemon_cmd_struct(unsigned char data[], unsigned char result[], - int id_client) +void sub_daemon_cmd_struct(unsigned char const data[], unsigned char result[], + int const id_client) { switch (data[0]) { @@ -283,12 +295,10 @@ } /************************************************************************ */ - /* sub_daemon_req_info() */ - /************************************************************************ */ -void sub_daemon_req_info(unsigned char data[], unsigned char result[], - int id_client) +void sub_daemon_req_info(unsigned char const data[], unsigned char result[], + int const id_client) { unsigned char i; @@ -318,17 +328,13 @@ } /************************************************************************** */ - /* FOR Tux droid */ - /************************************************************************** */ /************************************************************************ */ - /* tux_cmd_raw() */ - /************************************************************************ */ -void tux_cmd_raw(unsigned char data[], unsigned char result[]) +void tux_cmd_raw(unsigned char const data[], unsigned char result[]) { unsigned char usb_send[5]; unsigned char i; @@ -340,11 +346,9 @@ } /************************************************************************ */ - /* tux_cmd_struct() */ - /************************************************************************ */ -void tux_cmd_struct(unsigned char data[], unsigned char result[]) +void tux_cmd_struct(unsigned char const data[], unsigned char result[]) { unsigned char ACK; @@ -516,11 +520,9 @@ } /************************************************************************ */ - /* tux_req_status() */ - /************************************************************************ */ -void tux_req_status(unsigned char data[], unsigned char result[]) +void tux_req_status(unsigned char const data[], unsigned char result[]) { result[0] = data[0]; switch (data[0]) @@ -784,12 +786,100 @@ } } +/** + * tux connection commands + */ +void tux_connection(unsigned char const data[], unsigned char result[]) +{ + result[0] = data[0]; + switch (data[0]) + { + case TUX_CONNECTION_DISCONNECT: + if (disconnect_from_tux() >= 0) + result[1] = TUX_CONNECTION_ACK; + else + result[1] = TUX_CONNECTION_NACK; + break; + case TUX_CONNECTION_CONNECT: + { + union_uint16_t id; + id.b[1] = data[1]; + id.b[0] = data[2]; + printf("coucou\n"); + if (connect_to_tux(id.w) >= 0) + result[1] = TUX_CONNECTION_ACK; + else + result[1] = TUX_CONNECTION_NACK; + break; + } + case TUX_CONNECTION_ID_REQUEST: + { + union_uint16_t id; + if (id_request((uint16_t *)&id) >= 0) + { + result[1] = TUX_CONNECTION_ACK; + result[2] = id.b[1]; /* MSB */ + result[3] = id.b[0]; /* LSB */ + } + else + result[1] = TUX_CONNECTION_NACK; + break; + } + case TUX_CONNECTION_ID_LOOKUP: + { + union_uint16_t id; + if (id_lookup((uint16_t *)&id) >= 0) + { + result[1] = TUX_CONNECTION_ACK; + result[2] = id.b[1]; /* MSB */ + result[3] = id.b[0]; /* LSB */ + } + else + result[1] = TUX_CONNECTION_NACK; + break; + } + case TUX_CONNECTION_CHANGE_ID: + { + union_uint16_t id; + id.b[0] = data[2]; /* LSB */ + id.b[1] = data[1]; /* MSB */ + if (change_id(id.w) >= 0) + result[1] = TUX_CONNECTION_ACK; + else + result[1] = TUX_CONNECTION_NACK; + break; + } + case TUX_CONNECTION_SLEEP: + if (send_usb_tux_cmd(SLEEP_CMD, 0, SLEEP_MODE, 0) == ACK_CMD_OK) + result[1] = TUX_CONNECTION_ACK; + else + result[1] = TUX_CONNECTION_NACK; + break; + case TUX_CONNECTION_WAKEUP: + if (wakeup_tux() >= 0) + result[1] = TUX_CONNECTION_ACK; + else + result[1] = TUX_CONNECTION_NACK; + break; + case TUX_CONNECTION_RANDOM: + if (random_tux_connection() >= 0) + result[1] = TUX_CONNECTION_ACK; + else + result[1] = TUX_CONNECTION_NACK; + break; + case TUX_CONNECTION_WIRELESS_CHANNEL: + if (avoid_wifi_channel(data[1]) >= 0) + result[1] = TUX_CONNECTION_ACK; + else + result[1] = TUX_CONNECTION_NACK; + break; + } +} + /************************************************************************ */ - /* tux_req_info() */ - /************************************************************************ */ -void tux_req_info(unsigned char data[], unsigned char result[]) +void tux_req_info(unsigned char const data[], unsigned char result[]) { result[0] = data[0]; @@ -810,15 +900,11 @@ } /************************************************************************** */ - /* TUX USB */ - /************************************************************************** */ /************************************************************************ */ - /* send_usb_tuxcmd() */ - /************************************************************************ */ unsigned char send_usb_tux_cmd(unsigned char cmd, unsigned char param1, unsigned char param2, unsigned char param3) @@ -834,12 +920,10 @@ } /************************************************************************ */ - /* send_usb_donglecmd() */ - /************************************************************************ */ -unsigned char send_usb_dongle_cmd(USB_DONGLE_COMMANDS cmd, unsigned char param1, - unsigned char param2, unsigned char param3) +unsigned char send_usb_dongle_cmd(usb_dongle_commands_t cmd, + unsigned char param1, unsigned char param2, unsigned char param3) { unsigned char data[TUX_SEND_LENGTH]; int ret; @@ -857,81 +941,208 @@ } /** - * \brief Connect to a tux by its ID + * Disconnect from tux + * + * The return value only tells whether the command has been sent successfully + * to the dongle. That does by no means tell anything about the actual RF + * connection with tux. Check RF_status for this. + * + * \return 0 if successful, -1 otherwise */ -unsigned char connect_to_tux(uint16_t id) +int disconnect_from_tux(void) { - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CONNECT, - (uint8_t)id, (uint8_t)(id>>8)); + if (send_usb_dongle_cmd(USB_TUX_CONNECTION_CMD, + USB_TUX_CONNECTION_DISCONNECT, 0, 0) == USB_FRAME_SIZE) + return 0; + else + return -1; } /** - * \brief Disconnect from tux + * Connect to a tux by its ID + * + * The return value only tells whether the command has been sent successfully + * to the dongle. That does by no means tell anything about the actual RF + * connection with tux. Check RF_status for this. + * + * \return 0 if successful, -1 otherwise */ -unsigned char disconnect_from_tux(void) +int connect_to_tux(const uint16_t id) { - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_DISCONNECT, - 0, 0); + if (send_usb_dongle_cmd(USB_TUX_CONNECTION_CMD, USB_TUX_CONNECTION_CONNECT, + (uint8_t)(id>>8), (uint8_t)id) == USB_FRAME_SIZE) + return 0; + else + return -1; } /** - * \brief Get the ID of the first disconnected tux which is discoverred + * Connect to the first tux discovered * + * Catch any disconnected tux, request it's ID and connect to it. + * + * \return 0 if successful, -1 otherwise + */ +int random_tux_connection(void) +{ + uint16_t id; + if (id_lookup((uint16_t *)&id) < 0) + return -1; + + if (connect_to_tux(id) < 0) + return -1; + + return 0; +} + +/** + * Get the ID of tux currently connected + * + * \param *id pointer where the id should be returned + * \return 0 if successful, -1 otherwise + */ +#define ID_REQUEST_TIMEOUT 5 /* 100ms time unit */ +int id_request(uint16_t *id) +{ + int timeout_cnt = 0; + + if (send_usb_dongle_cmd(USB_TUX_CONNECTION_CMD, + USB_TUX_CONNECTION_ID_REQUEST, 0, 0) != USB_FRAME_SIZE) + return -1; + + /* usb_request_f flag is reset when the id is received in + * usb_get_status_TuxDroid() */ + connection_status.usb_request_f = 1; + while (connection_status.usb_request_f) + { + usleep(100000); + usb_get_status_TuxDroid(); + if (timeout_cnt++ == ID_REQUEST_TIMEOUT) + { + return -1; + } + } + /* At this time the id should be stored in connection_status.tux_id */ + *id = connection_status.tux_id; + + return 0; +} + +/** + * Get the ID of the first disconnected tux which is discoverred + * * The first disconnected tux that will detect this command will reply with * it's ID and disconnect immediately. You can then connect to that tux with * the ID you just got. * * In order to get the ID's of more than one disconnected tux, you have to * issue this command multiple times until you don't get any new ID. + * + * \param *id pointer where the id should be returned + * \return 0 if successful, -1 otherwise */ -#define ID_LOOKUP_TIMEOUT 20 /* 100ms time unit */ -unsigned char id_lookup(uint16_t *id) +#define ID_LOOKUP_TIMEOUT 50 /* 100ms time unit */ +int id_lookup(uint16_t *id) { - unsigned char ack; int timeout_cnt = 0; - ack = send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_ID_LOOKUP, 0, 0); - if (ack != 5) /* error when writing data on the USB */ - return 0; - connection_status.usb_request_f = 1; /* this flag is reset when the id is received in usb_get_status_TuxDroid */ + /* Disconnecting first is necessary in case tux is connected */ + if (disconnect_from_tux() < 0) + return -1; + + if (send_usb_dongle_cmd(USB_TUX_CONNECTION_CMD, + USB_TUX_CONNECTION_ID_LOOKUP, 0, 0) != USB_FRAME_SIZE) + return -1; + + /* usb_request_f flag is reset when the id is received in + * usb_get_status_TuxDroid() */ + connection_status.usb_request_f = 1; while (connection_status.usb_request_f) { - usleep(200000); + usleep(100000); usb_get_status_TuxDroid(); if (timeout_cnt++ == ID_LOOKUP_TIMEOUT) { - return 0; + return -1; } } /* At this time the id should be stored in connection_status.tux_id */ *id = connection_status.tux_id; - return 1; + + /* We need to disconnect after a lookup to reset the RF module */ + if (disconnect_from_tux() < 0) + return -1; + return 0; } /** - * \brief Changes the ID of a disconnected tux + * Changes the ID of a disconnected tux * - * You have to push on the head button of tux for XXX seconds while sending + * You have to push on the head button of tux for 5 seconds while sending * this command in order to validate the ID change request, this in order to * avoid stealing a tux too easily. + * + * \param id new id to set + * \return 0 if successful, -1 otherwise */ -unsigned char change_id(uint16_t id) +#define CHANGE_ID_TIMEOUT 70 +int change_id(uint16_t id) { - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, - (uint8_t)id, (uint8_t)(id>>8)); + int timeout_cnt = 0; + + /* Disconnecting first is necessary in case tux is connected */ + if (disconnect_from_tux() < 0) + return -1; + + if (send_usb_dongle_cmd(USB_TUX_CONNECTION_CMD, + USB_TUX_CONNECTION_CHANGE_ID, (uint8_t)(id>>8), (uint8_t)id) + != USB_FRAME_SIZE) + return -1; + + /* usb_request_f flag is reset when the id is received in + * usb_get_status_TuxDroid() */ + connection_status.usb_request_f = 1; + while (connection_status.usb_request_f) + { + usleep(100000); + usb_get_status_TuxDroid(); + if (timeout_cnt++ == CHANGE_ID_TIMEOUT) + { + /* This is the case when the hardware condition to change the id is + * not met */ + return -1; + } + } + + /* At this time the id should be stored in connection_status.tux_id, we + * check that it's the same as what we asked for */ + if (id != connection_status.tux_id) + return -1; + + /* We need to disconnect but as the id has been changed, we don't return an + * error if disconnection fails */ + if (disconnect_from_tux() < 0) + return 1; + + return 0; } /** - * \brief Wake-up a tux if it's in sleep mode. + * Wake-up a tux if it's in sleep mode. + * + * \return 0 if successful, -1 otherwise */ -unsigned char wakeup_tux(void) +int wakeup_tux(void) { - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_ID_LOOKUP, - 0, 0); + if (send_usb_dongle_cmd(USB_TUX_CONNECTION_CMD, + USB_TUX_CONNECTION_ID_LOOKUP, 0, 0) == USB_FRAME_SIZE) + return 0; + else + return -1; } /** - * \brief Configure the RF module to avoid a given wifi channel + * Configure the RF module to avoid a given wifi channel * * This sets the frequencies to avoid in the dongle. These settings only take * effect when a connection is initiated with a tux. This function should @@ -940,8 +1151,10 @@ * * Channels from 1 to 14 are valid wifi channels. Set the wifi channel to 0 to * disable channel avoidance and use the complete range of frequencies. + * + * \return 0 if successful, -1 otherwise */ -unsigned char free_wifi_channel(unsigned char wifi_channel) +int avoid_wifi_channel(unsigned char wifi_channel) { /* * Conversion of the lower and higher frequencies of a wifi channel into @@ -949,20 +1162,14 @@ * Channel 0 sends 0 as both low and high ATR channels. */ static const uint8_t lower_ATR_channel[15] = - {0, 0, 6, 12, 18, 24, 29, 35, 41, 47, 52, 58, 64, 70, 76}; + {92, 2, 6, 12, 18, 24, 29, 35, 41, 47, 52, 58, 64, 70, 76}; static const uint8_t higher_ATR_channel[15] = - {0, 26, 32, 38, 43, 49, 55, 61, 67, 72, 78, 84, 90, 94, 94}; + {2, 26, 32, 38, 43, 49, 55, 61, 67, 72, 78, 84, 90, 92, 92}; - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, - lower_ATR_channel[wifi_channel], higher_ATR_channel[wifi_channel]); + if (send_usb_dongle_cmd(USB_TUX_CONNECTION_CMD, + USB_TUX_CONNECTION_CHANGE_ID, lower_ATR_channel[wifi_channel], + higher_ATR_channel[wifi_channel]) == USB_FRAME_SIZE) + return 0; + else + return -1; } - -/** - * \brief Connect to the first tux discovered - * - * Used to catch any disconnected tux, request it's ID and connect to it. - */ -unsigned char random_tux_connection(void) -{ - return 0; -} Modified: daemon/trunk/libs/USBDaemon_command_tux.h =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.h 2007-06-07 07:28:06 UTC (rev 356) +++ daemon/trunk/libs/USBDaemon_command_tux.h 2007-06-08 13:45:59 UTC (rev 357) @@ -35,20 +35,20 @@ /* COMMANDS FROM CLIENTS DISPATCHER */ extern void commands_dispatcher(unsigned char client_id, unsigned char src_frame[16]); -extern void sub_daemon_cmd_struct(unsigned char data[], unsigned char result[], - int id_client); -extern void sub_daemon_req_info(unsigned char data[], unsigned char result[], - int id_client); -extern void tux_cmd_raw(unsigned char data[], unsigned char result[]); -extern void tux_cmd_struct(unsigned char data[], unsigned char result[]); -extern void tux_req_status(unsigned char data[], unsigned char result[]); -extern void tux_req_info(unsigned char data[], unsigned char result[]); +extern void sub_daemon_cmd_struct(unsigned char const data[], + unsigned char result[], int const id_client); +extern void sub_daemon_req_info(unsigned char const data[], + unsigned char result[], int const id_client); +extern void tux_cmd_raw(unsigned char const data[], unsigned char result[]); +extern void tux_cmd_struct(unsigned char const data[], unsigned char result[]); +extern void tux_req_status(unsigned char const data[], unsigned char result[]); +extern void tux_req_info(unsigned char const data[], unsigned char result[]); /* TUX PHYSICAL CHANGES */ extern unsigned char send_usb_tux_cmd(unsigned char cmd, unsigned char param1, unsigned char param2, unsigned char param3); -extern unsigned char send_usb_dongle_cmd(USB_DONGLE_COMMANDS cmd, +extern unsigned char send_usb_dongle_cmd(usb_dongle_commands_t cmd, unsigned char param1, unsigned char param2, unsigned char param3); @@ -73,6 +73,5 @@ unsigned char middle_add, unsigned char higher_add); extern unsigned char send_test_sound(); -unsigned char id_lookup(uint16_t *id); #endif Modified: daemon/trunk/libs/USBDaemon_status_table.c =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.c 2007-06-07 07:28:06 UTC (rev 356) +++ daemon/trunk/libs/USBDaemon_status_table.c 2007-06-08 13:45:59 UTC (rev 357) @@ -68,9 +68,11 @@ switch (new_status[0]) { case STATUS_ID_CMD: - connection_status.usb_request_f = 0; /* the answer from the usb command has been received */ - printf("flag set: %i\n",connection_status.usb_request_f); + /* The answer from the usb_tux_connection command has been received */ + connection_status.usb_request_f = 0; connection_status.tux_id = (new_status[1] << 8) + new_status[2]; + log_debug("id retunred by tux: %i (0x%.2x%.2x)", + connection_status.tux_id, new_status[1], new_status[2]); break; case STATUS_PORTS_CMD: if (portb.Byte != new_status[1]) Modified: daemon/trunk/libs/USBDaemon_status_table.h =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.h 2007-06-07 07:28:06 UTC (rev 356) +++ daemon/trunk/libs/USBDaemon_status_table.h 2007-06-08 13:45:59 UTC (rev 357) @@ -65,6 +65,7 @@ #define DATA_TP_RSP 0x03 #define DATA_TP_ACK_CMD 0x04 #define DATA_TP_ACK_DP 0x05 +#define TUX_CONNECTION_CMD 0x06 /* Sub data types */ #define SUBDATA_TP_RAW 0x01 @@ -176,6 +177,26 @@ #define DATA_STATUS_SOUND_COUNT 0x23 #define DATA_STATUS_PONG 0x24 +/* tux connection commands available on the usb dongle */ +typedef enum +{ + TUX_CONNECTION_DISCONNECT = 1, + TUX_CONNECTION_CONNECT = 2, + TUX_CONNECTION_RANDOM = 3, + TUX_CONNECTION_ID_REQUEST = 4, + TUX_CONNECTION_ID_LOOKUP = 5, + TUX_CONNECTION_CHANGE_ID = 6, + TUX_CONNECTION_SLEEP = 7, + TUX_CONNECTION_WAKEUP = 8, + TUX_CONNECTION_WIRELESS_CHANNEL = 9, +} tux_connection_t; + +typedef enum +{ + TUX_CONNECTION_NACK = 0, + TUX_CONNECTION_ACK = 1, + TUX_CONNECTION_NOTFOUND = 2, +} tux_connection_ack_t; /* ------------------ Daemon to Application, frame construction ----------------- */ /*_____________________ T Y P E _ D E F ____________________________________*/ Modified: daemon/trunk/libs/USBDaemon_usb_enum.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.c 2007-06-07 07:28:06 UTC (rev 356) +++ daemon/trunk/libs/USBDaemon_usb_enum.c 2007-06-08 13:45:59 UTC (rev 357) @@ -36,7 +36,7 @@ /*_____________________ V A R I A B L E S __________________________________*/ usb_dev_handle *tux_handle; struct usb_device *tux_device; -TUX_USB_CONN_STATUS TUX_USB_STATUS = TUX_USB_DISCONNECTED; +usb_connection_status_t usb_connection_status = USB_DISCONNECTED; /*_____________________ F U N C T I O N S __________________________________*/ @@ -119,13 +119,16 @@ if (tux_device->descriptor.bcdDevice < 0x100) { log_error("Your dongle firmware is too old.\n" - "This version is not compatible with this daemon, please update\n" - "the firmware to version 1.00 or better.\n" - "Check http://www.tuxisalive.com/documentation/how-to/updating-the-firmware\n" - "for details."); + "This version is not compatible with this daemon, please \ + update\n" + "the firmware to version 1.00 or better.\n" + "Check http://www.tuxisalive.com/documentation/how-to/\ + updating-the-firmware\nfor details."); return 0; } + log_debug("Fux found on the USB bus"); + /* Get Device handle */ tux_handle = usb_open_TuxDroid(tux_device); if (tux_handle == NULL) @@ -133,12 +136,13 @@ log_error("You must load the daemon in root mode"); return 0; } + log_debug("Fux USB device opened"); - TUX_USB_STATUS = TUX_USB_CONNECTED; + usb_connection_status = USB_CONNECTED; /* Resets audio channel selection; there are 2 audio interfaces in the * dongle, the second is dedicated to TTS. */ - send_usb_dongle_cmd(USB_AUDIO_CMD, 0, 0, 0); /* select the first audio channel */ + send_usb_dongle_cmd(USB_AUDIO_CMD, 0, 0, 0); current_audio_channel = 0; return 1; Modified: daemon/trunk/libs/USBDaemon_usb_enum.h =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.h 2007-06-07 07:28:06 UTC (rev 356) +++ daemon/trunk/libs/USBDaemon_usb_enum.h 2007-06-08 13:45:59 UTC (rev 357) @@ -29,41 +29,48 @@ /*_____________________ D E F I N E S ______________________________________*/ +#define USB_FRAME_SIZE 5 /*_____________________ E N U M S ______________________________________*/ typedef enum { - TUX_USB_DISCONNECTED = 0, - TUX_USB_CONNECTED = 1 -} TUX_USB_CONN_STATUS; + USB_DISCONNECTED = 0, + USB_CONNECTED = 1 +} usb_connection_status_t; typedef enum { USB_TUX_CMD = 0, USB_DONGLE_CMD = 1, USB_BOOTLOADER_CMD = 2, -} USB_HEADER_TYPE; +} usb_command_header_t; typedef enum { - USB_CONNECTION_CMD = 0, + USB_TUX_CONNECTION_CMD = 0, USB_STATUS_CMD = 1, USB_AUDIO_CMD = 2, USB_VERSION_CMD = 6, -} USB_DONGLE_COMMANDS; +} usb_dongle_commands_t; +/* tux connection commands available on the usb dongle + * + * These are of the following type: + * USB_DONGLE_CMD, USB_TUX_CONNECTION_CMD + */ typedef enum { - USB_CONNECTION_CONNECT = 1, - USB_CONNECTION_DISCONNECT = 2, - USB_CONNECTION_ID_LOOKUP = 3, - USB_CONNECTION_CHANGE_ID = 4, - USB_CONNECTION_WAKEUP = 5, - USB_CONNECTION_WIRELESS_CHANNEL = 6, -} USB_ID_PARAM1; + USB_TUX_CONNECTION_DISCONNECT = 1, + USB_TUX_CONNECTION_CONNECT = 2, + USB_TUX_CONNECTION_ID_REQUEST = 3, + USB_TUX_CONNECTION_ID_LOOKUP = 4, + USB_TUX_CONNECTION_CHANGE_ID = 5, + USB_TUX_CONNECTION_WAKEUP = 6, + USB_TUX_CONNECTION_WIRELESS_CHANNEL = 7, +} usb_tux_connection_t; /*_____________________ V A R I A B L E S __________________________________*/ extern usb_dev_handle *tux_handle; -extern TUX_USB_CONN_STATUS TUX_USB_STATUS; +extern usb_connection_status_t usb_connection_status; /*_____________________ F U N C T I O N S __________________________________*/ Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-06-07 07:28:06 UTC (rev 356) +++ daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-06-08 13:45:59 UTC (rev 357) @@ -43,7 +43,7 @@ int idx; int i; - if (TUX_USB_CONNECTED != TUX_USB_STATUS) + if (usb_connection_status != USB_CONNECTED) return; for (i = 0; i < 5; i++) @@ -72,7 +72,7 @@ int idx; int num_frames, i; - if (TUX_USB_CONNECTED != TUX_USB_STATUS) + if (usb_connection_status != USB_CONNECTED) return; idx = usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char *)cmd_send, @@ -119,7 +119,7 @@ unsigned char counter; unsigned char csf; - if (TUX_USB_CONNECTED != TUX_USB_STATUS) + if (usb_connection_status != USB_CONNECTED) return ACK_CMD_DONGLE_NOT_PRESENT; /* Send data */ Modified: firmware/tuxdefs/commands.h =================================================================== --- firmware/tuxdefs/commands.h 2007-06-07 07:28:06 UTC (rev 356) +++ firmware/tuxdefs/commands.h 2007-06-08 13:45:59 UTC (rev 357) @@ -223,8 +223,11 @@ * Sleep commands */ #define SLEEP_CMD 0xB7 /* set the CPU in sleep mode */ -/* 1st parameter: type of sleep mode */ -/* 2nd parameter: reserved */ +/* 1st parameter: reserved */ +/* 2nd parameter: type of sleep mode */ +#define DEEPSLEEP_MODE 1 /* minimal power consumption, can't wake-up from this + mode */ +#define SLEEP_MODE 2 /* standard sleep mode */ #define SLEEP_ACK_CMD 0xF7 /* acknowledge of the sleep mode command */ /* 1st parameter: acknowledge of tuxcore */ /* 2nd parameter: acknowledge of tuxaudio */ @@ -311,6 +314,10 @@ /* 2nd parameter: undefined */ /* 3rd parameter: undefined */ +#define STATUS_ID_CMD 0xC6 +/* 1st parameter: Tux ID number (MSB) */ +/* 2nd parameter: Tux ID number (LSB) */ + /* * Special commands */ |
From: jaguarondi <c2m...@c2...> - 2007-06-07 07:28:35
|
Author: jaguarondi Date: 2007-06-07 09:28:06 +0200 (Thu, 07 Jun 2007) New Revision: 356 Modified: daemon/trunk/main.c Log: * Moved the debug message of drop_privileges so it only shows when you're root. Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-06-06 09:53:10 UTC (rev 355) +++ daemon/trunk/main.c 2007-06-07 07:28:06 UTC (rev 356) @@ -133,8 +133,6 @@ */ static int drop_privileges(void) { - log_debug("Dropping privileges if running as root"); - /* Store initial uid and gid */ user = getuid(); group = getgid(); @@ -143,6 +141,8 @@ if (user) return 0; + log_debug("Dropping privileges"); + if (setegid(NEWGID) == 0 && seteuid(NEWUID) == 0) return 0; |
From: jaguarondi <c2m...@c2...> - 2007-06-06 09:53:16
|
Author: jaguarondi Date: 2007-06-06 11:53:10 +0200 (Wed, 06 Jun 2007) New Revision: 355 Modified: daemon/trunk/main.c Log: * Only drop privileges if running as root as standrad users can't do that. Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-06-06 08:44:58 UTC (rev 354) +++ daemon/trunk/main.c 2007-06-06 09:53:10 UTC (rev 355) @@ -133,12 +133,16 @@ */ static int drop_privileges(void) { - log_debug("Dropping privileges"); + log_debug("Dropping privileges if running as root"); /* Store initial uid and gid */ user = getuid(); group = getgid(); + /* Check if running as root */ + if (user) + return 0; + if (setegid(NEWGID) == 0 && seteuid(NEWUID) == 0) return 0; @@ -391,6 +395,7 @@ if (drop_privileges() < 0) exit(1); + /* Main loop */ tcp_server_loop(); exit(0); |
From: remi <c2m...@c2...> - 2007-06-06 08:45:02
|
Author: remi Date: 2007-06-06 10:44:58 +0200 (Wed, 06 Jun 2007) New Revision: 354 Modified: software/tuxgi/trunk/tuxgi.py software/tuxgi/trunk/tuxgi2.glade Log: UPD Automatic update of the voices list. Minor changes for the compatibility with the last api. Modified: software/tuxgi/trunk/tuxgi.py =================================================================== --- software/tuxgi/trunk/tuxgi.py 2007-06-06 08:16:20 UTC (rev 353) +++ software/tuxgi/trunk/tuxgi.py 2007-06-06 08:44:58 UTC (rev 354) @@ -65,6 +65,10 @@ ('xterm', '-e'), # X ] # list of tuple instead of a dictionary as the order matters +voice_list_changed = False +voice_list = gtk.ListStore(gobject.TYPE_STRING) +voice_dic = {} +current_voice = "" if not os.popen('type ipython').close(): py_cmd = 'ipython' else: @@ -93,9 +97,10 @@ # On new window #-------------------------------------------------------------------------- def new(self): - self.get_widget("comboboxentry1").set_active(2) + self.update_voice_list() tux.tts.on_sound_on=self.on_sound_on tux.tts.on_sound_off=self.on_sound_off + tux.tts.on_voice_list=self.on_voice_list tux.event.on_status=self.on_status tux.event.on_left_blue_led_on=self.on_right_blue_led_on tux.event.on_left_blue_led_off=self.on_right_blue_led_off @@ -115,43 +120,43 @@ toggled_by_event=True tux.destroy() sys.exit(0) - + #-------------------------------------------------------------------------- # On left blue led status is on - #-------------------------------------------------------------------------- + #-------------------------------------------------------------------------- def on_left_blue_led_on(self): global toggled_by_event toggled_by_event=True - self.get_widget("checkbutton1").set_active(True) - toggled_by_event=False - + self.get_widget("checkbutton1").set_active(True) + toggled_by_event=False + #-------------------------------------------------------------------------- # On left blue led status is off - #-------------------------------------------------------------------------- + #-------------------------------------------------------------------------- def on_left_blue_led_off(self): global toggled_by_event toggled_by_event=True - self.get_widget("checkbutton1").set_active(False) - toggled_by_event=False - + self.get_widget("checkbutton1").set_active(False) + toggled_by_event=False + #-------------------------------------------------------------------------- # On right blue led status is on - #-------------------------------------------------------------------------- + #-------------------------------------------------------------------------- def on_right_blue_led_on(self): global toggled_by_event toggled_by_event=True - self.get_widget("checkbutton2").set_active(True) - toggled_by_event=False - + self.get_widget("checkbutton2").set_active(True) + toggled_by_event=False + #-------------------------------------------------------------------------- # On right blue led status is off - #-------------------------------------------------------------------------- + #-------------------------------------------------------------------------- def on_right_blue_led_off(self): global toggled_by_event toggled_by_event=True - self.get_widget("checkbutton2").set_active(False) - toggled_by_event=False - + self.get_widget("checkbutton2").set_active(False) + toggled_by_event=False + #-------------------------------------------------------------------------- # On mouth stop #-------------------------------------------------------------------------- @@ -163,10 +168,10 @@ else: self.get_widget("radiobutton4").set_active(True) toggled_by_event=False - + #-------------------------------------------------------------------------- # On eyes stop - #-------------------------------------------------------------------------- + #-------------------------------------------------------------------------- def on_eyes_stop(self): global toggled_by_event toggled_by_event=True @@ -175,21 +180,21 @@ else: self.get_widget("radiobutton2").set_active(True) toggled_by_event=False - + #-------------------------------------------------------------------------- # Event on status #-------------------------------------------------------------------------- - def on_status(self): + def on_status(self,frame): global status_list_st global status_list_changed - explicite_status=tux.explicit_status() + explicite_status=tux.explicit_status(frame) if explicite_status.find("RF connected->") != 0: status_list_changed=True status_list_st.append(explicite_status) if len(status_list_st)==50: for i in range(1): status_list_st.pop(0) - + #-------------------------------------------------------------------------- # Status viewer refreshing thread #-------------------------------------------------------------------------- @@ -198,6 +203,8 @@ global status_list_changed global onpause global onplay + global voice_list_changed + last_tuxdaemon_connect=False last_tuxttsdaemon_connect=False last_rf_state=False @@ -210,7 +217,7 @@ string="" if self.get_widget("checkbutton3").get_active(): for i in range(len(status_list_st)): - string=status_list_st[i]+"\n"+string + string=status_list_st[i]+"\n"+string else: string=status_list_st[len(status_list_st)-1]+"\n" statusview_b.insert(startiter,string) @@ -226,36 +233,40 @@ soundcard = tux.hw.alsa_device self.get_widget("togglebutton3").set_active(False) toggled_by_event=False - self.get_widget("image2").set_from_stock(gtk.STOCK_APPLY, - gtk.ICON_SIZE_BUTTON) + self.get_widget("image2").set_from_stock(gtk.STOCK_APPLY\ + ,gtk.ICON_SIZE_BUTTON) self.on_mouth_stop() self.on_eyes_stop() tux.cmd.leds_blink(2,1) else: - self.get_widget("image2").set_from_stock(gtk.STOCK_CANCEL, - gtk.ICON_SIZE_BUTTON) + self.get_widget("image2").set_from_stock(gtk.STOCK_CANCEL\ + ,gtk.ICON_SIZE_BUTTON) tux.status.rf_connected = False if tux.tts.connected!=last_tuxttsdaemon_connect: last_tuxttsdaemon_connect=tux.tts.connected if tux.tts.connected: - self.get_widget("image3").set_from_stock(gtk.STOCK_APPLY, - gtk.ICON_SIZE_BUTTON) + self.get_widget("image3").set_from_stock(gtk.STOCK_APPLY\ + ,gtk.ICON_SIZE_BUTTON) else: - self.get_widget("image3").set_from_stock(gtk.STOCK_CANCEL, - gtk.ICON_SIZE_BUTTON) + self.get_widget("image3").set_from_stock(gtk.STOCK_CANCEL\ + ,gtk.ICON_SIZE_BUTTON) if tux.status.rf_state()!=last_rf_state: last_rf_state = tux.status.rf_connected if last_rf_state: - self.get_widget("image4").set_from_stock(gtk.STOCK_APPLY, - gtk.ICON_SIZE_BUTTON) + self.get_widget("image4").set_from_stock(gtk.STOCK_APPLY\ + ,gtk.ICON_SIZE_BUTTON) else: - self.get_widget("image4").set_from_stock(gtk.STOCK_CANCEL, - gtk.ICON_SIZE_BUTTON) + self.get_widget("image4").set_from_stock(gtk.STOCK_CANCEL\ + ,gtk.ICON_SIZE_BUTTON) + if voice_list_changed: + voice_list_changed = False + self.update_voice_list() + tux.sys.wait(0.5) # ----------------------------------------------------------------------------- # Tab "main" events # ----------------------------------------------------------------------------- - + #-------------------------------------------------------------------------- # On left led checkbox toggled #-------------------------------------------------------------------------- @@ -285,7 +296,7 @@ def _funct(): num_sb=self.get_widget("spinbutton1") tux.cmd.leds_blink(int(num_sb.get_value()),15) - + thread.start_new_thread(_funct,()) #-------------------------------------------------------------------------- @@ -349,7 +360,7 @@ tux.cmd.raw(0x31,0,0,0) tux.event.wait_status(DATAS_STATUS_WINGS_POSITION_COUNTER,0,5) tux.cmd.wings_on(1) - + thread.start_new_thread(_funct,()) #-------------------------------------------------------------------------- @@ -362,7 +373,7 @@ if widget.get_active(): tux.cmd.raw(0x31,0,0,0) tux.event.wait_status(DATAS_STATUS_WINGS_POSITION_COUNTER,0,5) - + thread.start_new_thread(_funct,()) #-------------------------------------------------------------------------- @@ -381,8 +392,8 @@ tux.cmd.spinl_on_free(int(num_sb.get_value())) else: tux.cmd.spinr_on_free(int(num_sb.get_value())) - + #-------------------------------------------------------------------------- # On "Send command" button clicked #-------------------------------------------------------------------------- @@ -423,6 +434,10 @@ #-------------------------------------------------------------------------- def on_tts_play_bt_clicked(self, widget, *args): global toggled_by_event + global voice_dic + global voice_list + global current_voice + if toggled_by_event: return global onplay if onplay: @@ -430,7 +445,9 @@ else: voice_cb=self.get_widget("comboboxentry1") pitch_sb=self.get_widget("spinbutton6") - tux.tts.select_voice(voice_cb.get_active()+1,pitch_sb.get_value()) + voice_id = voice_dic[voice_list[voice_cb.get_active()][0]] + current_voice = voice_list[voice_cb.get_active()][0] + tux.tts.select_voice(voice_id,pitch_sb.get_value()) tux.tts.stop() textedit=self.get_widget("textview2") buffer=textedit.get_buffer() @@ -456,7 +473,7 @@ textedit=self.get_widget("textview2") buffer=textedit.get_buffer() buffer.set_text("") - + #-------------------------------------------------------------------------- # On TTS sound on event #-------------------------------------------------------------------------- @@ -468,7 +485,7 @@ toggled_by_event=False onplay=True tux.cmd.mouth_open() - + #-------------------------------------------------------------------------- # On TTS sound off event #-------------------------------------------------------------------------- @@ -481,6 +498,37 @@ onplay=False tux.cmd.mouth_close() + #-------------------------------------------------------------------------- + # On new authorized voices list event + #-------------------------------------------------------------------------- + def on_voice_list(self): + global voice_list_changed + + voice_list_changed = True + + #-------------------------------------------------------------------------- + # Update the voices list in the combobox + #-------------------------------------------------------------------------- + def update_voice_list(self): + global voice_list + global voice_dic + global current_voice + + voice_dic = {} + voice_list.clear() + for voice_id in tux.tts.authorized_voices_list: + voice_list.append([LANG_OF_SPK_LIST[voice_id],]) + voice_dic[LANG_OF_SPK_LIST[voice_id]] = voice_id + 1 + self.get_widget("comboboxentry1").set_model(voice_list) + if voice_dic.has_key(current_voice): + for i, voice_name in enumerate(voice_list): + if voice_name[0] == current_voice: + self.get_widget("comboboxentry1").set_active(i) + break + else: + self.get_widget("comboboxentry1").set_active(0) + + # ----------------------------------------------------------------------------- # Tab "Audio" events # ----------------------------------------------------------------------------- @@ -500,8 +548,8 @@ def on_wave_external_play_bt_clicked(self, widget, *args): if str(self.get_widget("filechooserbutton1").get_filename())=="None": return tux.sys.shell_free("aplay -D %s %s"% (soundcard, - self.get_widget("filechooserbutton1").get_filename())) - + self.get_widget("filechooserbutton1").get_filename())) + #-------------------------------------------------------------------------- # On select original sounds #-------------------------------------------------------------------------- @@ -523,7 +571,7 @@ wavs.wav_paths=[] wavs.wav_sizes=[] self.refresh_wav_list() - + #-------------------------------------------------------------------------- # On select internal wave file event #-------------------------------------------------------------------------- @@ -550,10 +598,10 @@ wavs.wav_sizes.pop(index-1) wavs.wav_paths.pop(index-1) self.refresh_wav_list() - + #-------------------------------------------------------------------------- # Refreshing wave list function - #-------------------------------------------------------------------------- + #-------------------------------------------------------------------------- def refresh_wav_list(self): wav_te=self.get_widget("textview3") wav_buffer=wav_te.get_buffer() @@ -578,10 +626,10 @@ #-------------------------------------------------------------------------- def on_wave_internal_store_bt_clicked(self, widget, *args): thread.start_new_thread(self.sound_storing,()) - + #-------------------------------------------------------------------------- # Store sound function - #-------------------------------------------------------------------------- + #-------------------------------------------------------------------------- def sound_storing(self): if tux.status.rf_state() == 0: return if len(wavs.wav_sizes)==0: return @@ -589,26 +637,26 @@ wav_buffer=wav_te.get_buffer() if not wavs.wavs_merging("merged.wav"): print wav_buffer.insert(wav_buffer.get_end_iter(), - "Sound storing : Error : file merged is too big\n") + "Sound storing : Error : file merged is too big\n") return wav_buffer.insert(wav_buffer.get_end_iter(), - "Sound storing : Erase flash\n") + "Sound storing : Erase flash\n") tux.cmd.sound_storing(len(wavs.wav_sizes)) tux.sys.wait(10) current_pos=0x0400 tux.sys.wait(0.1) wav_buffer.insert(wav_buffer.get_end_iter(), - "Sound storing : Indexes\n") + "Sound storing : Indexes\n") tux.cmd.sound_store_index(0x00,0x04,0x00) for size in wavs.wav_sizes: current_pos=current_pos+size tux.sys.wait(0.1) tux.cmd.sound_store_index((current_pos & 0xFF0000)>>16, - (current_pos & 0x00FF00)>>8,current_pos & 0x0000FF) + (current_pos & 0x00FF00)>>8,current_pos & 0x0000FF) wav_buffer.insert(wav_buffer.get_end_iter(),"Sound storing : Record\n") tux.sys.shell("aplay -D %s merged.wav"%soundcard) wav_buffer.insert(wav_buffer.get_end_iter(), - "Sound storing : Storage done.\n") + "Sound storing : Storage done.\n") tux.sys.wait(0.3) #-------------------------------------------------------------------------- @@ -618,7 +666,7 @@ def _funct(): index=self.get_widget("spinbutton7").get_value() tux.cmd.sound_play(int(index),0) - + thread.start_new_thread(_funct,()) #-------------------------------------------------------------------------- @@ -714,7 +762,7 @@ #-------------------------------------------------------------------------- def new(self): print "A new %s has been created" % self.__class__.__name__ - + #-------------------------------------------------------------------------- # On window destroy #-------------------------------------------------------------------------- @@ -727,7 +775,7 @@ def on_sendcommand_bt_clicked(self, widget, *args): commandst=self.get_widget("entry1").get_text() commands=commandst.split(" ") - if len(commands)<4: + if len(commands)<4: return else: commandp=[0,0,0,0] @@ -737,7 +785,7 @@ else: commandp[i]=int(commands[i]) tux.cmd.raw(int(commandp[0]),int(commandp[1]),int(commandp[2]), - int(commandp[3])) + int(commandp[3])) #------------------------------------------------------------------------------ Modified: software/tuxgi/trunk/tuxgi2.glade =================================================================== --- software/tuxgi/trunk/tuxgi2.glade 2007-06-06 08:16:20 UTC (rev 353) +++ software/tuxgi/trunk/tuxgi2.glade 2007-06-06 08:44:58 UTC (rev 354) @@ -1323,13 +1323,15 @@ <child> <widget class="GtkComboBoxEntry" id="comboboxentry1"> - <property name="width_request">187</property> + <property name="width_request">300</property> <property name="height_request">27</property> <property name="visible">True</property> <property name="items" translatable="yes">FR male FR female US male -US female</property> +US female +NL male +NL female</property> <property name="add_tearoffs">False</property> <property name="has_frame">True</property> <property name="focus_on_click">True</property> |
From: remi <c2m...@c2...> - 2007-06-06 08:16:29
|
Author: remi Date: 2007-06-06 10:16:20 +0200 (Wed, 06 Jun 2007) New Revision: 353 Modified: api/python/trunk/tuxapi_class.py api/python/trunk/tuxapi_const.py Log: UPD System update: - LockMutex system added for the synchronous request of statuses. - Access to asynchronous statuses has been modified - Storage of events has been modified Functions updated: - To_string function has been modified Functions added: - Authorized voices from the ttsdaemon has been implemented - Function to simulate the receiving of a remote key has been added Modified: api/python/trunk/tuxapi_class.py =================================================================== --- api/python/trunk/tuxapi_class.py 2007-06-05 21:26:38 UTC (rev 352) +++ api/python/trunk/tuxapi_class.py 2007-06-06 08:16:20 UTC (rev 353) @@ -29,13 +29,14 @@ import thread import threading import string +import signal from tuxapi_const import * #============================================================================== # Constants #============================================================================== -api_version ="0.2.1" +api_version ="0.2.2" #============================================================================== # TUXTCPCommunicator class @@ -80,13 +81,16 @@ self.exit_flag=False self.tcp_mutex=threading.Lock() self.print_warnings_mutex=threading.Lock() - self.tcp_data=(' ')*6 - self.datas_threated=True - self.tcp_data_for_event=(' ')*6 self.my_name="Tux client" self.print_status=False self.print_warnings=True self.print_debug_thread=False + self.lock_list = [] + self.lock_list_mutex = threading.Lock() + self.tcp_data_fifo_lock = [] + self.tcp_data_fifo_lock_mutex = threading.Lock() + self.tcp_data_fifo_event = [] + self.tcp_data_fifo_event_mutex = threading.Lock() self.event=TUXevent(self) self.cmd=TUXcmd(self) self.sys=TUXsys(self) @@ -97,8 +101,6 @@ self.tts=TUXtts(self) self.misc=TUXmisc(self) self.connected=False #deprecated - self.last_threated_data_id=0 - self.current_data_id=0 t=threading.Thread(target=self.daemon._loop_auto_connect) t.setName('daemon._loop_auto_connect') t.start() @@ -137,48 +139,137 @@ """ while self.daemon.connected: try: - self.tcp_mutex.acquire() tmp_tcp_data=self.sock.recv(16) except socket.timeout: - self.tcp_mutex.release() time.sleep(0.01) continue except socket.error: self.sock.close() self.daemon.connected=False - self.tcp_mutex.release() time.sleep(0.01) continue if len(tmp_tcp_data)<16: - self.tcp_mutex.release() time.sleep(0.01) continue - self.current_data_id=(self.current_data_id+1)&0xFFFFFF - self.tcp_data=tmp_tcp_data - data=self.tcp_data - self.datas_threated=False + self.tcp_data_fifo_lock_mutex.acquire() + self.tcp_data_fifo_lock.append(tmp_tcp_data) + self.tcp_data_fifo_lock_mutex.release() + self.tcp_data_fifo_event_mutex.acquire() + self.tcp_data_fifo_event.append(tmp_tcp_data) + self.tcp_data_fifo_event_mutex.release() if self.print_status: struct_data = ["%.2x" % ord(datae) for datae in self.tcp_data] print " ".join(struct_data) - self.tcp_mutex.release() time.sleep(0.01) #-------------------------------------------------------------------------- # SYSTEM function #-------------------------------------------------------------------------- + def _loop_lock_list(self): + """ + Not a user function + self.lock_list + self.lock_list_mutex + self.tcp_data_fifo_lock + self.tcp_data_fifo_lock_mutex + """ + while self.daemon.connected: + # get a private lock_list from the class lock_list + self.lock_list_mutex.acquire() + lock_list = self.lock_list + self.lock_list_mutex.release() + # get a private data_fifo from the class data_fifo + self.tcp_data_fifo_lock_mutex.acquire() + if len(self.tcp_data_fifo_lock) > 0: + data_fifo = self.tcp_data_fifo_lock.pop(0) + else: + data_fifo = (chr(99))*16 + self.tcp_data_fifo_lock_mutex.release() + # get the time now in seconds + now = self.sys.time() + # check the whole of the lock elements + # lock[0] : list of data to match + # lock[1] : condition mutex + # lock[2] : data returned + for i,lock in enumerate(lock_list): + # for the whole of the lock data + for lock_data in lock[0]: + # if the lock data is matched + if lock_data[0] in [ord(data_fifo[0]), 999]\ + and lock_data[1] in [ord(data_fifo[1]), 999]\ + and lock_data[2] in [ord(data_fifo[2]), 999]\ + and lock_data[3] in [ord(data_fifo[3]), 999]\ + and lock_data[4] in [ord(data_fifo[4]), 999]\ + and lock_data[5] in [ord(data_fifo[5]), 999]\ + and lock_data[6] in [ord(data_fifo[6]), 999]\ + and lock_data[7] in [ord(data_fifo[7]), 999]\ + and lock_data[8] in [ord(data_fifo[8]), 999]\ + and lock_data[9] in [ord(data_fifo[9]), 999]\ + and lock_data[10] in [ord(data_fifo[10]), 999]\ + and lock_data[11] in [ord(data_fifo[11]), 999]\ + and lock_data[12] in [ord(data_fifo[12]), 999]\ + and lock_data[13] in [ord(data_fifo[13]), 999]\ + and lock_data[14] in [ord(data_fifo[14]), 999]\ + and lock_data[15] in [ord(data_fifo[15]), 999]: + # return the data ones who have unblocked the lock + lock[2].append(data_fifo) + # unblock the lock + lock[1].acquire() + lock[1].notify() + lock[1].release() + lock_list.pop(i) + continue + time.sleep(0.01) + # kill the whole of the lock elements from the list + self._close_lock_list() + + #-------------------------------------------------------------------------- + # SYSTEM function + #-------------------------------------------------------------------------- + def _close_lock_list(self): + self.lock_list_mutex.acquire() + # unblock the whole of the lock elements + for i,lock in enumerate(self.lock_list): + lock[1].acquire() + lock[1].notify() + lock[1].release() + self.lock_list.pop(i) + self.lock_list_mutex.release() + + #-------------------------------------------------------------------------- + # SYSTEM function + #-------------------------------------------------------------------------- + def _insert_lock_in_list(self,data_to_match_list,cond_lock_mutex,returned_data): + # lock[0] : list of the possible frames to match + # lock[1] : condition mutex + # lock[2] : data returned + lock = [] + lock.append(data_to_match_list) + lock.append(cond_lock_mutex) + lock.append(returned_data) + self.lock_list_mutex.acquire() + self.lock_list.append(lock) + self.lock_list_mutex.release() + + #-------------------------------------------------------------------------- + # SYSTEM function + #-------------------------------------------------------------------------- def _loop_tux_data_dispatching(self): """ Not a user function """ while self.daemon.connected: - while self.datas_threated: - if not self.daemon.connected: return + data = () + self.tcp_data_fifo_event_mutex.acquire() + if len(self.tcp_data_fifo_event) > 0: + data = self.tcp_data_fifo_event.pop(0) + else: + self.tcp_data_fifo_event_mutex.release() time.sleep(0.003) - self.tcp_mutex.acquire() - data=self.tcp_data - self.tcp_mutex.release() + continue + self.tcp_data_fifo_event_mutex.release() self._dispatch_data_main(data) - self.datas_threated=True + time.sleep(0.003) #-------------------------------------------------------------------------- # SYSTEM function @@ -219,7 +310,7 @@ if ord(data[2])==DATA_TP_RSP: if ord(data[3])==SUBDATA_TP_STATUS: if self.event.on_status!=None: - self.event.on_status() + self.event.on_status(data) #Head button if ord(data[4])==DATAS_STATUS_HEAD_PUSH_SWITCH: if ord(data[5])==1: @@ -259,9 +350,11 @@ #Remote button if ord(data[4])==DATAS_STATUS_IR_CODE: if self.event.on_remote_bt[ord(data[5])]!=None: - self.event.on_remote_bt[ord(data[5])]() + thread.start_new_thread(self.event.on_remote_bt[ord(data[5])], ()) + #self.event.on_remote_bt[ord(data[5])]() if self.event.on_remote!=None: - self.event.on_remote(ord(data[5])) + thread.start_new_thread(self.event.on_remote, (ord(data[5]),)) + #self.event.on_remote(ord(data[5])) #Mouth open if ord(data[4])==DATAS_STATUS_MOUTH_OPEN_POSITION: if ord(data[5])==0: @@ -347,11 +440,11 @@ #-------------------------------------------------------------------------- # Deprecated functions #-------------------------------------------------------------------------- - def explicit_status(self): + def explicit_status(self,frame): """ Deprecated : see 'tux.status.to_string' """ - return self.status.to_string() + return self.status.to_string(frame) def connect_to_daemon(self): """ @@ -374,10 +467,13 @@ Class which manages the system functions Functions list for the users: + tux.sys.add_notification tux.sys.add_time_event + tux.sys.clear_notification tux.sys.clear_time_events tux.sys.delayed_function tux.sys.looped_function + tux.sys.remove_notification tux.sys.shell tux.sys.shell_free tux.sys.time @@ -452,10 +548,6 @@ >>> tux.sys.shell_free('ls -al') """ thread.start_new_thread(self.shell,(command,)) - #t=threading.Thread(target=self.shell,args=(command,)) - #t.setName('sys.shell') - #t.start() - #self.parent.daemon.free_thread_list.append(t) #-------------------------------------------------------------------------- # Add a time event in the time event handler @@ -592,7 +684,7 @@ "on_head_bt_released" as pof : On tux head button released "on_lwing_bt_released" as pof : On tux left wing button released "on_rwing_bt_released" as pof : On tux right wing button released - "on_remote_bt" as list of pof : On remote controller button pressed + "on_remote_bt" as list of pof : On remote controller button pressed "on_status" as pof : On status arrival "on_remote" as pof : On remote controller event param 1 : Key as integer @@ -619,19 +711,14 @@ "on_spin_stop" as pof : On spin stop event (pof = pointer of function) - Example of associating a function to an event: - >>> def my_function(): - >>> print "hello" - >>> tux.event.on_bt_pushed=my_function - Example of associating a function to a remote event: >>> def my_function(key): >>> print "Button %s is pressed"%remote_bt_name[key] >>> tux.event.on_remote=my_function - Example of associating a function to a specific remote event: - >>> def play_pause(): - >>> tux.sys.shell("audacious --play-pause") + Example of associating a function to a specific remote event: + >>> def play_pause(): + >>> tux.sys.shell("audacious --play-pause") >>> tux.event.on_remote_bt[K_PLAYPAUSE]=play_pause Key constants of the remote controller: @@ -668,6 +755,7 @@ Constructor of class """ self.parent=parent + self.event_storage_fifo = [] self.clear() #-------------------------------------------------------------------------- @@ -739,37 +827,41 @@ Example: >>> tux.event.store() """ - self.s_on_bt_pushed=self.on_bt_pushed - self.s_on_head_bt_pushed=self.on_head_bt_pushed - self.s_on_lwing_bt_pushed=self.on_lwing_bt_pushed - self.s_on_rwing_bt_pushed=self.on_rwing_bt_pushed - self.s_on_bt_released=self.on_bt_released - self.s_on_head_bt_released=self.on_head_bt_released - self.s_on_lwing_bt_released=self.on_lwing_bt_released - self.s_on_rwing_bt_released=self.on_rwing_bt_released - self.s_on_remote_bt=self.on_remote_bt - self.s_on_status=self.on_status - self.s_on_remote=self.on_remote - self.s_on_light_level=self.on_light_level - self.s_on_connected=self.on_connected - self.s_on_disconnected=self.on_disconnected - self.s_on_mouth_open=self.on_mouth_open - self.s_on_mouth_close=self.on_mouth_close - self.s_on_power_plugged=self.on_power_plugged - self.s_on_power_unplugged=self.on_power_unplugged - self.s_on_left_blue_led_on=self.on_left_blue_led_on - self.s_on_left_blue_led_off=self.on_left_blue_led_off - self.s_on_right_blue_led_on=self.on_right_blue_led_on - self.s_on_right_blue_led_off=self.on_right_blue_led_off - self.s_on_eyes_open=self.on_eyes_open - self.s_on_eyes_close=self.on_eyes_close - self.s_on_rf_connected=self.on_rf_connected - self.s_on_rf_disconnected=self.on_rf_disconnected - self.s_on_pong_received=self.on_pong_received - self.s_on_mouth_stop=on_mouth_stop - self.s_on_eyes_stop=on_eyes_stop - self.s_on_wings_stop=on_wings_stop - self.s_on_spin_stop=on_spin_stop + event_storage = [] + event_storage.append(self.on_bt_pushed) + event_storage.append(self.on_head_bt_pushed) + event_storage.append(self.on_lwing_bt_pushed) + event_storage.append(self.on_rwing_bt_pushed) + event_storage.append(self.on_bt_released) + event_storage.append(self.on_head_bt_released) + event_storage.append(self.on_lwing_bt_released) + event_storage.append(self.on_rwing_bt_released) + event_storage.append(self.on_remote_bt) + event_storage.append(self.on_status) + event_storage.append(self.on_remote) + event_storage.append(self.on_light_level) + event_storage.append(self.on_connected) + event_storage.append(self.on_disconnected) + event_storage.append(self.on_mouth_open) + event_storage.append(self.on_mouth_close) + event_storage.append(self.on_power_plugged) + event_storage.append(self.on_power_unplugged) + event_storage.append(self.on_left_blue_led_on) + event_storage.append(self.on_left_blue_led_off) + event_storage.append(self.on_right_blue_led_on) + event_storage.append(self.on_right_blue_led_off) + event_storage.append(self.on_eyes_open) + event_storage.append(self.on_eyes_close) + event_storage.append(self.on_rf_connected) + event_storage.append(self.on_rf_disconnected) + event_storage.append(self.on_pong_received) + event_storage.append(self.on_mouth_stop) + event_storage.append(self.on_eyes_stop) + event_storage.append(self.on_wings_stop) + event_storage.append(self.on_spin_stop) + event_storage.append(self.parent.tts.on_sound_on) + event_storage.append(self.parent.tts.on_sound_off) + self.event_storage_fifo.append(event_storage) #-------------------------------------------------------------------------- # Restore all events @@ -781,37 +873,41 @@ Example: >>> tux.event.restore() """ - self.on_bt_pushed=self.s_on_bt_pushed - self.on_head_bt_pushed=self.s_on_head_bt_pushed - self.on_lwing_bt_pushed=self.s_on_lwing_bt_pushed - self.on_rwing_bt_pushed=self.s_on_rwing_bt_pushed - self.on_bt_released=self.s_on_bt_released - self.on_head_bt_released=self.s_on_head_bt_released - self.on_lwing_bt_released=self.s_on_lwing_bt_released - self.on_rwing_bt_released=self.s_on_rwing_bt_released - self.on_remote_bt=self.s_on_remote_bt - self.on_status=self.s_on_status - self.on_remote=self.s_on_remote - self.on_light_level=self.s_on_light_level - self.on_connected=self.s_on_connected - self.on_disconnected=self.s_on_disconnected - self.on_mouth_open=self.s_on_mouth_open - self.on_mouth_close=self.s_on_mouth_close - self.on_power_plugged=self.s_on_power_plugged - self.on_power_unplugged=self.s_on_power_unplugged - self.on_left_blue_led_on=self.s_on_left_blue_led_on - self.on_left_blue_led_off=self.s_on_left_blue_led_off - self.on_right_blue_led_on=self.s_on_right_blue_led_on - self.on_right_blue_led_off=self.s_on_right_blue_led_off - self.on_eyes_open=self.s_on_eyes_open - self.on_eyes_close=self.s_on_eyes_close - self.on_rf_connected=self.s_on_rf_connected - self.on_rf_disconnected=self.s_on_rf_disconnected - self.on_pong_received=self.s_on_pong_received - self.on_mouth_stop=s_on_mouth_stop - self.on_eyes_stop=s_on_eyes_stop - self.on_wings_stop=s_on_wings_stop - self.on_spin_stop=s_on_spin_stop + if len(self.event_storage_fifo) == 0: return + event_storage = self.event_storage_fifo.pop() + self.on_bt_pushed=event_storage.pop(0) + self.on_head_bt_pushed=event_storage.pop(0) + self.on_lwing_bt_pushed=event_storage.pop(0) + self.on_rwing_bt_pushed=event_storage.pop(0) + self.on_bt_released=event_storage.pop(0) + self.on_head_bt_released=event_storage.pop(0) + self.on_lwing_bt_released=event_storage.pop(0) + self.on_rwing_bt_released=event_storage.pop(0) + self.on_remote_bt=event_storage.pop(0) + self.on_status=event_storage.pop(0) + self.on_remote=event_storage.pop(0) + self.on_light_level=event_storage.pop(0) + self.on_connected=event_storage.pop(0) + self.on_disconnected=event_storage.pop(0) + self.on_mouth_open=event_storage.pop(0) + self.on_mouth_close=event_storage.pop(0) + self.on_power_plugged=event_storage.pop(0) + self.on_power_unplugged=event_storage.pop(0) + self.on_left_blue_led_on=event_storage.pop(0) + self.on_left_blue_led_off=event_storage.pop(0) + self.on_right_blue_led_on=event_storage.pop(0) + self.on_right_blue_led_off=event_storage.pop(0) + self.on_eyes_open=event_storage.pop(0) + self.on_eyes_close=event_storage.pop(0) + self.on_rf_connected=event_storage.pop(0) + self.on_rf_disconnected=event_storage.pop(0) + self.on_pong_received=event_storage.pop(0) + self.on_mouth_stop=event_storage.pop(0) + self.on_eyes_stop=event_storage.pop(0) + self.on_wings_stop=event_storage.pop(0) + self.on_spin_stop=event_storage.pop(0) + self.parent.tts.on_sound_on=event_storage.pop(0) + self.parent.tts.on_sound_off=event_storage.pop(0) #-------------------------------------------------------------------------- # Wait until the specified status arrives @@ -832,31 +928,28 @@ >>> var=tux.event.wait_status(DATAS_STATUS_HEAD_PUSH_SWITCH,1,2) (see 'tuxapi_const.py' for the complete list of statuses) """ - if not self.parent.daemon.connected: + # create a condition mutex + cond_lock_mutex = threading.Condition(threading.Lock()) + # create a list of frames to match + data_to_match_list = [] + # create and insert a frame to match + data_to_match = (SOURCE_TUX,SS_DEFAULT,DATA_TP_RSP,\ + SUBDATA_TP_STATUS,DATA_STATUS,DATA_VALUE,0,0,0,0,0,\ + 0,0,0,0,0) + data_to_match_list.append(data_to_match) + # create empty frame returned + returned_data = [] + # insert theses settings in the lock list + self.parent._insert_lock_in_list(data_to_match_list,cond_lock_mutex,returned_data) + # wait the lock has unblocked. With a time-out + cond_lock_mutex.acquire() + cond_lock_mutex.wait(time_out) + cond_lock_mutex.release() + # returns + if len(returned_data) == 0: return False - time_beginin=self.parent.sys.time() - while True: - if self.parent.daemon.connected: - self.parent.tcp_mutex.acquire() - data=self.parent.tcp_data - if self.parent.current_data_id==self.parent.last_threated_data_id: - self.parent.tcp_mutex.release() - time.sleep(0.001) - if (self.parent.sys.time()-time_beginin)>=time_out and time_out!=9999: - return False - continue - self.parent.last_threated_data_id=self.parent.current_data_id - self.parent.tcp_mutex.release() - if ord(data[0])==SOURCE_TUX: - if ord(data[1])==SS_DEFAULT: - if ord(data[2])==DATA_TP_RSP: - if ord(data[3])==SUBDATA_TP_STATUS: - if ord(data[4])==DATA_STATUS: - if ord(data[5])==DATA_VALUE: - return True - if (self.parent.sys.time()-time_beginin)>=time_out and time_out!=9999: - return False - time.sleep(0.001) + else: + return True #-------------------------------------------------------------------------- # Wait for stable status @@ -903,37 +996,43 @@ Example: >>> tux.event.wait_bt_pushed(10) """ - if not self.parent.daemon.connected: - return 0 - time_beginin=self.parent.sys.time() - while True: - if self.parent.daemon.connected: - self.parent.tcp_mutex.acquire() - data=self.parent.tcp_data - if self.parent.current_data_id==self.parent.last_threated_data_id: - self.parent.tcp_mutex.release() - time.sleep(0.001) - if (self.parent.sys.time()-time_beginin)>=time_out and time_out!=9999: - return 0 - continue - self.parent.last_threated_data_id=self.parent.current_data_id - self.parent.tcp_mutex.release() - if ord(data[0])==SOURCE_TUX: - if ord(data[1])==SS_DEFAULT: - if ord(data[2])==DATA_TP_RSP: - if ord(data[3])==SUBDATA_TP_STATUS: - if ord(data[4])==DATAS_STATUS_HEAD_PUSH_SWITCH: - if ord(data[5])==1: - return HEAD_BT - elif ord(data[4])==DATAS_STATUS_LEFT_WING_PUSH: - if ord(data[5])==1: - return LEFT_WING_BT - elif ord(data[4])==DATAS_STATUS_RIGHT_WING_PUSH: - if ord(data[5])==1: - return RIGHT_WING_BT - if (self.parent.sys.time()-time_beginin)>=time_out and time_out!=9999: - return 0 - time.sleep(0.001) + # create a condition mutex + cond_lock_mutex = threading.Condition(threading.Lock()) + # create a list of frames to match + data_to_match_list = [] + # create and insert a frame to match + data_to_match = (SOURCE_TUX,SS_DEFAULT,DATA_TP_RSP,\ + SUBDATA_TP_STATUS,DATAS_STATUS_HEAD_PUSH_SWITCH,1,0,0,0,0,0,\ + 0,0,0,0,0) + data_to_match_list.append(data_to_match) + # create and insert a frame to match + data_to_match = (SOURCE_TUX,SS_DEFAULT,DATA_TP_RSP,\ + SUBDATA_TP_STATUS,DATAS_STATUS_LEFT_WING_PUSH,1,0,0,0,0,0,\ + 0,0,0,0,0) + data_to_match_list.append(data_to_match) + # create and insert a frame to match + data_to_match = (SOURCE_TUX,SS_DEFAULT,DATA_TP_RSP,\ + SUBDATA_TP_STATUS,DATAS_STATUS_RIGHT_WING_PUSH,1,0,0,0,0,0,\ + 0,0,0,0,0) + data_to_match_list.append(data_to_match) + # create empty frame returned + returned_data = [] + # insert theses settings in the lock list + self.parent._insert_lock_in_list(data_to_match_list,cond_lock_mutex,returned_data) + # wait the lock has unblocked. With a time-out + cond_lock_mutex.acquire() + cond_lock_mutex.wait(time_out) + cond_lock_mutex.release() + # returns + if len(returned_data) == 0: + return NONE_BT + else: + if ord(returned_data[0][4]) == DATAS_STATUS_HEAD_PUSH_SWITCH: + return HEAD_BT + if ord(returned_data[0][4]) == DATAS_STATUS_LEFT_WING_PUSH: + return LEFT_WING_BT + if ord(returned_data[0][4]) == DATAS_STATUS_RIGHT_WING_PUSH: + return RIGHT_WING_BT #-------------------------------------------------------------------------- # Wait until head button is pushed @@ -956,7 +1055,7 @@ #-------------------------------------------------------------------------- # Wait until head button is released #-------------------------------------------------------------------------- - def wait_head_bt_released(self): + def wait_head_bt_released(self,time_out): """ Wait until head button is released @@ -969,7 +1068,7 @@ Example: >>> tux.event.wait_head_bt_released(2) """ - return self.wait_status(DATAS_STATUS_HEAD_PUSH_SWITCH,0,9999) + return self.wait_status(DATAS_STATUS_HEAD_PUSH_SWITCH,0,time_out) #-------------------------------------------------------------------------- # Wait until left wing is pushed @@ -992,7 +1091,7 @@ #-------------------------------------------------------------------------- # Wait until left wing is released #-------------------------------------------------------------------------- - def wait_lwing_bt_released(self): + def wait_lwing_bt_released(self,time_out): """ Wait until left wing is released @@ -1005,7 +1104,7 @@ Example: >>> tux.event.wait_lwing_bt_released(2) """ - return self.wait_status(DATAS_STATUS_LEFT_WING_PUSH,0,9999) + return self.wait_status(DATAS_STATUS_LEFT_WING_PUSH,0,time_out) #-------------------------------------------------------------------------- # Wait until right wing is pushed @@ -1028,7 +1127,7 @@ #-------------------------------------------------------------------------- # Wait until right wing is released #-------------------------------------------------------------------------- - def wait_rwing_bt_released(self): + def wait_rwing_bt_released(self,time_out): """ Wait until right wing is released @@ -1041,7 +1140,7 @@ Example: >>> tux.event.wait_rwing_bt_released(2) """ - return self.wait_status(DATAS_STATUS_RIGHT_WING_PUSH,0,9999) + return self.wait_status(DATAS_STATUS_RIGHT_WING_PUSH,0,time_out) #-------------------------------------------------------------------------- # Wait until a specified key of the remote is pressed @@ -1191,27 +1290,28 @@ """ Not a user function """ - time_beginin=self.parent.sys.time() - while True: - if self.parent.daemon.connected: - self.parent.tcp_mutex.acquire() - data=self.parent.tcp_data - if self.parent.current_data_id==self.parent.last_threated_data_id: - self.parent.tcp_mutex.release() - time.sleep(0.001) - if (self.parent.sys.time()-time_beginin)>=2: - return ACK_CMD_TIMEOUT - continue - self.parent.last_threated_data_id=self.parent.current_data_id - self.parent.tcp_mutex.release() - if ord(data[0])==SOURCE_TUX: - if ord(data[1])==SS_DEFAULT: - if ord(data[2])==DATA_TP_ACK_CMD: - result=ord(data[4]) - return result - if (self.parent.sys.time()-time_beginin)>=2: - return ACK_CMD_TIMEOUT - time.sleep(0.001) + # create a condition mutex + cond_lock_mutex = threading.Condition(threading.Lock()) + # create a list of frames to match + data_to_match_list = [] + # create and insert a frame to match + data_to_match = (SOURCE_TUX,SS_DEFAULT,DATA_TP_ACK_CMD,\ + 999,999,999,999,999,999,999,999,\ + 999,999,999,999,999) + data_to_match_list.append(data_to_match) + # create empty frame returned + returned_data = [] + # insert theses settings in the lock list + self.parent._insert_lock_in_list(data_to_match_list,cond_lock_mutex,returned_data) + # wait the lock has unblocked. With a time-out + cond_lock_mutex.acquire() + cond_lock_mutex.wait(2) + cond_lock_mutex.release() + # returns + if len(returned_data) == 0: + return ACK_CMD_TIMEOUT + else: + return ord(returned_data[0][4]) #-------------------------------------------------------------------------- # Send a structured command to tux @@ -1963,8 +2063,10 @@ Example: >>> tux.cmd.audio_channel_general() """ + self.no_ack=True self.last_ack=self.structured(TUX_CMD_STRUCT_AUDIO_CHANNEL,\ TUX_CMD_STRUCT_SUB_CH_GENERAL,0,0,0) + self.no_ack=False #-------------------------------------------------------------------------- # Send a command to tux for selecting the "TTS" audio channel in the dongle @@ -1977,8 +2079,10 @@ Example: >>> tux.cmd.audio_channel_tts() """ + self.no_ack=True self.last_ack=self.structured(TUX_CMD_STRUCT_AUDIO_CHANNEL,\ TUX_CMD_STRUCT_SUB_CH_TTS,0,0,0) + self.no_ack=False #============================================================================== # TUXTCPCommunicator - status - class @@ -2044,16 +2148,19 @@ """ while self.parent.daemon.connected: if self.parent.event.on_light_level!=None: - self.parent.event.on_light_level(self.light_level()) + self.parent.event.on_light_level(self.get_light_level()) self.parent.sys.wait(1) #-------------------------------------------------------------------------- # Convert the current raw statuses to an explicit string #-------------------------------------------------------------------------- - def to_string(self): + def to_string(self,frame): """ Convert the current raw statuses to an explicit string + Parameters: + "frame" as tuple of char : raw statuses + Return a string Example: @@ -2070,7 +2177,7 @@ line="" status=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] self.parent.tcp_mutex.acquire() - for i, data in enumerate(self.parent.tcp_data): + for i, data in enumerate(frame): status[i]=ord(data) self.parent.tcp_mutex.release() # -- Tux status @@ -2170,26 +2277,28 @@ """ Not a user function """ - time_beginin=self.parent.sys.time() - while True: - self.parent.tcp_mutex.acquire() - data=self.parent.tcp_data - if self.parent.current_data_id==self.parent.last_threated_data_id: - self.parent.tcp_mutex.release() - time.sleep(0.001) - if (self.parent.sys.time()-time_beginin)>=2: - return False - continue - self.parent.last_threated_data_id=self.parent.current_data_id - self.parent.tcp_mutex.release() - if ord(data[0])==SOURCE_TUX: - if ord(data[1])==SS_DEFAULT: - if ord(data[2])==DATA_TP_RSP: - if ord(data[4])==DATA_STATUS: - return True - if (self.parent.sys.time()-time_beginin)>=2: - return False - time.sleep(0.001) + # create a condition mutex + cond_lock_mutex = threading.Condition(threading.Lock()) + # create a list of frames to match + data_to_match_list = [] + # create and insert a frame to match + data_to_match = (SOURCE_TUX,SS_DEFAULT,DATA_TP_RSP,\ + 999,DATA_STATUS,999,999,999,999,999,999,\ + 999,999,999,999,999) + data_to_match_list.append(data_to_match) + # create empty frame returned + returned_data = [] + # insert theses settings in the lock list + self.parent._insert_lock_in_list(data_to_match_list,cond_lock_mutex,returned_data) + # wait the lock has unblocked. With a time-out + cond_lock_mutex.acquire() + cond_lock_mutex.wait(2) + cond_lock_mutex.release() + # returns + if len(returned_data) == 0: + return None + else: + return returned_data[0] #-------------------------------------------------------------------------- # Get a specified status @@ -2216,6 +2325,22 @@ return self.rsp_status(DATA_STATUS) #-------------------------------------------------------------------------- + # Get a specified status ( one value ) + #-------------------------------------------------------------------------- + def get_one_status(self,DATA_STATUS): + """ + Not a user function + """ + frame = self.get(DATA_STATUS) + try: + if len(frame) > 0: + return ord(frame[5]) + else: + return 0 + except: + return 0 + + #-------------------------------------------------------------------------- # Get the last state of wings motor backward status #-------------------------------------------------------------------------- def get_wings_motor_backward(self): @@ -2233,11 +2358,7 @@ Example: >>> var = tux.status.wings_backward() """ - if self.get(DATAS_STATUS_WINGS_MOTOR_BACKWARD): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_WINGS_MOTOR_BACKWARD) #-------------------------------------------------------------------------- # Get the last state of spin motor backward status @@ -2256,11 +2377,7 @@ Example: >>> var = tux.status.spin_backward() """ - if self.get(DATAS_STATUS_SPIN_MOTOR_BACKWARD): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_SPIN_MOTOR_BACKWARD) #-------------------------------------------------------------------------- # Get the last state of spin motor forward status @@ -2279,11 +2396,7 @@ Example: >>> var = tux.status.spin_forward() """ - if self.get(DATAS_STATUS_SPIN_MOTOR_FORWARD): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_SPIN_MOTOR_FORWARD) #-------------------------------------------------------------------------- # Get the last state of mouth open position status @@ -2302,11 +2415,7 @@ Example: >>> var = tux.status.mouth_opened() """ - if self.get(DATAS_STATUS_MOUTH_OPEN_POSITION): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_MOUTH_OPEN_POSITION) #-------------------------------------------------------------------------- # Get the last state of mouth closed position status @@ -2325,11 +2434,7 @@ Example: >>> var = tux.status.mouth_closed() """ - if self.get(DATAS_STATUS_MOUTH_CLOSED_POSITION): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_MOUTH_CLOSED_POSITION) #-------------------------------------------------------------------------- # Get the last state of head push position status @@ -2348,11 +2453,7 @@ Example: >>> var = tux.status.head_bt() """ - if self.get(DATAS_STATUS_HEAD_PUSH_SWITCH): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_HEAD_PUSH_SWITCH) #-------------------------------------------------------------------------- # Get the last state of charger inhibit signal status @@ -2371,11 +2472,7 @@ Example: >>>var = tux.status.charger_state() """ - if self.get(DATAS_STATUS_CHARGER_INHIBIT_SIGNAL): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_CHARGER_INHIBIT_SIGNAL) #-------------------------------------------------------------------------- # Get the last state of wings position switch status @@ -2394,11 +2491,7 @@ Example: >>> var = tux.status.wings_bt() """ - if self.get(DATAS_STATUS_WINGS_POSITION_SWITCH): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_WINGS_POSITION_SWITCH) #-------------------------------------------------------------------------- # Get the last state of motor for wings status @@ -2417,11 +2510,7 @@ Example: >>> var = tux.status.wings_motor() """ - if self.get(DATAS_STATUS_MOTOR_FOR_WINGS): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_MOTOR_FOR_WINGS) #-------------------------------------------------------------------------- # Get the last state of left blue led status @@ -2440,11 +2529,7 @@ Example: >>> var = tux.status.lled() """ - if self.get(DATAS_STATUS_LEFT_BLUE_LED): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_LEFT_BLUE_LED) #-------------------------------------------------------------------------- # Get the last state of right blue led status @@ -2463,11 +2548,7 @@ Example: >>> var = tux.status.rled() """ - if self.get(DATAS_STATUS_RIGHT_BLUE_LED): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_RIGHT_BLUE_LED) #-------------------------------------------------------------------------- # Get the last state of head motor for mouth status @@ -2486,11 +2567,7 @@ Example: >>> var = tux.status.mouth_motor() """ - if self.get(DATAS_STATUS_HEAD_MOTOR_FOR_MOUTH): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_HEAD_MOTOR_FOR_MOUTH) #-------------------------------------------------------------------------- # Get the last state of head motor for eyes status @@ -2509,11 +2586,7 @@ Example: >>> var = tux.status.eyes_motor() """ - if self.get(DATAS_STATUS_HEAD_MOTOR_FOR_EYES): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_HEAD_MOTOR_FOR_EYES) #-------------------------------------------------------------------------- # Get the last state of IR receiver signal status @@ -2532,11 +2605,7 @@ Example: >>> var = tux.status.ir_signal() """ - if self.get(DATAS_STATUS_IR_RECEIVER_SIGNAL): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_IR_RECEIVER_SIGNAL) #-------------------------------------------------------------------------- # Get the last state of spin position switch status @@ -2555,11 +2624,7 @@ Example: >>> var = tux.status.spin_bt() """ - if self.get(DATAS_STATUS_SPIN_POSITION_SWITCH): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_SPIN_POSITION_SWITCH) #-------------------------------------------------------------------------- # Get the last state of wings motor forward status @@ -2578,11 +2643,7 @@ Example: >>> var = tux.status.wings_forward() """ - if self.get(DATAS_STATUS_WINGS_MOTOR_FORWARD): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_WINGS_MOTOR_FORWARD) #-------------------------------------------------------------------------- # Get the last state of IR led status @@ -2601,11 +2662,7 @@ Example: >>> var = tux.status.ir_led() """ - if self.get(DATAS_STATUS_IR_LED): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_IR_LED) #-------------------------------------------------------------------------- # Get the last state of eyes open position switch status @@ -2624,11 +2681,7 @@ Example: >>> var = tux.status.eyes_opened() """ - if self.get(DATAS_STATUS_EYES_OPEN_POSITION_SWITCH): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_EYES_OPEN_POSITION_SWITCH) #-------------------------------------------------------------------------- # Get the last state of eyes closed position switch status @@ -2647,11 +2700,7 @@ Example: >>> var = tux.status.eyes_closed() """ - if self.get(DATAS_STATUS_EYES_CLOSED_POSITION_SWITCH): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_EYES_CLOSED_POSITION_SWITCH) #-------------------------------------------------------------------------- # Get the last state of left wing push status @@ -2670,11 +2719,7 @@ Example: >>> var = tux.status.lwing_bt() """ - if self.get(DATAS_STATUS_LEFT_WING_PUSH): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_LEFT_WING_PUSH) #-------------------------------------------------------------------------- # Get the last state of right wing push status @@ -2693,11 +2738,7 @@ Example: >>> var = tux.status.rwing_bt() """ - if self.get(DATAS_STATUS_RIGHT_WING_PUSH): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_RIGHT_WING_PUSH) #-------------------------------------------------------------------------- # Get the last state of power plug switch status @@ -2716,11 +2757,7 @@ Example: >>> var = tux.status.power_plug() """ - if self.get(DATAS_STATUS_POWER_PLUG_SWITCH): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_POWER_PLUG_SWITCH) #-------------------------------------------------------------------------- # Get the last state of head push switch status @@ -2748,11 +2785,7 @@ Example: >>> var = tux.status.sound_muted() """ - if self.get(DATAS_STATUS_MUTE_STATUS): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_MUTE_STATUS) #-------------------------------------------------------------------------- # Get the last state of light level status @@ -2771,11 +2804,14 @@ Example: >>> var = tux.status.light_level() """ - if self.get(DATAS_STATUS_LIGHT_LEVEL): - self.parent.tcp_mutex.acquire() - result=(ord(self.parent.tcp_data[5])*256)+ord(self.parent.tcp_data[6]) - self.parent.tcp_mutex.release() - return result + frame = self.get(DATAS_STATUS_LIGHT_LEVEL) + try: + if len(frame) > 0: + return (ord(frame[5])*256)+ord(frame[6]) + else: + return 0 + except: + return 0 #-------------------------------------------------------------------------- # Get the last state of eyes position counter status @@ -2794,11 +2830,7 @@ Example: >>> var = tux.status.eyes_counter() """ - if self.get(DATAS_STATUS_EYES_POSITION_COUNTER): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_EYES_POSITION_COUNTER) #-------------------------------------------------------------------------- # Get the last state of mouth position counter status @@ -2817,11 +2849,7 @@ Example: >>> var = tux.status.mouth_counter() """ - if self.get(DATAS_STATUS_MOUTH_POSITION_COUNTER): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_MOUTH_POSITION_COUNTER) #-------------------------------------------------------------------------- # Get the last state of wings position counter status @@ -2840,11 +2868,7 @@ Example: >>> var = tux.status.wings_counter() """ - if self.get(DATAS_STATUS_WINGS_POSITION_COUNTER): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_WINGS_POSITION_COUNTER) #-------------------------------------------------------------------------- # Get the last state of spin position counter status @@ -2863,11 +2887,7 @@ Example: >>> var = tux.status.spin_counter() """ - if self.get(DATAS_STATUS_SPIN_POSITION_COUNTER): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_SPIN_POSITION_COUNTER) #-------------------------------------------------------------------------- # Get the last state of the RF status @@ -2886,11 +2906,7 @@ Example: >>>var = tux.status.rf_state() """ - if self.get(DATAS_STATUS_RF_CONNECTED): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_RF_CONNECTED) #-------------------------------------------------------------------------- # Get the number of sound in flash @@ -2909,13 +2925,8 @@ Example: >>> var = tux.status.sounds_count() """ - if self.get(DATAS_STATUS_SOUND_COUNT): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + return self.get_one_status(DATAS_STATUS_SOUND_COUNT) - #============================================================================== # TUXTCPCommunicator - daemon - class #============================================================================== @@ -3071,6 +3082,10 @@ t.setName('_loop_tux_tcp_msg') t.start() self.con_thread_list.append(t) + t=threading.Thread(target=self.parent._loop_lock_list) + t.setName('_loop_lock_list') + t.start() + self.con_thread_list.append(t) t=threading.Thread(target=self.parent._loop_tux_data_dispatching) t.setName('_loop_tux_data_dispatching') t.start() @@ -3117,25 +3132,28 @@ """ Not a user function """ - time_beginin=self.parent.sys.time() - while True: - self.parent.tcp_mutex.acquire() - data=self.parent.tcp_data - if self.parent.current_data_id==self.parent.last_threated_data_id: - self.parent.tcp_mutex.release() - time.sleep(0.001) - if (self.parent.sys.time()-time_beginin)>=2: - return ACK_CMD_TIMEOUT - continue - self.parent.last_threated_data_id=self.parent.current_data_id - self.parent.tcp_mutex.release() - if ord(data[0])==SOURCE_SUB_DAEMON: - if ord(data[1])==SS_DEFAULT: - if ord(data[2])==DATA_TP_ACK_CMD: - return ord(data[4]) - if (self.parent.sys.time()-time_beginin)>=2: - return ACK_CMD_TIMEOUT - time.sleep(0.001) + # create a condition mutex + cond_lock_mutex = threading.Condition(threading.Lock()) + # create a list of frames to match + data_to_match_list = [] + # create and insert a frame to match + data_to_match = (SOURCE_SUB_DAEMON,SS_DEFAULT,DATA_TP_ACK_CMD,\ + 999,999,999,999,999,999,999,999,\ + 999,999,999,999,999) + data_to_match_list.append(data_to_match) + # create empty frame returned + returned_data = [] + # insert theses settings in the lock list + self.parent._insert_lock_in_list(data_to_match_list,cond_lock_mutex,returned_data) + # wait the lock has unblocked. With a time-out + cond_lock_mutex.acquire() + cond_lock_mutex.wait(2) + cond_lock_mutex.release() + # returns + if len(returned_data) == 0: + return ACK_CMD_TIMEOUT + else: + return ord(returned_data[0][4]) #-------------------------------------------------------------------------- # Wait a specified response status @@ -3144,27 +3162,28 @@ """ Not a user function """ - time_beginin=self.parent.sys.time() - while True: - self.parent.tcp_mutex.acquire() - data=self.parent.tcp_data - if self.parent.current_data_id==self.parent.last_threated_data_id: - self.parent.tcp_mutex.release() - time.sleep(0.001) - if (self.parent.sys.time()-time_beginin)>=2: - return False - continue - self.parent.last_threated_data_id=self.parent.current_data_id - self.parent.tcp_mutex.release() - if ord(data[0])==SOURCE_SUB_DAEMON: - if ord(data[1])==SS_DEFAULT: - if ord(data[2])==DATA_TP_RSP: - if ord(data[3])==SUBDATA_TP_INFO: - if ord(data[4])==DATA_INFO: - return True - if (self.parent.sys.time()-time_beginin)>=2: - return False - time.sleep(0.001) + # create a condition mutex + cond_lock_mutex = threading.Condition(threading.Lock()) + # create a list of frames to match + data_to_match_list = [] + # create and insert a frame to match + data_to_match = (SOURCE_SUB_DAEMON,SS_DEFAULT,DATA_TP_RSP,\ + SUBDATA_TP_INFO,DATA_INFO,999,999,999,999,999,999,\ + 999,999,999,999,999) + data_to_match_list.append(data_to_match) + # create empty frame returned + returned_data = [] + # insert theses settings in the lock list + self.parent._insert_lock_in_list(data_to_match_list,cond_lock_mutex,returned_data) + # wait the lock has unblocked. With a time-out + cond_lock_mutex.acquire() + cond_lock_mutex.wait(2) + cond_lock_mutex.release() + # returns + if len(returned_data) == 0: + return () + else: + return returned_data[0] #-------------------------------------------------------------------------- # Send a command to tuxdaemon @@ -3217,6 +3236,7 @@ Example: >>> tux.daemon.disconnect_client(0) """ + if not self.connected : return self.last_ack=self.cmd(SUB_D_CMD_STRUC_DISCONNECT_CLIENT,id_client,0,0) #-------------------------------------------------------------------------- @@ -3226,6 +3246,7 @@ """ Not a user function """ + if not self.connected : return self.last_ack=self.cmd_no_ack(SUB_D_CMD_STRUC_DISCONNECT_CLIENT_ME,0,0,0) #-------------------------------------------------------------------------- @@ -3238,6 +3259,7 @@ Example: >>> tux.daemon.kill() """ + if not self.connected : return self.last_ack=self.cmd(SUB_D_CMD_STRUC_KILL_DAEMON,0,0,0) #-------------------------------------------------------------------------- @@ -3282,14 +3304,14 @@ Example: >>> print tux.daemon.get_version() """ - if self.request(SUB_D_REQ_INFO_VERSION,0,0,0): - result=[0,0,0] - self.parent.tcp_mutex.acquire() - result[0]=ord(self.parent.tcp_data[5]) - result[1]=ord(self.parent.tcp_data[6]) - result[2]=ord(self.parent.tcp_data[7]) - self.parent.tcp_mutex.release() - return "%d.%d.%d"%(result[0],result[1],result[2]) + if not self.connected : return '' + frame = self.request(SUB_D_REQ_INFO_VERSION,0,0,0) + result=[0,0,0] + if len(frame) > 0: + result[0]=ord(frame[5]) + result[1]=ord(frame[6]) + result[2]=ord(frame[7]) + return "%d.%d.%d"%(result[0],result[1],result[2]) #-------------------------------------------------------------------------- # Get the number of clients connected to tuxdaemon @@ -3303,11 +3325,12 @@ Example: >>> print tux.daemon.get_client_count() """ - if self.request(SUB_D_REQ_INFO_CLIENT_COUNT,0,0,0): - self.parent.tcp_mutex.acquire() - result=ord(self.parent.tcp_data[5]) - self.parent.tcp_mutex.release() - return result + if not self.connected : return 0 + frame = self.request(SUB_D_REQ_INFO_CLIENT_COUNT,0,0,0) + if len(frame) > 0: + return ord(frame[5]) + else: + return 0 #-------------------------------------------------------------------------- # Get the name of a client of tuxdaemon @@ -3321,11 +3344,13 @@ Example: >>> print tux.daemon.get_client_name(0) """ - if self.request(SUB_D_REQ_INFO_CLIENT_NAME,id_client,0,0): - self.parent.tcp_mutex.acquire() - struct_data = [self.parent.tcp_data[i] for i in range(5,16,1)] - self.parent.tcp_mutex.release() + if not self.connected : return '' + frame = self.request(SUB_D_REQ_INFO_CLIENT_NAME,id_client,0,0) + if len(frame) > 0: + struct_data = [frame[i] for i in range(5,16,1)] return "".join(struct_data) + else: + return '' #-------------------------------------------------------------------------- # Print the name of all the clients connected to tuxdaemon @@ -3337,6 +3362,7 @@ Example: >>> tux.daemon.print_clients_name() """ + if not self.connected : return for i in range(self.get_client_count()): print "Client %.3d : %s"%(i,self.get_client_name(i)) @@ -3352,11 +3378,12 @@ Example: >>> print tux.daemon.get_my_client_id() """ - if self.request(SUB_D_REQ_INFO_MY_CLIENT_ID,0,0,0): - self.parent.tcp_mutex.acquire() - result=ord(self.pare... [truncated message content] |
From: neimad <c2m...@c2...> - 2007-06-05 21:27:10
|
Author: neimad Date: 2007-06-05 23:26:38 +0200 (Tue, 05 Jun 2007) New Revision: 352 Modified: daemon/trunk/libs/USBDaemon_usb_enum.c daemon/trunk/main.c Log: * The daemon now raises its privileges (to its initial uid and gid) when exiting, so that it is able to delete its pid file. Note that a side effect of this patch is that privileges are dropped after usb_init_TuxDroid() has completed, whereas it was done about half way through before. So if we really want to tighten things up, we'll have to rework the USB initialiation a bit. Fixes issue #19. Modified: daemon/trunk/libs/USBDaemon_usb_enum.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.c 2007-06-05 20:25:26 UTC (rev 351) +++ daemon/trunk/libs/USBDaemon_usb_enum.c 2007-06-05 21:26:38 UTC (rev 352) @@ -76,9 +76,6 @@ /* Open usb device */ tux_hdl = usb_open(tux_dev); - setgid(NEWGID); - setuid(NEWUID); - if (!tux_hdl) { log_error("Can't open device: %s (%d)", strerror(errno), errno); Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-06-05 20:25:26 UTC (rev 351) +++ daemon/trunk/main.c 2007-06-05 21:26:38 UTC (rev 352) @@ -27,6 +27,7 @@ #include <string.h> #include <usb.h> #include <errno.h> +#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> @@ -57,6 +58,9 @@ unsigned short daemon_pid = 0; unsigned char daemonized = 0; +static pid_t user = (pid_t)-1; /**< Initial user id */ +static gid_t group = (gid_t)-1; /**< Initial group id */ + /************************************************************************ */ /* Setup daemon info from version string */ @@ -123,6 +127,45 @@ } /** + * Drop privileges. + * + * \return 0 if successful, -1 otherwise + */ +static int drop_privileges(void) +{ + log_debug("Dropping privileges"); + + /* Store initial uid and gid */ + user = getuid(); + group = getgid(); + + if (setegid(NEWGID) == 0 && seteuid(NEWUID) == 0) + return 0; + + log_error("Failed dropping privileges"); + return -1; +} + +/** + * Raise privileges. + * + * \return 0 if successful, -1 otherwise + */ +static int raise_privileges(void) +{ + if (user == (pid_t)-1 || group == (pid_t)-1) + return 0; + + log_debug("Raising privileges"); + + if (setuid(user) == 0 && setgid(group) == 0) + return 0; + + log_error("Failed raising privileges"); + return -1; +} + +/** * \brief Called when exiting. Performs cleanup. * * This function is registered with atexit() to be called whenever we quit the @@ -134,6 +177,8 @@ { send_daemon_disconnected(); + raise_privileges(); + if (daemonized && remove_pid()) log_error("Could not delete PID file"); @@ -343,6 +388,9 @@ if (!usb_init_TuxDroid()) exit(1); + if (drop_privileges() < 0) + exit(1); + tcp_server_loop(); exit(0); |
From: neimad <c2m...@c2...> - 2007-06-05 20:25:28
|
Author: neimad Date: 2007-06-05 22:25:26 +0200 (Tue, 05 Jun 2007) New Revision: 351 Modified: daemon/trunk/libs/USBDaemon_globals.h Log: * Set TUX_RECV_LENGTH to 4. Complements commit r346. Modified: daemon/trunk/libs/USBDaemon_globals.h =================================================================== --- daemon/trunk/libs/USBDaemon_globals.h 2007-06-05 20:00:10 UTC (rev 350) +++ daemon/trunk/libs/USBDaemon_globals.h 2007-06-05 20:25:26 UTC (rev 351) @@ -35,7 +35,7 @@ #define TUX_PID 0xFF07 #define TUX_VID 0x03EB #define TUX_INTERFACE 0x03 -#define TUX_RECV_LENGTH 0x05 +#define TUX_RECV_LENGTH 0x04 #define TUX_SEND_LENGTH 0x05 #define TUX_WRITE_EP 0x05 #define TUX_READ_EP 0x84 |
From: neimad <c2m...@c2...> - 2007-06-05 20:00:14
|
Author: neimad Date: 2007-06-05 22:00:10 +0200 (Tue, 05 Jun 2007) New Revision: 350 Modified: daemon/trunk/libs/USBDaemon_status_table.c daemon/trunk/libs/USBDaemon_tcp_server.c daemon/trunk/libs/USBDaemon_tcp_server.h Log: * Defined macro tcp_frame_zero() to zero a TCP frame and use it everywhere where there was a loop to do that. The macro takes a *pointer* to a TCP frame, which was not strictly necessary, since such a frame is a uchar array, but this may change. * Added the zeroing of the TCP frame in send_daemon_disconnected(), for consistency's sake. Modified: daemon/trunk/libs/USBDaemon_status_table.c =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.c 2007-06-05 19:37:06 UTC (rev 349) +++ daemon/trunk/libs/USBDaemon_status_table.c 2007-06-05 20:00:10 UTC (rev 350) @@ -145,10 +145,8 @@ void update_system_status_table(const unsigned char *new_status) { tcp_frame_t tcp_frame; - unsigned char i; - for (i = 0; i < sizeof(tcp_frame); i++) - tcp_frame[i] = '\0'; + tcp_frame_zero(&tcp_frame); tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -296,10 +294,8 @@ void pong_event(unsigned char pong_number, unsigned char pong_received) { tcp_frame_t tcp_frame; - unsigned char i; - for (i = 0; i < sizeof(tcp_frame); i++) - tcp_frame[i] = '\0'; + tcp_frame_zero(&tcp_frame); tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -320,10 +316,8 @@ void portb_changed(unsigned char new_value) { tcp_frame_t tcp_frame; - unsigned char i; - for (i = 0; i < sizeof(tcp_frame); i++) - tcp_frame[i] = '\0'; + tcp_frame_zero(&tcp_frame); tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -395,10 +389,8 @@ void portc_changed(unsigned char new_value) { tcp_frame_t tcp_frame; - unsigned char i; - for (i = 0; i < sizeof(tcp_frame); i++) - tcp_frame[i] = '\0'; + tcp_frame_zero(&tcp_frame); tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -444,10 +436,8 @@ void portd_changed(unsigned char new_value) { tcp_frame_t tcp_frame; - unsigned char i; - for (i = 0; i < sizeof(tcp_frame); i++) - tcp_frame[i] = '\0'; + tcp_frame_zero(&tcp_frame); tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -529,10 +519,8 @@ void sensors1_changed(unsigned char new_value) { tcp_frame_t tcp_frame; - unsigned char i; - for (i = 0; i < sizeof(tcp_frame); i++) - tcp_frame[i] = '\0'; + tcp_frame_zero(&tcp_frame); tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -605,10 +593,8 @@ unsigned char new_light_mode) { tcp_frame_t tcp_frame; - unsigned char i; - for (i = 0; i < sizeof(tcp_frame); i++) - tcp_frame[i] = '\0'; + tcp_frame_zero(&tcp_frame); tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -635,10 +621,8 @@ unsigned char wings_position) { tcp_frame_t tcp_frame; - unsigned char i; - for (i = 0; i < sizeof(tcp_frame); i++) - tcp_frame[i] = '\0'; + tcp_frame_zero(&tcp_frame); tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -678,10 +662,8 @@ void position2_changed(unsigned char spin_position) { tcp_frame_t tcp_frame; - unsigned char i; - for (i = 0; i < sizeof(tcp_frame); i++) - tcp_frame[i] = '\0'; + tcp_frame_zero(&tcp_frame); tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-05 19:37:06 UTC (rev 349) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-05 20:00:10 UTC (rev 350) @@ -252,6 +252,8 @@ { tcp_frame_t data; + tcp_frame_zero(&data); + data[0] = SOURCE_SUB_DAEMON; data[1] = SS_DEFAULT; data[2] = DATA_TP_CMD; Modified: daemon/trunk/libs/USBDaemon_tcp_server.h =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.h 2007-06-05 19:37:06 UTC (rev 349) +++ daemon/trunk/libs/USBDaemon_tcp_server.h 2007-06-05 20:00:10 UTC (rev 350) @@ -29,6 +29,7 @@ #include <netinet/in.h> #include <sys/un.h> #include <stdio.h> +#include <string.h> /*_____________________ D E F I N E S ______________________________________*/ #define TUX_SERVER_MAXLINES 4096 @@ -49,6 +50,9 @@ #define TCP_FRAME_SIZE 16 typedef unsigned char tcp_frame_t[TCP_FRAME_SIZE]; +#define tcp_frame_zero(frame_ptr) \ + memset(*(frame_ptr), '\0', sizeof(tcp_frame_t)) + /*_____________________ V A R I A B L E S ___________________________________*/ extern int tcp_clients_handle[]; extern unsigned char tcp_clients_count; |
From: neimad <c2m...@c2...> - 2007-06-05 19:37:35
|
Author: neimad Date: 2007-06-05 21:37:06 +0200 (Tue, 05 Jun 2007) New Revision: 349 Modified: daemon/trunk/libs/USBDaemon_status_table.c Log: * Fixed failed automated indentation. Modified: daemon/trunk/libs/USBDaemon_status_table.c =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.c 2007-06-04 19:58:56 UTC (rev 348) +++ daemon/trunk/libs/USBDaemon_status_table.c 2007-06-05 19:37:06 UTC (rev 349) @@ -185,10 +185,9 @@ unsigned long tmp; version_t *hw_ver; - tmp = - (new_status[3] << 24) + (new_status[2] << 16) + (new_status[1] << 8) + - (new_status[0]); - hw_ver = (version_t *) & tmp; + tmp = (new_status[3] << 24) + (new_status[2] << 16) + (new_status[1] << 8) + + (new_status[0]); + hw_ver = (version_t *)&tmp; last_cpu_ver = CPU_VER_MAJ(hw_ver->cpu_ver_maj); hw_version[last_cpu_ver] = *hw_ver; } @@ -203,10 +202,9 @@ unsigned long tmp; revision_t *hw_rev; - tmp = - (new_status[3] << 24) + (new_status[2] << 16) + (new_status[1] << 8) + - (new_status[0]); - hw_rev = (revision_t *) & tmp; + tmp = (new_status[3] << 24) + (new_status[2] << 16) + (new_status[1] << 8) + + (new_status[0]); + hw_rev = (revision_t *)&tmp; hw_revision[last_cpu_ver] = *hw_rev; } @@ -220,10 +218,9 @@ unsigned long tmp; author_t *hw_aut; - tmp = - (new_status[3] << 24) + (new_status[2] << 16) + (new_status[1] << 8) + - (new_status[0]); - hw_aut = (author_t *) & tmp; + tmp = (new_status[3] << 24) + (new_status[2] << 16) + (new_status[1] << 8) + + (new_status[0]); + hw_aut = (author_t *)&tmp; hw_author[last_cpu_ver] = *hw_aut; } |
From: neimad <c2m...@c2...> - 2007-06-04 19:59:09
|
Author: neimad Date: 2007-06-04 21:58:56 +0200 (Mon, 04 Jun 2007) New Revision: 348 Modified: daemon/trunk/libs/USBDaemon_status_table.c daemon/trunk/libs/USBDaemon_status_table.h Log: * Removed size of array parameter in the following functions: update_raw_status_table(), update_system_status_table(), update_version_table(), update_revision_table(), update_author_table(), update_sound_flash_count(), update_ir() Still have to fix TUX_RECV_LENGTH... Modified: daemon/trunk/libs/USBDaemon_status_table.c =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.c 2007-06-04 18:36:38 UTC (rev 347) +++ daemon/trunk/libs/USBDaemon_status_table.c 2007-06-04 19:58:56 UTC (rev 348) @@ -63,7 +63,7 @@ /* update_raw_status_table() */ /************************************************************************ */ -void update_raw_status_table(unsigned char new_status[TUX_RECV_LENGTH]) +void update_raw_status_table(const unsigned char *new_status) { switch (new_status[0]) { @@ -142,7 +142,7 @@ /* update_system_status_table() */ /************************************************************************ */ -void update_system_status_table(unsigned char new_status[4]) +void update_system_status_table(const unsigned char *new_status) { tcp_frame_t tcp_frame; unsigned char i; @@ -180,7 +180,7 @@ /* update_version_table() */ /************************************************************************ */ -void update_version_table(unsigned char new_status[4]) +void update_version_table(const unsigned char *new_status) { unsigned long tmp; version_t *hw_ver; @@ -198,7 +198,7 @@ /* update_revision_table() */ /************************************************************************ */ -void update_revision_table(unsigned char new_status[4]) +void update_revision_table(const unsigned char *new_status) { unsigned long tmp; revision_t *hw_rev; @@ -215,7 +215,7 @@ /* update_author_table() */ /************************************************************************ */ -void update_author_table(unsigned char new_status[4]) +void update_author_table(const unsigned char *new_status) { unsigned long tmp; author_t *hw_aut; @@ -232,7 +232,7 @@ /* update_sound_flash_count() */ /************************************************************************ */ -void update_sound_flash_count(unsigned char new_status[4]) +void update_sound_flash_count(const unsigned char *new_status) { sound_flash_count = new_status[1]; } @@ -242,7 +242,7 @@ /* update_ir() */ /************************************************************************ */ -void update_ir(unsigned char new_status[4]) +void update_ir(const unsigned char *new_status) { unsigned char code; unsigned char toggle; Modified: daemon/trunk/libs/USBDaemon_status_table.h =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.h 2007-06-04 18:36:38 UTC (rev 347) +++ daemon/trunk/libs/USBDaemon_status_table.h 2007-06-04 19:58:56 UTC (rev 348) @@ -246,17 +246,17 @@ extern struct connection_status_t connection_status; /*_____________________ F U N C T I O N S __________________________________*/ -extern void update_raw_status_table(unsigned char new_status[]); -extern void update_system_status_table(unsigned char new_status[]); +extern void update_raw_status_table(const unsigned char *new_status); +extern void update_system_status_table(const unsigned char *new_status); -extern void update_version_table(unsigned char new_status[4]); -extern void update_revision_table(unsigned char new_status[4]); +extern void update_version_table(const unsigned char *new_status); +extern void update_revision_table(const unsigned char *new_status); -extern void update_author_table(unsigned char new_status[4]); +extern void update_author_table(const unsigned char *new_status); -extern void update_sound_flash_count(unsigned char new_status[4]); +extern void update_sound_flash_count(const unsigned char *new_status); -extern void update_ir(unsigned char new_status[4]); +extern void update_ir(const unsigned char *new_status); extern void pong_event(unsigned char pong_number, unsigned char pong_received); |
From: neimad <c2m...@c2...> - 2007-06-04 18:37:07
|
Author: neimad Date: 2007-06-04 20:36:38 +0200 (Mon, 04 Jun 2007) New Revision: 347 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c Log: * Use memset() instead of deprecated bzero(). Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-04 18:32:44 UTC (rev 346) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-04 18:36:38 UTC (rev 347) @@ -23,6 +23,7 @@ /*_____________________ I N C L U D E S____________________________________ */ #include <stdio.h> +#include <string.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> @@ -94,7 +95,7 @@ log_error("TCP socket: setsockopt failed: %m"); } - bzero(&tcp_server_sockaddr, sizeof(tcp_server_sockaddr)); + memset(&tcp_server_sockaddr, 0, sizeof(tcp_server_sockaddr)); tcp_server_sockaddr.sin_family = AF_INET; tcp_server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); tcp_server_sockaddr.sin_port = htons(TUX_SERVER_PORT); |
From: neimad <c2m...@c2...> - 2007-06-04 18:32:46
|
Author: neimad Date: 2007-06-04 20:32:44 +0200 (Mon, 04 Jun 2007) New Revision: 346 Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c Log: * usb_get_status_TuxDroid() now processes data by chunks of 4 bytes instead of the incorrect 5 bytes. Also removed a pointless array copy (albeit small). Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-06-04 17:21:07 UTC (rev 345) +++ daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-06-04 18:32:44 UTC (rev 346) @@ -67,15 +67,11 @@ void usb_get_status_TuxDroid(void) { const unsigned char cmd_send[5] = { 0x01, 0x01, 0x00, 0x00, 0x00 }; - unsigned char data[64]; - unsigned char cmd_dispatch[5]; - unsigned char num_frames; + unsigned char data[64] = { [0 ... 63] = 0 }; + unsigned char *d; int idx; - unsigned char i; + int num_frames, i; - for (i = 0; i < 64; i++) - data[i] = 0; - if (TUX_USB_CONNECTED != TUX_USB_STATUS) return; @@ -89,36 +85,26 @@ if (idx <= 0) return; - cmd_dispatch[0] = data[0]; - cmd_dispatch[1] = data[1]; - cmd_dispatch[2] = data[2]; - cmd_dispatch[3] = data[3]; + update_system_status_table(data); - update_system_status_table(cmd_dispatch); + num_frames = data[3]; - num_frames = cmd_dispatch[3]; - if (show_frames) log_debug("RF_st: %.2x CMD_st: %.2x NB_frames : %d idx : %d", RF_status, CMD_status, num_frames, idx); - if (num_frames > 0 && num_frames < 16) + /* XXX Should assert in this case, I guess ? */ + if (num_frames >= 16) + return; + + d = data + 4; + for (i = 0; i < num_frames; i++) { - for (i = 0; i < num_frames; i++) - { - cmd_dispatch[0] = data[(i + 1) * 4 + 0]; - cmd_dispatch[1] = data[(i + 1) * 4 + 1]; - cmd_dispatch[2] = data[(i + 1) * 4 + 2]; - cmd_dispatch[3] = data[(i + 1) * 4 + 3]; - cmd_dispatch[4] = 0; + if (show_raw_status) + log_debug("%.2x %.2x %.2x %.2x", d[0], d[1], d[2], d[3]); - if (show_raw_status) - log_debug("%.2x %.2x %.2x %.2x %.2x", cmd_dispatch[0], - cmd_dispatch[1], cmd_dispatch[2], cmd_dispatch[3], - cmd_dispatch[4]); - - update_raw_status_table(cmd_dispatch); - } + update_raw_status_table(d); + d += 4; } } |
From: neimad <c2m...@c2...> - 2007-06-04 17:21:37
|
Author: neimad Date: 2007-06-04 19:21:07 +0200 (Mon, 04 Jun 2007) New Revision: 345 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c Log: * Removed usleep() in send_daemon_disconnected(). Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-04 10:32:32 UTC (rev 344) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-04 17:21:07 UTC (rev 345) @@ -260,8 +260,6 @@ tcp_server_send_raw(data); close(tcp_server_handle); - - usleep(10000); } /************************************************************************ */ |
From: Thomas_C <c2m...@c2...> - 2007-06-04 10:32:41
|
Author: Thomas_C Date: 2007-06-04 12:32:32 +0200 (Mon, 04 Jun 2007) New Revision: 344 Modified: software/tux_pidgin/trunk/tux_pidgin.py Log: Tuxdroid speaks with TTS voices that say the contact on pidgin Modified: software/tux_pidgin/trunk/tux_pidgin.py =================================================================== --- software/tux_pidgin/trunk/tux_pidgin.py 2007-06-03 16:19:41 UTC (rev 343) +++ software/tux_pidgin/trunk/tux_pidgin.py 2007-06-04 10:32:32 UTC (rev 344) @@ -61,8 +61,25 @@ import os import re import time +import sgmllib + +class MessageParser(sgmllib.SGMLParser): + """I found this snippets in this website : http://quickies.seriot.ch/index.php""" + def __init__(self): + sgmllib.SGMLParser.__init__(self) + + def strip(self, some_html): + self.theString = "" + self.feed(some_html) + self.close() + return self.theString + + def handle_data(self, data): + self.theString += data + + # This method is execute when a message is receive def received_im_msg(account, name, message, conversation, flags): buddy = purple.PurpleFindBuddy(account, name) @@ -71,22 +88,22 @@ else: alias = name text = "%s says %s" % (alias, message) - text = re.sub("<.*?>", "", text)#html2text + #text = re.sub("<.*?>", "", text)#html2text + message=text.encode('utf-8') + MessageP = MessageParser() + message = MessageP.strip(message) + tux_speak(message) - - tuxspeak(text) - + # This method is excute when a buddy is sign on def buddy_signed_on(buddyid): alias = purple.PurpleBuddyGetAlias(buddyid) - text = "%s is online" % alias text=text.encode('utf-8') tux_speak(text) # Tux speak the text def tux_speak(text): - print text tux.cmd.mouth_open() tux.tts.select_voice(2,100) tux.tts.speak(text) @@ -101,7 +118,7 @@ purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface") except dbus.DBusException: print "Pidgin is not launched" - sys.exit(0) + sys.exit(1) |
From: neimad <c2m...@c2...> - 2007-06-03 16:20:14
|
Author: neimad Date: 2007-06-03 18:19:41 +0200 (Sun, 03 Jun 2007) New Revision: 343 Modified: daemon/trunk/libs/USBDaemon_status_table.c daemon/trunk/libs/USBDaemon_status_table.h daemon/trunk/libs/USBDaemon_usb_readWrite.c Log: * Removed global variable NUMBER_frames. Passing this information from update_system_status_table() to usb_get_status_TuxDroid() this way, as a global side- effect, was ugly. Besides, the information is available to usb_get_status_TuxDroid() from the start, as it is part of array cmd_dispatch[] ! Modified: daemon/trunk/libs/USBDaemon_status_table.c =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.c 2007-06-03 15:44:52 UTC (rev 342) +++ daemon/trunk/libs/USBDaemon_status_table.c 2007-06-03 16:19:41 UTC (rev 343) @@ -39,7 +39,6 @@ unsigned char DONGLE_status = 0; unsigned char RF_status = 0; unsigned char CMD_status = 0; -unsigned char NUMBER_frames = 0; unsigned char pong_received; unsigned char cmd_status_flag; unsigned char pong_received; @@ -174,8 +173,6 @@ if (CMD_status == 2 || CMD_status == 3) cmd_status_flag = 0; } - - NUMBER_frames = new_status[3]; } /************************************************************************ */ Modified: daemon/trunk/libs/USBDaemon_status_table.h =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.h 2007-06-03 15:44:52 UTC (rev 342) +++ daemon/trunk/libs/USBDaemon_status_table.h 2007-06-03 16:19:41 UTC (rev 343) @@ -229,7 +229,6 @@ extern unsigned char RF_status; extern unsigned char CMD_status; -extern unsigned char NUMBER_frames; extern unsigned char cmd_status_flag; extern unsigned char pong_received; Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-06-03 15:44:52 UTC (rev 342) +++ daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-06-03 16:19:41 UTC (rev 343) @@ -69,6 +69,7 @@ const unsigned char cmd_send[5] = { 0x01, 0x01, 0x00, 0x00, 0x00 }; unsigned char data[64]; unsigned char cmd_dispatch[5]; + unsigned char num_frames; int idx; unsigned char i; @@ -94,13 +95,16 @@ cmd_dispatch[3] = data[3]; update_system_status_table(cmd_dispatch); + + num_frames = cmd_dispatch[3]; + if (show_frames) log_debug("RF_st: %.2x CMD_st: %.2x NB_frames : %d idx : %d", - RF_status, CMD_status, NUMBER_frames, idx); + RF_status, CMD_status, num_frames, idx); - if (NUMBER_frames > 0 && NUMBER_frames < 16) + if (num_frames > 0 && num_frames < 16) { - for (i = 0; i < NUMBER_frames; i++) + for (i = 0; i < num_frames; i++) { cmd_dispatch[0] = data[(i + 1) * 4 + 0]; cmd_dispatch[1] = data[(i + 1) * 4 + 1]; |
From: neimad <c2m...@c2...> - 2007-06-03 15:45:22
|
Author: neimad Date: 2007-06-03 17:44:52 +0200 (Sun, 03 Jun 2007) New Revision: 342 Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c Log: * cmd_send is const. Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-06-02 06:07:33 UTC (rev 341) +++ daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-06-03 15:44:52 UTC (rev 342) @@ -66,8 +66,8 @@ /************************************************************************ */ void usb_get_status_TuxDroid(void) { + const unsigned char cmd_send[5] = { 0x01, 0x01, 0x00, 0x00, 0x00 }; unsigned char data[64]; - unsigned char cmd_send[5]; unsigned char cmd_dispatch[5]; int idx; unsigned char i; @@ -75,12 +75,6 @@ for (i = 0; i < 64; i++) data[i] = 0; - cmd_send[0] = 0x01; - cmd_send[1] = 0x01; - cmd_send[2] = 0x00; - cmd_send[3] = 0x00; - cmd_send[4] = 0x00; - if (TUX_USB_CONNECTED != TUX_USB_STATUS) return; @@ -89,7 +83,7 @@ if (idx <= 0) return; - idx = usb_interrupt_read(tux_handle, TUX_READ_EP, (char *)data, + idx = usb_interrupt_read(tux_handle, TUX_READ_EP, (char *)data, sizeof(data), TUX_READ_TIMEOUT); if (idx <= 0) return; |
From: neimad <c2m...@c2...> - 2007-06-02 06:07:34
|
Author: neimad Date: 2007-06-02 08:07:33 +0200 (Sat, 02 Jun 2007) New Revision: 341 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c Log: * Removed unnecessary parenthesis. Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-02 06:02:39 UTC (rev 340) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-02 06:07:33 UTC (rev 341) @@ -45,7 +45,7 @@ tux_tcp_status_t tux_tcp_status = TUX_TCP_STATUS_DOWN; int tcp_clients_handle[TUX_MAX_TCP_CLIENTS] = - {[(0)...(TUX_MAX_TCP_CLIENTS - 1)] = -1 }; + { [0 ... TUX_MAX_TCP_CLIENTS - 1] = -1 }; client_name_t tcp_clients_name[TUX_MAX_TCP_CLIENTS]; unsigned char tcp_clients_count = 0; |
From: neimad <c2m...@c2...> - 2007-06-02 06:02:40
|
Author: neimad Date: 2007-06-02 08:02:39 +0200 (Sat, 02 Jun 2007) New Revision: 340 Modified: daemon/trunk/libs/USBDaemon_command_tux.c Log: * Setting result just before exiting has no effect ;-) Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-06-02 05:59:02 UTC (rev 339) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-06-02 06:02:39 UTC (rev 340) @@ -266,7 +266,6 @@ case SUB_D_CMD_STRUC_KILL_DAEMON: log_warning("daemon killed by user"); send_daemon_disconnected(); - result[0] = ACK_CMD_OK; exit(0); break; case SUB_D_CMD_STRUC_DEFINE_CLIENT_NAME: |
From: neimad <c2m...@c2...> - 2007-06-02 05:59:09
|
Author: neimad Date: 2007-06-02 07:59:02 +0200 (Sat, 02 Jun 2007) New Revision: 339 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c daemon/trunk/libs/USBDaemon_tcp_server.h Log: * Use int instead of unsigned char for client indexing. Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-02 05:55:34 UTC (rev 338) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-02 05:59:02 UTC (rev 339) @@ -269,9 +269,9 @@ /* Remove a tcp client */ /************************************************************************ */ -void tcp_remove_client(unsigned char id_client) +void tcp_remove_client(int id_client) { - unsigned char i, j; + int i, j; int tmp_handle; tmp_handle = tcp_clients_handle[id_client]; Modified: daemon/trunk/libs/USBDaemon_tcp_server.h =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.h 2007-06-02 05:55:34 UTC (rev 338) +++ daemon/trunk/libs/USBDaemon_tcp_server.h 2007-06-02 05:59:02 UTC (rev 339) @@ -60,6 +60,6 @@ extern void tcp_server_send_raw_to_client(int client_index, const tcp_frame_t data); extern void send_daemon_disconnected(); -extern void tcp_remove_client(unsigned char id_client); +extern void tcp_remove_client(int id_client); #endif |
From: neimad <c2m...@c2...> - 2007-06-02 05:55:42
|
Author: neimad Date: 2007-06-02 07:55:34 +0200 (Sat, 02 Jun 2007) New Revision: 338 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c Log: * Fixed indentation where the automated re-indentation failed to produce something nice. Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-01 19:35:57 UTC (rev 337) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-06-02 05:55:34 UTC (rev 338) @@ -87,8 +87,8 @@ } val = 1; - if (setsockopt - (tcp_server_handle, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0) + if (setsockopt (tcp_server_handle, SOL_SOCKET, SO_REUSEADDR, + &val, sizeof(val)) < 0) { /* Don't need to quit on this one. */ log_error("TCP socket: setsockopt failed: %m"); @@ -98,9 +98,8 @@ tcp_server_sockaddr.sin_family = AF_INET; tcp_server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); tcp_server_sockaddr.sin_port = htons(TUX_SERVER_PORT); - if (bind - (tcp_server_handle, (struct sockaddr *)&tcp_server_sockaddr, - sizeof(tcp_server_sockaddr)) < 0) + if (bind (tcp_server_handle, (struct sockaddr *)&tcp_server_sockaddr, + sizeof(tcp_server_sockaddr)) < 0) { log_error("TCP socket: bind failed: %m"); exit(2); @@ -237,8 +236,8 @@ if (tcp_clients_handle[client_index] >= 0) { - if (send(tcp_clients_handle[client_index], data, sizeof(tcp_frame_t), 0) - == 0) + if (send(tcp_clients_handle[client_index], data, + sizeof(tcp_frame_t), 0) == 0) tcp_remove_client(client_index); } } |
From: neimad <c2m...@c2...> - 2007-06-01 19:36:28
|
Author: neimad Date: 2007-06-01 21:35:57 +0200 (Fri, 01 Jun 2007) New Revision: 337 Modified: daemon/trunk/libs/USBDaemon_command_tux.c Log: * Made constant arrays in free_wifi_channel() static. Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-06-01 17:29:28 UTC (rev 336) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-06-01 19:35:57 UTC (rev 337) @@ -862,7 +862,7 @@ */ unsigned char connect_to_tux(uint16_t id) { - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CONNECT, + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CONNECT, (uint8_t)id, (uint8_t)(id>>8)); } @@ -949,10 +949,10 @@ * ATR2406 channel numbers. * Channel 0 sends 0 as both low and high ATR channels. */ - uint8_t const lower_ATR_channel[15] = {0, 0, 6, 12, 18, 24, 29, 35, 41, 47, - 52, 58, 64, 70, 76}; - uint8_t const higher_ATR_channel[15] = {0, 26, 32, 38, 43, 49, 55, 61, 67, - 72, 78, 84, 90, 94, 94}; + static const uint8_t lower_ATR_channel[15] = + {0, 0, 6, 12, 18, 24, 29, 35, 41, 47, 52, 58, 64, 70, 76}; + static const uint8_t higher_ATR_channel[15] = + {0, 26, 32, 38, 43, 49, 55, 61, 67, 72, 78, 84, 90, 94, 94}; return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, lower_ATR_channel[wifi_channel], higher_ATR_channel[wifi_channel]); |
From: jaguarondi <c2m...@c2...> - 2007-06-01 17:29:34
|
Author: jaguarondi Date: 2007-06-01 19:29:28 +0200 (Fri, 01 Jun 2007) New Revision: 336 Modified: daemon/trunk/libs/USBDaemon_command_tux.c daemon/trunk/libs/USBDaemon_command_tux.h daemon/trunk/libs/USBDaemon_status_table.c daemon/trunk/libs/USBDaemon_status_table.h Log: - BUG: send_usb_dongle_cmd() was checking for an RF acknowledge which it shouldn't as these commands don't acknowledge as tux raw commands. I replaced the call to usb_write_TuxDroid() by a direct usb write. - ADD: id_lookup function basically works but it's still not called by the main program. It sends the ID_LOOKUP request then monitors the status until the id has been received back. - UPD: added the possibility to disable the wifi avoidance function by using channel 0. Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-06-01 14:43:59 UTC (rev 335) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-06-01 17:29:28 UTC (rev 336) @@ -1,4 +1,3 @@ - /* * Tux Droid - USB Daemon * Copyright (C) 2007 C2ME Sa <rem...@c2...> @@ -37,7 +36,6 @@ /*_____________________ F U N C T I O N S __________________________________*/ unsigned char connect_to_tux(uint16_t id); unsigned char disconnect_from_tux(void); -unsigned char id_lookup(void); unsigned char change_id(uint16_t id); unsigned char wakeup_tux(void); unsigned char free_wifi_channel(unsigned char wifi_channel); @@ -844,14 +842,19 @@ unsigned char send_usb_dongle_cmd(USB_DONGLE_COMMANDS cmd, unsigned char param1, unsigned char param2, unsigned char param3) { - unsigned char usb_frame[TUX_SEND_LENGTH]; + unsigned char data[TUX_SEND_LENGTH]; + int ret; - usb_frame[0] = USB_DONGLE_CMD; - usb_frame[1] = cmd; - usb_frame[2] = param1; - usb_frame[3] = param2; - usb_frame[4] = param3; - return usb_write_TuxDroid(usb_frame); + data[0] = USB_DONGLE_CMD; + data[1] = cmd; + data[2] = param1; + data[3] = param2; + data[4] = param3; + log_debug("USB PC->Dongle: %#x, %#x, %#x, %#x, %#x\n", data[0], data[1], + data[2], data[3], data[4]); + ret = usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char *)data, + TUX_SEND_LENGTH, TUX_WRITE_TIMEOUT); + return ret; } /** @@ -859,7 +862,8 @@ */ unsigned char connect_to_tux(uint16_t id) { - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CONNECT, (uint8_t)id, (uint8_t)(id>>8)); + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CONNECT, + (uint8_t)id, (uint8_t)(id>>8)); } /** @@ -867,22 +871,42 @@ */ unsigned char disconnect_from_tux(void) { - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_DISCONNECT, 0, 0); + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_DISCONNECT, + 0, 0); } /** * \brief Get the ID of the first disconnected tux which is discoverred * * The first disconnected tux that will detect this command will reply with - * it's ID and disconnect immediately. You can then connect to the tux with the - * ID you just got. + * it's ID and disconnect immediately. You can then connect to that tux with + * the ID you just got. * * In order to get the ID's of more than one disconnected tux, you have to * issue this command multiple times until you don't get any new ID. */ -unsigned char id_lookup(void) +#define ID_LOOKUP_TIMEOUT 20 /* 100ms time unit */ +unsigned char id_lookup(uint16_t *id) { - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_ID_LOOKUP, 0, 0); + unsigned char ack; + int timeout_cnt = 0; + + ack = send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_ID_LOOKUP, 0, 0); + if (ack != 5) /* error when writing data on the USB */ + return 0; + connection_status.usb_request_f = 1; /* this flag is reset when the id is received in usb_get_status_TuxDroid */ + while (connection_status.usb_request_f) + { + usleep(200000); + usb_get_status_TuxDroid(); + if (timeout_cnt++ == ID_LOOKUP_TIMEOUT) + { + return 0; + } + } + /* At this time the id should be stored in connection_status.tux_id */ + *id = connection_status.tux_id; + return 1; } /** @@ -894,7 +918,8 @@ */ unsigned char change_id(uint16_t id) { - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, (uint8_t)id, (uint8_t)(id>>8)); + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, + (uint8_t)id, (uint8_t)(id>>8)); } /** @@ -902,27 +927,35 @@ */ unsigned char wakeup_tux(void) { - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_ID_LOOKUP, 0, 0); + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_ID_LOOKUP, + 0, 0); } /** * \brief Configure the RF module to avoid a given wifi channel * - * This sets the frequencies to avoid in the dongle but these settings take - * effect only when a connection is initiated with a tux. This function should + * This sets the frequencies to avoid in the dongle. These settings only take + * effect when a connection is initiated with a tux. This function should * be called before conneting to a tux or you have to disconnect and reconnect * to change it on the go. + * + * Channels from 1 to 14 are valid wifi channels. Set the wifi channel to 0 to + * disable channel avoidance and use the complete range of frequencies. */ unsigned char free_wifi_channel(unsigned char wifi_channel) { - /* + /* * Conversion of the lower and higher frequencies of a wifi channel into * ATR2406 channel numbers. + * Channel 0 sends 0 as both low and high ATR channels. */ - uint8_t const lower_ATR_channel[14] = {0, 6, 12, 18, 24, 29, 35, 41, 47, 52, 58, 64, 70, 76}; - uint8_t const higher_ATR_channel[14] = {26, 32, 38, 43, 49, 55, 61, 67, 72, 78, 84, 90, 94, 94}; + uint8_t const lower_ATR_channel[15] = {0, 0, 6, 12, 18, 24, 29, 35, 41, 47, + 52, 58, 64, 70, 76}; + uint8_t const higher_ATR_channel[15] = {0, 26, 32, 38, 43, 49, 55, 61, 67, + 72, 78, 84, 90, 94, 94}; - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, lower_ATR_channel[wifi_channel-1], higher_ATR_channel[wifi_channel-1]); + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, + lower_ATR_channel[wifi_channel], higher_ATR_channel[wifi_channel]); } /** Modified: daemon/trunk/libs/USBDaemon_command_tux.h =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.h 2007-06-01 14:43:59 UTC (rev 335) +++ daemon/trunk/libs/USBDaemon_command_tux.h 2007-06-01 17:29:28 UTC (rev 336) @@ -25,6 +25,7 @@ #define __USBDAEMON_COMMAND_TUX_H__ /*_____________________ I N C L U D E S____________________________________ */ +#include <stdint.h> #include "USBDaemon_usb_enum.h" /*_____________________ D E F I N E S ______________________________________*/ @@ -72,5 +73,6 @@ unsigned char middle_add, unsigned char higher_add); extern unsigned char send_test_sound(); +unsigned char id_lookup(uint16_t *id); #endif Modified: daemon/trunk/libs/USBDaemon_status_table.c =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.c 2007-06-01 14:43:59 UTC (rev 335) +++ daemon/trunk/libs/USBDaemon_status_table.c 2007-06-01 17:29:28 UTC (rev 336) @@ -24,6 +24,7 @@ /*_____________________ I N C L U D E S____________________________________ */ #include <stdio.h> #include "USBDaemon_status_table.h" +#include "USBDaemon_usb_enum.h" #include "USBDaemon_globals.h" #include "USBDaemon_log.h" #include "USBDaemon_tcp_server.h" @@ -51,6 +52,11 @@ unsigned char sound_flash_count = 0; unsigned char current_audio_channel = 0; +/** + * \brief Status table and settings of the dongle and RF modules + */ +struct connection_status_t connection_status; + /*_____________________ F U N C T I O N S __________________________________*/ /************************************************************************ */ @@ -62,6 +68,11 @@ { switch (new_status[0]) { + case STATUS_ID_CMD: + connection_status.usb_request_f = 0; /* the answer from the usb command has been received */ + printf("flag set: %i\n",connection_status.usb_request_f); + connection_status.tux_id = (new_status[1] << 8) + new_status[2]; + break; case STATUS_PORTS_CMD: if (portb.Byte != new_status[1]) portb_changed(new_status[1]); Modified: daemon/trunk/libs/USBDaemon_status_table.h =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.h 2007-06-01 14:43:59 UTC (rev 335) +++ daemon/trunk/libs/USBDaemon_status_table.h 2007-06-01 17:29:28 UTC (rev 336) @@ -26,6 +26,7 @@ /*_____________________ I N C L U D E S____________________________________ */ #include "../tuxdefs/commands.h" +#include <stdbool.h> /*_____________________ D E F I N E S ______________________________________*/ @@ -238,6 +239,13 @@ extern unsigned char sound_flash_count; extern unsigned char current_audio_channel; +struct connection_status_t { + bool usb_request_f; /** usb request flag set when a USB command is issued and reset when the answer has been received in the status; only used for functions that should get an answer */ + uint16_t tux_id; /** id of the tux which is currently connected or was last connected */ + uint8_t wifi_channel; /** wifi channel that the RF modules will avoid; set to 0 to disable this function */ +}; +extern struct connection_status_t connection_status; + /*_____________________ F U N C T I O N S __________________________________*/ extern void update_raw_status_table(unsigned char new_status[]); extern void update_system_status_table(unsigned char new_status[]); |
From: jaguarondi <c2m...@c2...> - 2007-06-01 14:44:38
|
Author: jaguarondi Date: 2007-06-01 16:43:59 +0200 (Fri, 01 Jun 2007) New Revision: 335 Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c Log: - BUG: as the usb status thread has been suppressed in revision 322, cmd_status_flag was never reset as usb_get_status_TuxDroid() was not called anymore during usb_write_TuxDroid() - few style fixes Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-06-01 07:41:43 UTC (rev 334) +++ daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-06-01 14:43:59 UTC (rev 335) @@ -84,15 +84,13 @@ if (TUX_USB_CONNECTED != TUX_USB_STATUS) return; - idx = - usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char *)cmd_send, - sizeof(cmd_send), TUX_WRITE_TIMEOUT); + idx = usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char *)cmd_send, + sizeof(cmd_send), TUX_WRITE_TIMEOUT); if (idx <= 0) return; - idx = - usb_interrupt_read(tux_handle, TUX_READ_EP, (char *)data, sizeof(data), - TUX_READ_TIMEOUT); + idx = usb_interrupt_read(tux_handle, TUX_READ_EP, (char *)data, + sizeof(data), TUX_READ_TIMEOUT); if (idx <= 0) return; @@ -142,14 +140,14 @@ /* Send data */ cmd_status_flag = 1; - idx = - usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char *)data, + idx = usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char *)data, TUX_SEND_LENGTH, TUX_WRITE_TIMEOUT); counter = 0; csf = cmd_status_flag; while (csf) { + usb_get_status_TuxDroid(); csf = cmd_status_flag; counter++; |
From: jaguarondi <c2m...@c2...> - 2007-06-01 07:41:46
|
Author: jaguarondi Date: 2007-06-01 09:41:43 +0200 (Fri, 01 Jun 2007) New Revision: 334 Modified: daemon/trunk/libs/USBDaemon_command_tux.c Log: - UpD: the ATR2406 channels were wrongly calculated from the wifi channel, changed to a table lookup. Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-05-31 16:15:58 UTC (rev 333) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-06-01 07:41:43 UTC (rev 334) @@ -919,10 +919,10 @@ * Conversion of the lower and higher frequencies of a wifi channel into * ATR2406 channel numbers. */ - uint8_t lower_ATR_channel = (uint8_t)(wifi_channel - 1) * 6; - uint8_t higher_ATR_channel = (uint8_t)(wifi_channel - 1) * 6 + 26; + uint8_t const lower_ATR_channel[14] = {0, 6, 12, 18, 24, 29, 35, 41, 47, 52, 58, 64, 70, 76}; + uint8_t const higher_ATR_channel[14] = {26, 32, 38, 43, 49, 55, 61, 67, 72, 78, 84, 90, 94, 94}; - return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, lower_ATR_channel, higher_ATR_channel); + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, lower_ATR_channel[wifi_channel-1], higher_ATR_channel[wifi_channel-1]); } /** |
From: jaguarondi <c2m...@c2...> - 2007-05-31 16:16:02
|
Author: jaguarondi Date: 2007-05-31 18:15:58 +0200 (Thu, 31 May 2007) New Revision: 333 Modified: daemon/trunk/libs/USBDaemon_command_tux.c daemon/trunk/libs/USBDaemon_command_tux.h daemon/trunk/libs/USBDaemon_usb_enum.c daemon/trunk/libs/USBDaemon_usb_enum.h Log: - UPD: added definitions for the various USB commands - ADD: functions to deal with the ID and the sleep mode Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-05-31 12:13:32 UTC (rev 332) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-05-31 16:15:58 UTC (rev 333) @@ -25,6 +25,7 @@ #include <stdio.h> #include <usb.h> #include "USBDaemon_status_table.h" +#include "USBDaemon_usb_enum.h" #include "USBDaemon_command_tux.h" #include "USBDaemon_usb_readWrite.h" #include "USBDaemon_globals.h" @@ -34,6 +35,13 @@ #include "USBDaemon_pidfile.h" /*_____________________ F U N C T I O N S __________________________________*/ +unsigned char connect_to_tux(uint16_t id); +unsigned char disconnect_from_tux(void); +unsigned char id_lookup(void); +unsigned char change_id(uint16_t id); +unsigned char wakeup_tux(void); +unsigned char free_wifi_channel(unsigned char wifi_channel); +unsigned char random_tux_connection(void); /************************************************************************** */ @@ -489,7 +497,7 @@ case TUX_CMD_STRUCT_SUB_CH_GENERAL: if (current_audio_channel != 0) { - ACK = send_usb_dongle_cmd(0x02, 0, 0, 0); + ACK = send_usb_dongle_cmd(USB_AUDIO_CMD, 0, 0, 0); current_audio_channel = 0; } else @@ -498,7 +506,7 @@ case TUX_CMD_STRUCT_SUB_CH_TTS: if (current_audio_channel != 1) { - ACK = send_usb_dongle_cmd(0x02, 1, 0, 0); + ACK = send_usb_dongle_cmd(USB_AUDIO_CMD, 1, 0, 0); current_audio_channel = 1; } else @@ -833,15 +841,96 @@ /* send_usb_donglecmd() */ /************************************************************************ */ -unsigned char send_usb_dongle_cmd(unsigned char cmd, unsigned char param1, +unsigned char send_usb_dongle_cmd(USB_DONGLE_COMMANDS cmd, unsigned char param1, unsigned char param2, unsigned char param3) { unsigned char usb_frame[TUX_SEND_LENGTH]; - usb_frame[0] = 1; + usb_frame[0] = USB_DONGLE_CMD; usb_frame[1] = cmd; usb_frame[2] = param1; usb_frame[3] = param2; usb_frame[4] = param3; return usb_write_TuxDroid(usb_frame); } + +/** + * \brief Connect to a tux by its ID + */ +unsigned char connect_to_tux(uint16_t id) +{ + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CONNECT, (uint8_t)id, (uint8_t)(id>>8)); +} + +/** + * \brief Disconnect from tux + */ +unsigned char disconnect_from_tux(void) +{ + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_DISCONNECT, 0, 0); +} + +/** + * \brief Get the ID of the first disconnected tux which is discoverred + * + * The first disconnected tux that will detect this command will reply with + * it's ID and disconnect immediately. You can then connect to the tux with the + * ID you just got. + * + * In order to get the ID's of more than one disconnected tux, you have to + * issue this command multiple times until you don't get any new ID. + */ +unsigned char id_lookup(void) +{ + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_ID_LOOKUP, 0, 0); +} + +/** + * \brief Changes the ID of a disconnected tux + * + * You have to push on the head button of tux for XXX seconds while sending + * this command in order to validate the ID change request, this in order to + * avoid stealing a tux too easily. + */ +unsigned char change_id(uint16_t id) +{ + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, (uint8_t)id, (uint8_t)(id>>8)); +} + +/** + * \brief Wake-up a tux if it's in sleep mode. + */ +unsigned char wakeup_tux(void) +{ + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_ID_LOOKUP, 0, 0); +} + +/** + * \brief Configure the RF module to avoid a given wifi channel + * + * This sets the frequencies to avoid in the dongle but these settings take + * effect only when a connection is initiated with a tux. This function should + * be called before conneting to a tux or you have to disconnect and reconnect + * to change it on the go. + */ +unsigned char free_wifi_channel(unsigned char wifi_channel) +{ + /* + * Conversion of the lower and higher frequencies of a wifi channel into + * ATR2406 channel numbers. + */ + uint8_t lower_ATR_channel = (uint8_t)(wifi_channel - 1) * 6; + uint8_t higher_ATR_channel = (uint8_t)(wifi_channel - 1) * 6 + 26; + + return send_usb_dongle_cmd(USB_CONNECTION_CMD, USB_CONNECTION_CHANGE_ID, lower_ATR_channel, higher_ATR_channel); +} + +/** + * \brief Connect to the first tux discovered + * + * Used to catch any disconnected tux, request it's ID and connect to it. + */ +unsigned char random_tux_connection(void) +{ + return 0; +} Modified: daemon/trunk/libs/USBDaemon_command_tux.h =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.h 2007-05-31 12:13:32 UTC (rev 332) +++ daemon/trunk/libs/USBDaemon_command_tux.h 2007-05-31 16:15:58 UTC (rev 333) @@ -25,6 +25,7 @@ #define __USBDAEMON_COMMAND_TUX_H__ /*_____________________ I N C L U D E S____________________________________ */ +#include "USBDaemon_usb_enum.h" /*_____________________ D E F I N E S ______________________________________*/ @@ -46,7 +47,7 @@ extern unsigned char send_usb_tux_cmd(unsigned char cmd, unsigned char param1, unsigned char param2, unsigned char param3); -extern unsigned char send_usb_dongle_cmd(unsigned char cmd, +extern unsigned char send_usb_dongle_cmd(USB_DONGLE_COMMANDS cmd, unsigned char param1, unsigned char param2, unsigned char param3); Modified: daemon/trunk/libs/USBDaemon_usb_enum.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.c 2007-05-31 12:13:32 UTC (rev 332) +++ daemon/trunk/libs/USBDaemon_usb_enum.c 2007-05-31 16:15:58 UTC (rev 333) @@ -139,8 +139,9 @@ TUX_USB_STATUS = TUX_USB_CONNECTED; - /* Reinit audio channel */ - send_usb_dongle_cmd(0x02, 0, 0, 0); + /* Resets audio channel selection; there are 2 audio interfaces in the + * dongle, the second is dedicated to TTS. */ + send_usb_dongle_cmd(USB_AUDIO_CMD, 0, 0, 0); /* select the first audio channel */ current_audio_channel = 0; return 1; Modified: daemon/trunk/libs/USBDaemon_usb_enum.h =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.h 2007-05-31 12:13:32 UTC (rev 332) +++ daemon/trunk/libs/USBDaemon_usb_enum.h 2007-05-31 16:15:58 UTC (rev 333) @@ -36,6 +36,31 @@ TUX_USB_CONNECTED = 1 } TUX_USB_CONN_STATUS; +typedef enum +{ + USB_TUX_CMD = 0, + USB_DONGLE_CMD = 1, + USB_BOOTLOADER_CMD = 2, +} USB_HEADER_TYPE; + +typedef enum +{ + USB_CONNECTION_CMD = 0, + USB_STATUS_CMD = 1, + USB_AUDIO_CMD = 2, + USB_VERSION_CMD = 6, +} USB_DONGLE_COMMANDS; + +typedef enum +{ + USB_CONNECTION_CONNECT = 1, + USB_CONNECTION_DISCONNECT = 2, + USB_CONNECTION_ID_LOOKUP = 3, + USB_CONNECTION_CHANGE_ID = 4, + USB_CONNECTION_WAKEUP = 5, + USB_CONNECTION_WIRELESS_CHANNEL = 6, +} USB_ID_PARAM1; + /*_____________________ V A R I A B L E S __________________________________*/ extern usb_dev_handle *tux_handle; extern TUX_USB_CONN_STATUS TUX_USB_STATUS; |