[tuxdroid-svn] r1285 - software_suite_v2/middleware/tuxdriver/trunk/src
Status: Beta
Brought to you by:
ks156
From: remi <c2m...@c2...> - 2008-07-01 07:38:43
|
Author: remi Date: 2008-07-01 09:38:51 +0200 (Tue, 01 Jul 2008) New Revision: 1285 Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_usb.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_usb.h Log: * Added a check of the id frame which must be incremented after each request. To activate it, you must to define -DUSB_IDFRAME in the makefile. This check only work with a dongle which implement this counter ! The automatic reset of the RF after too many errors on this counter is disabled with the define -DUSB_DEBUG. * The automatic reset of the RF after too many empty frames can be disabled with the define -DUSB_DEBUG. Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_usb.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_usb.c 2008-07-01 07:32:16 UTC (rev 1284) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_usb.c 2008-07-01 07:38:51 UTC (rev 1285) @@ -41,7 +41,6 @@ static simple_callback_t loop_cycle_complete_function; static rf_state_callback_t rf_state_callback_function; static unsigned char last_knowed_rf_state = 0; -static int read_error_counter = 0; static char frame_status_request[5] = {1, 1, 0, 0, 0}; static char frame_reset_dongle[5] = {1, 1, 0, 0, 0xFE}; static char frame_reset_rf[5] = {1, 1, 0, 0, 0xFD}; @@ -60,6 +59,12 @@ static bool get_read_loop_started(void); static void read_usb_loop(void); +#ifdef USB_IDFRAME +static int id_frame_last = 999; +static int freezed_frame_cnt = 0; +#endif +static int empty_frame_cnt = 0; + /** * */ @@ -215,7 +220,11 @@ LIBLOCAL TuxUSBError tux_usb_capture(void) { - read_error_counter = 0; + empty_frame_cnt = 0; +#ifdef USB_IDFRAME + id_frame_last = 999; + freezed_frame_cnt = 0; +#endif if (!tux_hid_capture(TUX_VID, TUX_PID)) { @@ -303,28 +312,67 @@ int i, j; int rf_state; int packet_count; + int id_frame; char *data_buf; char packet_data[4]; + id_frame = data[0]; rf_state = data[1]; packet_count = data[3]; data_buf = (char *)data; data_buf += 4; - + +#ifdef USB_IDFRAME + /* Check if the frame is newer than the last received one */ + if (id_frame == id_frame_last) + { + freezed_frame_cnt++; + log_warning("The id of USB frame is the same than the previous [%d]", + freezed_frame_cnt); +#ifndef USB_DEBUG + if (freezed_frame_cnt >= TUX_USB_FREEZED_FRAMES_LIMIT) + { + freezed_frame_cnt = 0; + id_frame_last = 999; + log_error("The USB frame retriving seems to be freezed [%d]", + TUX_USB_FREEZED_FRAMES_LIMIT); + log_info("The RF connection will be reinitialized"); + tux_usb_rf_reset(); + } +#endif + return; + } + else + { + freezed_frame_cnt = 0; + id_frame_last = id_frame; + } +#endif + /* Having RF state to ON and no status frame is not normal */ if ((packet_count == 0) && (rf_state == 1)) { - read_error_counter++; - log_warning("Read errors count : %d", read_error_counter); - if (read_error_counter >= TUX_USB_ERROR_LIMIT) + empty_frame_cnt++; +#ifndef USB_DEBUG + if (empty_frame_cnt > 2) { - /* Reset of the RF */ + log_warning("Consecutive frames without status : %d", empty_frame_cnt); + } + if (empty_frame_cnt >= TUX_USB_ERROR_LIMIT) + { + log_error("DONGLE ERROR : Too many consecutive frames without status [%d], but the RF is online", + TUX_USB_ERROR_LIMIT); + empty_frame_cnt = 0; + log_info("The RF connection will be reinitialized"); tux_usb_rf_reset(); } +#else + log_warning("Consecutive frames without status : %d", empty_frame_cnt); +#endif } else { - read_error_counter = 0; + empty_frame_cnt = 0; } if (last_knowed_rf_state != rf_state) @@ -342,6 +390,12 @@ #endif } + if (packet_count > 15) + { + log_error("DONGLE ERROR : Statuses packets count is wrong (>15)"); + return; + } + for (i = 0; i < packet_count; i++) { for (j = 0; j < 4; j++) @@ -488,6 +542,8 @@ { usleep(1000); } + + current_timeout = get_time(); } set_read_loop_started(false); Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_usb.h =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_usb.h 2008-07-01 07:32:16 UTC (rev 1284) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_usb.h 2008-07-01 07:38:51 UTC (rev 1285) @@ -26,18 +26,13 @@ #include "tux_misc.h" -#define TUX_PID 0xFF07 -#define TUX_VID 0x03EB -#define TUX_INTERFACE 0x03 -#define TUX_SEND_LENGTH 0x05 -#define TUX_RECEIVE_LENGTH 64 -#define TUX_WRITE_EP 0x05 -#define TUX_READ_EP 0x84 -#define TUX_WRITE_TIMEOUT 1000 -#define TUX_READ_TIMEOUT 1000 -#define TUX_READ_LOOP_INTERVAL 0.1 -#define TUX_USB_ERROR_LIMIT 10 -#define MIN_FIRMWARE_VERSION 0x030 +#define TUX_PID 0xFF07 +#define TUX_VID 0x03EB +#define TUX_SEND_LENGTH 5 +#define TUX_RECEIVE_LENGTH 64 +#define TUX_READ_LOOP_INTERVAL 0.1 +#define TUX_USB_ERROR_LIMIT 20 +#define TUX_USB_FREEZED_FRAMES_LIMIT 10 #ifdef WIN32 # define usb_busses usb_get_busses() |