[tuxdroid-svn] r1171 - software_suite_v2/middleware/tuxdriver/trunk/src
Status: Beta
Brought to you by:
ks156
From: eFfeM <c2m...@c2...> - 2008-05-18 11:35:19
|
Author: eFfeM Date: 2008-05-18 13:35:08 +0200 (Sun, 18 May 2008) New Revision: 1171 Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_battery.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_eyes.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_firmware.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_leds.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_light.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_mouth.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_sound_flash.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_spinning.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_sw_status.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_sw_status.h software_suite_v2/middleware/tuxdriver/trunk/src/tux_user_inputs.c software_suite_v2/middleware/tuxdriver/trunk/src/tux_wings.c Log: mostly finished reworking sw_status (some small cleanups might still be needed) Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_battery.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_battery.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_battery.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -52,7 +52,6 @@ int new_level = 0; int adc_value; char *new_state_str = ""; - char *old_state_str = ""; int delta; adc_value = (hw_status_table.battery.high_level << 8); @@ -100,13 +99,7 @@ } } - old_state_str = (char *)tux_sw_status_get_value(SW_ID_BATTERY_STATE); - - if (strcmp(new_state_str, old_state_str)) - { - tux_sw_status_set_value(SW_ID_BATTERY_STATE, (void *)new_state_str, - true); - } + tux_sw_status_set_strvalue(SW_ID_BATTERY_STATE, new_state_str, true); } else { Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_eyes.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_eyes.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_eyes.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -37,7 +37,6 @@ tux_eyes_update_position(void) { char *new_position = ""; - char *old_position; if (!hw_status_table.ports.portd.bits.eyes_open_switch) { @@ -55,13 +54,7 @@ } } - old_position = (char *)tux_sw_status_get_value(SW_ID_EYES_POSITION); - - if (strcmp(new_position, old_position)) - { - tux_sw_status_set_value(SW_ID_EYES_POSITION, (void *)new_position, - true); - } + tux_sw_status_set_strvalue(SW_ID_EYES_POSITION, new_position, true); } /** Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_firmware.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_firmware.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_firmware.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -656,15 +656,15 @@ versioning_state = FINALIZE; break; case FINALIZE: - tux_sw_status_set_value(SW_ID_TUXCORE_SYMBOLIC_VERSION, + tux_sw_status_set_strvalue(SW_ID_TUXCORE_SYMBOLIC_VERSION, firmwares_desc[TUXCORE_CPU_NUM].version_string, false); - tux_sw_status_set_value(SW_ID_TUXAUDIO_SYMBOLIC_VERSION, + tux_sw_status_set_strvalue(SW_ID_TUXAUDIO_SYMBOLIC_VERSION, firmwares_desc[TUXAUDIO_CPU_NUM].version_string, false); - tux_sw_status_set_value(SW_ID_FUXUSB_SYMBOLIC_VERSION, + tux_sw_status_set_strvalue(SW_ID_FUXUSB_SYMBOLIC_VERSION, firmwares_desc[FUXUSB_CPU_NUM].version_string, false); - tux_sw_status_set_value(SW_ID_FUXRF_SYMBOLIC_VERSION, + tux_sw_status_set_strvalue(SW_ID_FUXRF_SYMBOLIC_VERSION, firmwares_desc[FUXRF_CPU_NUM].version_string, false); - tux_sw_status_set_value(SW_ID_TUXRF_SYMBOLIC_VERSION, + tux_sw_status_set_strvalue(SW_ID_TUXRF_SYMBOLIC_VERSION, firmwares_desc[TUXRF_CPU_NUM].version_string, false); tux_descriptor_update(); /* Check version of tuxcore and tuxaudio */ Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_leds.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_leds.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_leds.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -69,7 +69,6 @@ tux_leds_update_left(void) { char *new_left_state = ""; - char *old_left_state = ""; /* Get on / off state */ if (hw_status_table.led.left_led_intensity < 50) @@ -101,14 +100,7 @@ break; } - /* Get old state */ - old_left_state = (char *)tux_sw_status_get_value(SW_ID_LEFT_LED_STATE); - - /* Check if the state have changed */ - if (strcmp(new_left_state, old_left_state)) - { - tux_sw_status_set_value(SW_ID_LEFT_LED_STATE, (void *)new_left_state, true); - } + tux_sw_status_set_strvalue(SW_ID_LEFT_LED_STATE, new_left_state, true); } /** @@ -118,7 +110,6 @@ tux_leds_update_right(void) { char *new_right_state = ""; - char *old_right_state = ""; /* Get on / off state */ if (hw_status_table.led.right_led_intensity < 50) @@ -150,15 +141,7 @@ break; } - /* Get old state */ - old_right_state = (char *)tux_sw_status_get_value(SW_ID_RIGHT_LED_STATE); - - /* Check if the state have changed */ - if (strcmp(new_right_state, old_right_state)) - { - tux_sw_status_set_value(SW_ID_RIGHT_LED_STATE, - (void *)new_right_state, true); - } + tux_sw_status_set_strvalue(SW_ID_RIGHT_LED_STATE, new_right_state, true); } /** Default settings for the fading effect. */ Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_light.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_light.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_light.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -35,7 +35,6 @@ tux_light_update_level(void) { float new_level = 0.0; - float old_level = 0.0; int light_value; @@ -51,19 +50,13 @@ new_level = (light_value * 100.0) / 1128.0; - old_level = *(float *)tux_sw_status_get_value(SW_ID_LIGHT_LEVEL); - if (fabs(new_level - last_level_for_event) > 1.0) { last_level_for_event = new_level; - tux_sw_status_set_value(SW_ID_LIGHT_LEVEL, (void *)&new_level, true); + tux_sw_status_set_floatvalue(SW_ID_LIGHT_LEVEL, new_level, true); } else { - if (new_level != old_level) - { - tux_sw_status_set_value(SW_ID_LIGHT_LEVEL, (void *)&new_level, - false); - } + tux_sw_status_set_floatvalue(SW_ID_LIGHT_LEVEL, new_level, false); } } Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_mouth.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_mouth.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_mouth.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -37,7 +37,6 @@ tux_mouth_update_position(void) { char *new_position = ""; - char *old_position = ""; if (!hw_status_table.ports.portb.bits.mouth_open_switch) { @@ -55,13 +54,7 @@ } } - old_position = (char *)tux_sw_status_get_value(SW_ID_MOUTH_POSITION); - - if (strcmp(new_position, old_position)) - { - tux_sw_status_set_value(SW_ID_MOUTH_POSITION, - (void *)new_position, true); - } + tux_sw_status_set_strvalue(SW_ID_MOUTH_POSITION, new_position, true); } /** Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_sound_flash.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_sound_flash.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_sound_flash.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -137,7 +137,6 @@ tux_sound_flash_update_flash_play(void) { char *new_track = ""; - char *old_track = ""; char track[10] = ""; if (!hw_status_table.sensors1.play_internal_sound) @@ -146,18 +145,13 @@ } else { + // FIX THIS sprintf(track, "TRACK_%.3d", hw_status_table.sensors1.play_internal_sound); new_track = track; } - old_track = (char *)tux_sw_status_get_value(SW_ID_AUDIO_FLASH_PLAY); - - if (strcmp(new_track, old_track)) - { - tux_sw_status_set_value(SW_ID_AUDIO_FLASH_PLAY, - (void *)new_track, true); - } + tux_sw_status_set_strvalue(SW_ID_AUDIO_FLASH_PLAY, new_track, true); } /** @@ -612,7 +606,9 @@ /* Check fux connection and radio connection */ if (reflash_info.current_state != SRS_STDBY) { - rf_state = *(bool *)tux_sw_status_get_value(SW_ID_RF_STATE); + // FIX THIS + //rf_state = *(bool *)tux_sw_status_get_value(SW_ID_RF_STATE); + rf_state = true; if ((!tux_usb_connected()) || (!rf_state)) { reflash_info.error = SRE_RF_OFFLINE; @@ -629,9 +625,9 @@ /* Send begin flashing event with the fulltime of processing */ full_time_sec = 10.0 + (reflash_info.full_size / 8000.0); full_time_sec += reflash_info.wav_count * 0.97; - tux_sw_status_set_value(SW_ID_SOUND_REFLASH_BEGIN, - (void *)&full_time_sec, true); - tux_sw_status_set_value(SW_ID_SOUND_REFLASH_END, "NO_ERROR", false); + tux_sw_status_set_floatvalue(SW_ID_SOUND_REFLASH_BEGIN, + full_time_sec, true); + tux_sw_status_set_strvalue(SW_ID_SOUND_REFLASH_END, "NO_ERROR", false); /* Goto SRS_ERASE state */ reflash_info.current_state = SRS_ERASE; break; @@ -714,11 +710,11 @@ tux_leds_cmd_set(LED_BOTH, 1.0, NONE, 0, 0); /* Send end of flashing event */ full_time_sec = 0.0; - tux_sw_status_set_value(SW_ID_SOUND_REFLASH_BEGIN, - (void *)&full_time_sec, false); + tux_sw_status_set_floatvalue(SW_ID_SOUND_REFLASH_BEGIN, + full_time_sec, false); switch (reflash_info.error) { case SRE_NO_ERROR: - tux_sw_status_set_value(SW_ID_SOUND_REFLASH_END, + tux_sw_status_set_strvalue(SW_ID_SOUND_REFLASH_END, STRING_VALUE_NO_ERROR, true); log_info("Sound reflash: Finish (%s)", STRING_VALUE_NO_ERROR); @@ -726,19 +722,19 @@ tux_sound_flash_cmd_play(1, 100.0); break; case SRE_RF_OFFLINE: - tux_sw_status_set_value(SW_ID_SOUND_REFLASH_END, + tux_sw_status_set_strvalue(SW_ID_SOUND_REFLASH_END, STRING_VALUE_ERROR_RF_OFFLINE, true); log_info("Sound reflash: Finish (%s)", STRING_VALUE_ERROR_RF_OFFLINE); break; case SRE_WAV_ERROR: - tux_sw_status_set_value(SW_ID_SOUND_REFLASH_END, + tux_sw_status_set_strvalue(SW_ID_SOUND_REFLASH_END, STRING_VALUE_ERROR_WAV_ERROR, true); log_info("Sound reflash: Finish (%s)", STRING_VALUE_ERROR_WAV_ERROR); break; case SRE_USB_ERROR: - tux_sw_status_set_value(SW_ID_SOUND_REFLASH_END, + tux_sw_status_set_strvalue(SW_ID_SOUND_REFLASH_END, STRING_VALUE_ERROR_USB, true); log_info("Sound reflash: Finish (%s)", STRING_VALUE_ERROR_USB); Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_spinning.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_spinning.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_spinning.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -36,7 +36,6 @@ tux_spinning_update_direction(void) { char *new_direction = ""; - char *old_direction = ""; if ((!hw_status_table.ports.portb.bits.spin_motor_forward) && (!hw_status_table.ports.portb.bits.spin_motor_backward)) @@ -58,13 +57,7 @@ } } - old_direction = (char *)tux_sw_status_get_value(SW_ID_SPINNING_DIRECTION); - - if (strcmp(new_direction, old_direction)) - { - tux_sw_status_set_value(SW_ID_SPINNING_DIRECTION, - (void *)new_direction, true); - } + tux_sw_status_set_strvalue(SW_ID_SPINNING_DIRECTION, new_direction, true); } /** Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_sw_status.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_sw_status.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_sw_status.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -18,6 +18,13 @@ * 02111-1307, USA. */ +/* +This file contains the eventing code for the tux +values stored are the last evented values (so not the current values) +there is no external function that allows retrieving that value so it +was decided not to store the current value as there was no need for it +*/ + #include <assert.h> #include <errno.h> #include <stdio.h> @@ -33,237 +40,181 @@ #include "tux_sw_status.h" #include "version.h" -LIBLOCAL sw_status_table_t sw_status_table; +/* + notes on the following struct: + - strvalue is a pointer. it should only be used for static data + - intvalue is used for bool, uint8, int8 + - event_threshold is the threshold value; if the threshold is exceeded + the value is evented; for string values 0 means not evented, + 1 means evented if string changes +*/ +typedef struct +{ + int id; + char *name; + int value_fmt; + union { + int intvalue; + float floatvalue; + const char *strvalue; + }; + int event_threshold; + const char *value_doc; + double lu_time; +} sw_status_t; #ifdef USE_MUTEX static mutex_t __status_mutex; #endif static event_callback_t event_funct; -/** - * - */ -static void -init_value_of_status(int id) -{ -#ifdef USE_MUTEX - mutex_lock(__status_mutex); -#endif - - switch(sw_status_table[id].value_fmt) { - case ID_FMT_BOOL: - sw_status_table[id].intvalue = 0; - break; - case ID_FMT_UINT8: - sw_status_table[id].intvalue = 0; - break; - case ID_FMT_INT: - sw_status_table[id].intvalue = 0; - break; - case ID_FMT_FLOAT: - sw_status_table[id].value = malloc(sizeof(float)); - *(float *)sw_status_table[id].value = 0.0; - break; - case ID_FMT_STRING: - sw_status_table[id].value = malloc(256); - break; - } +#define INIT_FLOATID(id, value_fmt, name, value_doc, initval, threshold) \ + { id, name, value_fmt, {.floatvalue = initval}, threshold, value_doc, 0.0 }, +#define INIT_INTID(id, value_fmt, name, value_doc, initval, threshold) \ + { id, name, value_fmt, {.intvalue = initval}, threshold, value_doc, 0.0 }, +#define INIT_STRINGID(id, value_fmt, name, value_doc, initval, threshold) \ + { id, name, value_fmt, {.strvalue = initval}, threshold, value_doc, 0.0 }, -#ifdef USE_MUTEX - mutex_unlock(__status_mutex); -#endif -} - -/** - * - */ -static void -init_status_struct(int id, int value_fmt, const char *name, - const char *value_doc) -{ - if ((id < 0) || (id >= SW_STATUS_NUMBER)) - { - return; - } -#ifdef USE_MUTEX - mutex_lock(__status_mutex); -#endif - sw_status_table[id].id = id; - sw_status_table[id].value_fmt = value_fmt; - strcpy(sw_status_table[id].name, name); - sw_status_table[id].lu_time = get_time(); - tux_sw_status_name_from_id(id, sw_status_table[id].name); - // do we want this define or not? -//#ifdef GENERATE_DOC - strcpy(sw_status_table[id].value_doc, value_doc); -//#endif -#ifdef USE_MUTEX - mutex_unlock(__status_mutex); -#endif - - init_value_of_status(id); -} - -/** - * - */ -LIBLOCAL void -tux_sw_status_init(void) -{ - char driver_symbolic_version[128] = ""; - -#ifdef USE_MUTEX - mutex_init(__status_mutex); -#endif - - sprintf(driver_symbolic_version, "Tux_driver_%d.%d.%d - b%.3d (%s) (%s)", - VER_MAJOR, - VER_MINOR, - VER_UPDATE, - VER_BUILD, - VER_STATE, - VER_ARCH); +sw_status_t sw_status_table[SW_STATUS_NUMBER] = { + INIT_STRINGID(SW_ID_WINGS_POSITION, ID_FMT_STRING, + "wings_position", "DOWN|UP", STRING_VALUE_DOWN, 1) - init_status_struct(SW_ID_WINGS_POSITION, ID_FMT_STRING, - "wings_position", "DOWN|UP"); - tux_sw_status_set_value(SW_ID_WINGS_POSITION, STRING_VALUE_DOWN, - false); - - init_status_struct(SW_ID_WINGS_REMAINING_MVM, ID_FMT_UINT8, - "wings_remaining_movements", "range[0..255]"); + INIT_INTID(SW_ID_WINGS_REMAINING_MVM, ID_FMT_UINT8, + "wings_remaining_movements", "range[0..255]", 0, 1) - init_status_struct(SW_ID_SPINNING_DIRECTION, ID_FMT_STRING, - "spinning_direction", "NONE|LEFT|RIGHT"); - tux_sw_status_set_value(SW_ID_SPINNING_DIRECTION, STRING_VALUE_NONE, - false); + INIT_STRINGID(SW_ID_SPINNING_DIRECTION, ID_FMT_STRING, + "spinning_direction", "NONE|LEFT|RIGHT", STRING_VALUE_NONE, 1) - init_status_struct(SW_ID_SPINNING_REMAINING_MVM, ID_FMT_UINT8, - "spinning_remaining_movements", "range[0..255]"); + INIT_INTID(SW_ID_SPINNING_REMAINING_MVM, ID_FMT_UINT8, + "spinning_remaining_movements", "range[0..255]", 0, 1) - init_status_struct(SW_ID_LEFT_WING_BUTTON, ID_FMT_BOOL, - "left_wing_button", "False|True"); + INIT_INTID(SW_ID_LEFT_WING_BUTTON, ID_FMT_BOOL, + "left_wing_button", "False|True", 0, 1) - init_status_struct(SW_ID_RIGHT_WING_BUTTON, ID_FMT_BOOL, - "right_wing_button", "False|True"); + INIT_INTID(SW_ID_RIGHT_WING_BUTTON, ID_FMT_BOOL, + "right_wing_button", "False|True", 0, 1) - init_status_struct(SW_ID_HEAD_BUTTON, ID_FMT_BOOL, - "head_button", "False|True"); + INIT_INTID(SW_ID_HEAD_BUTTON, ID_FMT_BOOL, + "head_button", "False|True", 0, 1) - init_status_struct(SW_ID_REMOTE_BUTTON, ID_FMT_STRING, - "remote_button", "K_<remote button>|RELEASE"); - tux_sw_status_set_value(SW_ID_REMOTE_BUTTON, STRING_VALUE_RELEASE, - false); + INIT_STRINGID(SW_ID_REMOTE_BUTTON, ID_FMT_STRING, + "remote_button", "K_<remote button>|RELEASE", STRING_VALUE_RELEASE, 1) - init_status_struct(SW_ID_MOUTH_POSITION, ID_FMT_STRING, - "mouth_position", "OPEN|CLOSE|NDEF"); - tux_sw_status_set_value(SW_ID_MOUTH_POSITION, STRING_VALUE_CLOSE, - false); + INIT_STRINGID(SW_ID_MOUTH_POSITION, ID_FMT_STRING, + "mouth_position", "OPEN|CLOSE|NDEF", STRING_VALUE_CLOSE, 1) - init_status_struct(SW_ID_MOUTH_REMAINING_MVM, ID_FMT_UINT8, - "mouth_remaining_movements", "range[0..255]"); + INIT_INTID(SW_ID_MOUTH_REMAINING_MVM, ID_FMT_UINT8, + "mouth_remaining_movements", "range[0..255]", 0, 1) - init_status_struct(SW_ID_EYES_POSITION, ID_FMT_STRING, - "eyes_position", "OPEN|CLOSE|NDEF"); - tux_sw_status_set_value(SW_ID_EYES_POSITION, STRING_VALUE_CLOSE, - false); + INIT_STRINGID(SW_ID_EYES_POSITION, ID_FMT_STRING, + "eyes_position", "OPEN|CLOSE|NDEF", STRING_VALUE_CLOSE, 1) - init_status_struct(SW_ID_EYES_REMAINING_MVM, ID_FMT_UINT8, - "eyes_remaining_movements", "range[0..255]"); + INIT_INTID(SW_ID_EYES_REMAINING_MVM, ID_FMT_UINT8, + "eyes_remaining_movements", "range[0..255]", 0, 1) - init_status_struct(SW_ID_DESCRIPTOR_COMPLETE, ID_FMT_BOOL, - "descriptor_complete", "True"); + INIT_INTID(SW_ID_DESCRIPTOR_COMPLETE, ID_FMT_BOOL, + "descriptor_complete", "True", 0, 1) - init_status_struct(SW_ID_RF_STATE, ID_FMT_BOOL, - "radio_state", "False|True"); + INIT_INTID(SW_ID_RF_STATE, ID_FMT_BOOL, + "radio_state", "False|True", 0, 1) - init_status_struct(SW_ID_DONGLE_PLUG, ID_FMT_BOOL, - "dongle_plug", "False|True"); + INIT_INTID(SW_ID_DONGLE_PLUG, ID_FMT_BOOL, + "dongle_plug", "False|True", 0, 1) - init_status_struct(SW_ID_CHARGER_STATE, ID_FMT_STRING, + INIT_STRINGID(SW_ID_CHARGER_STATE, ID_FMT_STRING, "charger_state", - "UNPLUGGED|CHARGING|PLUGGED_NO_POWER|TRICKLE|INHIBITED"); - tux_sw_status_set_value(SW_ID_CHARGER_STATE, STRING_VALUE_UNPLUGGED, - false); + "UNPLUGGED|CHARGING|PLUGGED_NO_POWER|TRICKLE|INHIBITED", + STRING_VALUE_UNPLUGGED, 1) - init_status_struct(SW_ID_BATTERY_LEVEL, ID_FMT_INT, - "battery_level", "range[4000..6500] (mV)"); + INIT_INTID(SW_ID_BATTERY_LEVEL, ID_FMT_INT, + "battery_level", "range[4000..6500] (mV)", 0, 1) - init_status_struct(SW_ID_BATTERY_STATE, ID_FMT_STRING, - "battery_state", "EMPTY|LOW|HIGH|FULL"); - tux_sw_status_set_value(SW_ID_BATTERY_STATE, STRING_VALUE_EMPTY, - false); + INIT_STRINGID(SW_ID_BATTERY_STATE, ID_FMT_STRING, + "battery_state", "EMPTY|LOW|HIGH|FULL", STRING_VALUE_EMPTY, 1) - init_status_struct(SW_ID_LIGHT_LEVEL, ID_FMT_FLOAT, - "light_level", "range[0.0..100.0]"); + INIT_INTID(SW_ID_LIGHT_LEVEL, ID_FMT_FLOAT, + "light_level", "range[0.0..100.0]", 0.0, 1000) - init_status_struct(SW_ID_LEFT_LED_STATE, ID_FMT_STRING, - "left_led_state", "ON|OFF|CHANGING"); - tux_sw_status_set_value(SW_ID_LEFT_LED_STATE, STRING_VALUE_OFF, - false); + INIT_STRINGID(SW_ID_LEFT_LED_STATE, ID_FMT_STRING, + "left_led_state", "ON|OFF|CHANGING", STRING_VALUE_OFF, 1) - init_status_struct(SW_ID_RIGHT_LED_STATE, ID_FMT_STRING, - "right_led_state", "ON|OFF|CHANGING"); - tux_sw_status_set_value(SW_ID_RIGHT_LED_STATE, STRING_VALUE_OFF, - false); + INIT_STRINGID(SW_ID_RIGHT_LED_STATE, ID_FMT_STRING, + "right_led_state", "ON|OFF|CHANGING", STRING_VALUE_OFF, 1) - init_status_struct(SW_ID_CONNECTION_QUALITY, ID_FMT_INT, - "connection_quality", "range[0..100]"); + INIT_INTID(SW_ID_CONNECTION_QUALITY, ID_FMT_INT, + "connection_quality", "range[0..100]", 0, 1) - init_status_struct(SW_ID_AUDIO_FLASH_PLAY, ID_FMT_STRING, - "audio_flash_play", "TRACK_<range[0..255]>|STOP"); - tux_sw_status_set_value(SW_ID_AUDIO_FLASH_PLAY, STRING_VALUE_STOP, - false); + INIT_STRINGID(SW_ID_AUDIO_FLASH_PLAY, ID_FMT_STRING, + "audio_flash_play", "TRACK_<range[0..255]>|STOP", STRING_VALUE_STOP, 1) - init_status_struct(SW_ID_AUDIO_GENERAL_PLAY, ID_FMT_BOOL, - "audio_general_play", "False|True"); + INIT_INTID(SW_ID_AUDIO_GENERAL_PLAY, ID_FMT_BOOL, + "audio_general_play", "False|True", 0, 1) - init_status_struct(SW_ID_FLASH_PROG_CURR_TRACK, ID_FMT_UINT8, - "flash_programming_current_track", "range[0..255]"); + INIT_INTID(SW_ID_FLASH_PROG_CURR_TRACK, ID_FMT_UINT8, + "flash_programming_current_track", "range[0..255]", 0, 1) - init_status_struct(SW_ID_FLASH_PROG_LAST_TRACK_SIZE, ID_FMT_INT, - "flash_programming_last_track_size", "<track size>"); + INIT_INTID(SW_ID_FLASH_PROG_LAST_TRACK_SIZE, ID_FMT_INT, + "flash_programming_last_track_size", "<track size>", 0, 1) - init_status_struct(SW_ID_TUXCORE_SYMBOLIC_VERSION, ID_FMT_STRING, - "tuxcore_symbolic_version", "<string>"); - tux_sw_status_set_value(SW_ID_TUXCORE_SYMBOLIC_VERSION, - knowed_tuxcore_symbolic_version, false); + INIT_STRINGID(SW_ID_TUXCORE_SYMBOLIC_VERSION, ID_FMT_STRING, + "tuxcore_symbolic_version", "<string>", + knowed_tuxcore_symbolic_version, 1) - init_status_struct(SW_ID_TUXAUDIO_SYMBOLIC_VERSION, ID_FMT_STRING, - "tuxaudio_symbolic_version", "<string>"); - tux_sw_status_set_value(SW_ID_TUXAUDIO_SYMBOLIC_VERSION, - knowed_tuxaudio_symbolic_version, false); + INIT_STRINGID(SW_ID_TUXAUDIO_SYMBOLIC_VERSION, ID_FMT_STRING, + "tuxaudio_symbolic_version", "<string>", + knowed_tuxaudio_symbolic_version, 1) - init_status_struct(SW_ID_FUXUSB_SYMBOLIC_VERSION, ID_FMT_STRING, - "fuxusb_symbolic_version", "<string>"); - tux_sw_status_set_value(SW_ID_FUXUSB_SYMBOLIC_VERSION, - knowed_fuxusb_symbolic_version, false); + INIT_STRINGID(SW_ID_FUXUSB_SYMBOLIC_VERSION, ID_FMT_STRING, + "fuxusb_symbolic_version", "<string>", + knowed_fuxusb_symbolic_version, 1) - init_status_struct(SW_ID_FUXRF_SYMBOLIC_VERSION, ID_FMT_STRING, - "fuxrf_symbolic_version", "<string>"); - tux_sw_status_set_value(SW_ID_FUXRF_SYMBOLIC_VERSION, - knowed_fuxrf_symbolic_version, false); + INIT_STRINGID(SW_ID_FUXRF_SYMBOLIC_VERSION, ID_FMT_STRING, + "fuxrf_symbolic_version", "<string>", + knowed_fuxrf_symbolic_version, 1) - init_status_struct(SW_ID_TUXRF_SYMBOLIC_VERSION, ID_FMT_STRING, - "tuxrf_symbolic_version", "<string>"); - tux_sw_status_set_value(SW_ID_TUXRF_SYMBOLIC_VERSION, - knowed_tuxrf_symbolic_version, false); + INIT_STRINGID(SW_ID_TUXRF_SYMBOLIC_VERSION, ID_FMT_STRING, + "tuxrf_symbolic_version", "<string>", + knowed_tuxrf_symbolic_version, 1) - init_status_struct(SW_ID_DRIVER_SYMBOLIC_VERSION, ID_FMT_STRING, - "driver_symbolic_version", "<string>"); - tux_sw_status_set_value(SW_ID_DRIVER_SYMBOLIC_VERSION, - driver_symbolic_version, false); + INIT_STRINGID(SW_ID_DRIVER_SYMBOLIC_VERSION, ID_FMT_STRING, + "driver_symbolic_version", "<string>", + "", 1) - init_status_struct(SW_ID_SOUND_REFLASH_BEGIN, ID_FMT_FLOAT, - "sound_reflash_begin", "<seconds>"); + INIT_FLOATID(SW_ID_SOUND_REFLASH_BEGIN, ID_FMT_FLOAT, + "sound_reflash_begin", "<seconds>", 0.0, 1000) - init_status_struct(SW_ID_SOUND_REFLASH_END, ID_FMT_STRING, - "sound_reflash_end", "NO_ERROR|ERROR_RF_OFFLINE|ERROR_WAV|ERROR_USB"); - tux_sw_status_set_value(SW_ID_SOUND_REFLASH_END, - STRING_VALUE_NO_ERROR, false); + INIT_STRINGID(SW_ID_SOUND_REFLASH_END, ID_FMT_STRING, + "sound_reflash_end", "NO_ERROR|ERROR_RF_OFFLINE|ERROR_WAV|ERROR_USB", + STRING_VALUE_NO_ERROR, 1) - init_status_struct(SW_ID_SOUND_REFLASH_CURRENT_TRACK, ID_FMT_UINT8, - "sound_reflash_current_track", "range[0..255]"); + INIT_INTID(SW_ID_SOUND_REFLASH_CURRENT_TRACK, ID_FMT_UINT8, + "sound_reflash_current_track", "range[0..255]", 0, 1) +}; +/** + * + */ +LIBLOCAL void +tux_sw_status_init(void) +{ + char driver_symbolic_version[128] = ""; + +#ifdef USE_MUTEX + mutex_init(__status_mutex); +#endif + + sprintf(driver_symbolic_version, "Tux_driver_%d.%d.%d - b%.3d (%s) (%s)", + VER_MAJOR, + VER_MINOR, + VER_UPDATE, + VER_BUILD, + VER_STATE, + VER_ARCH); + + tux_sw_status_set_strvalue(SW_ID_DRIVER_SYMBOLIC_VERSION, + driver_symbolic_version, false); + + #ifdef GENERATE_DOC tux_sw_status_dump_status_doc(); #endif @@ -364,10 +315,10 @@ sprintf(str, "%d", sw_status_table[id].intvalue); break; case ID_FMT_FLOAT: - sprintf(str, "%f", *(float *)sw_status_table[id].value); + sprintf(str, "%f", sw_status_table[id].floatvalue); break; case ID_FMT_STRING: - strcpy(str, (char *)sw_status_table[id].value); + strcpy(str, sw_status_table[id].strvalue); break; default: break; @@ -500,52 +451,44 @@ * */ LIBLOCAL void -tux_sw_status_set_value(int id, const void *value, bool make_event) +tux_sw_status_set_floatvalue(int id, float value, bool make_event) { - char state_str[1024] = ""; - + float delta; + char state_str[1024]; + + if (make_event) + { #ifdef USE_MUTEX - mutex_lock(__status_mutex); + mutex_lock(__status_mutex); #endif - switch(sw_status_table[id].value_fmt) { - case ID_FMT_BOOL: - assert("set_value: should not happen"); - *(unsigned char *)sw_status_table[id].value = *(unsigned char *)value; - break; - case ID_FMT_UINT8: - assert("set_value: should not happen"); - *(unsigned char *)sw_status_table[id].value = *(unsigned char *)value; - break; - case ID_FMT_INT: - assert("set_value: should not happen"); - *(int *)sw_status_table[id].value = *(int *)value; - break; - case ID_FMT_FLOAT: - *(float *)sw_status_table[id].value = *(float *)value; - break; - case ID_FMT_STRING: - strcpy((char *)sw_status_table[id].value, (char *)value); - break; - } + delta = sw_status_table[id].floatvalue - value; + if (delta < 0) + { + delta = -delta; + } + #ifdef USE_MUTEX - mutex_unlock(__status_mutex); + mutex_unlock(__status_mutex); #endif - tux_sw_status_get_state_str(id, state_str); - - if (make_event) - { if (event_funct) { - event_funct(state_str); + if ((1000*delta) >= sw_status_table[id].event_threshold) + { + sw_status_table[id].floatvalue = value; + tux_sw_status_get_state_str(id, state_str); + event_funct(state_str); + } } } #ifdef USE_MUTEX mutex_lock(__status_mutex); #endif + sw_status_table[id].lu_time = get_time(); + #ifdef USE_MUTEX mutex_unlock(__status_mutex); #endif @@ -554,42 +497,57 @@ /** * */ -LIBLOCAL void * -tux_sw_status_get_value(int id) +LIBLOCAL void +tux_sw_status_set_strvalue(int id, const char *value, bool make_event) { - void *value = NULL; + char state_str[1024]; + + if (make_event) + { +#ifdef USE_MUTEX + mutex_lock(__status_mutex); +#endif + + +#ifdef USE_MUTEX + mutex_unlock(__status_mutex); +#endif + if (event_funct) + { + /* + the next if statement uses pointer comparison + this works like a charm under the following two conditions + - value points to a string constants (and not variables) + - no duplicate string constants (althought the compiler might + pick up this one anyway). + If the first condition is not met, we need to copy the string + instead of the pointer (and allocate space for it), + (or resolve it in the caller, not really a nice solution) + If the second condtion is not met something like: + ((sw_status_table[id].strvalue == NULL) || + strcmp(sw_status_table[id].strvalue,value))) + could be done instead of the value != line) + */ + if (sw_status_table[id].event_threshold && + (value != sw_status_table[id].strvalue)) + { + sw_status_table[id].strvalue = value; + tux_sw_status_get_state_str(id, state_str); + event_funct(state_str); + } + } + } + #ifdef USE_MUTEX mutex_lock(__status_mutex); #endif - switch(sw_status_table[id].value_fmt) - { - case ID_FMT_BOOL: - assert("get_value: should not happen"); - value = sw_status_table[id].value; - break; - case ID_FMT_UINT8: - assert("get_value: should not happen"); - value = sw_status_table[id].value; - break; - case ID_FMT_INT: - assert("get_value: should not happen"); - value = sw_status_table[id].value; - break; - case ID_FMT_FLOAT: - value = sw_status_table[id].value; - break; - case ID_FMT_STRING: - value = sw_status_table[id].value; - break; - default: - break; - } + + sw_status_table[id].lu_time = get_time(); + #ifdef USE_MUTEX mutex_unlock(__status_mutex); #endif - - return value; } /** Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_sw_status.h =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_sw_status.h 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_sw_status.h 2008-05-18 11:35:08 UTC (rev 1171) @@ -105,35 +105,10 @@ typedef void(*event_callback_t)(char *event); -/* - notes on the following struct: - - strvalue is a pointer. it should only be used for static data - - intvalue is used for bool, uint8, int8 - - event_threshold is the threshold value; if the threshold is exceeded - the value is evented; for string values 0 means not evented, - 1 means evented if string changes -*/ -typedef struct -{ - int id; - char name[128]; - int value_fmt; - void *value; - int event_threshold; - int intvalue; - const char *strvalue; - char value_doc[1024]; - double lu_time; -} sw_status_t; - -typedef sw_status_t sw_status_table_t[SW_STATUS_NUMBER]; - -extern sw_status_table_t sw_status_table; - extern void tux_sw_status_init(void); -extern void tux_sw_status_set_value(int id, const void *value, bool make_event); extern void tux_sw_status_set_intvalue(int id, int value, bool make_event); -extern void *tux_sw_status_get_value(int id); +extern void tux_sw_status_set_strvalue(int id, const char *value, bool make_event); +extern void tux_sw_status_set_floatvalue(int id, float value, bool make_event); extern TuxDrvError tux_sw_status_name_from_id(int id, char* name); extern TuxDrvError tux_sw_status_id_from_name(const char* name, int *id); extern const char *tux_sw_status_value_fmt_from_id(int id); Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_user_inputs.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_user_inputs.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_user_inputs.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -204,8 +204,7 @@ { /* remote button is released */ code_str = RC5_code_to_str(K_DUMMY_RELEASE); - tux_sw_status_set_value(SW_ID_REMOTE_BUTTON, - (void *)code_str, true); + tux_sw_status_set_strvalue(SW_ID_REMOTE_BUTTON, code_str, true); rc5_timeout_counter = 0; rc5_on_receiving = false; @@ -220,15 +219,13 @@ { /* remote button is released */ code_str = RC5_code_to_str(K_DUMMY_RELEASE); - tux_sw_status_set_value(SW_ID_REMOTE_BUTTON, - (void *)code_str, true); + tux_sw_status_set_strvalue(SW_ID_REMOTE_BUTTON, code_str, true); /* remote button is pressed */ if (hw_status_table.ir.rc5_code.bits.command <= LAST_VALID_K) { code_str = RC5_code_to_str(hw_status_table.ir.rc5_code.bits.command); - tux_sw_status_set_value(SW_ID_REMOTE_BUTTON, - (void *)code_str, true); + tux_sw_status_set_strvalue(SW_ID_REMOTE_BUTTON, code_str, true); } else { @@ -250,8 +247,7 @@ if (hw_status_table.ir.rc5_code.bits.command <= LAST_VALID_K) { code_str = RC5_code_to_str(hw_status_table.ir.rc5_code.bits.command); - tux_sw_status_set_value(SW_ID_REMOTE_BUTTON, - (void *)code_str, true); + tux_sw_status_set_strvalue(SW_ID_REMOTE_BUTTON, code_str, true); } else { @@ -281,10 +277,7 @@ tux_user_inputs_update_charger_state(void) { char *new_state = ""; - char *old_state = ""; - old_state = (char *)tux_sw_status_get_value(SW_ID_CHARGER_STATE); - if (!hw_status_table.sensors1.sensors.bits.power_plug_insertion_switch) { new_state = STRING_VALUE_UNPLUGGED; @@ -303,22 +296,12 @@ } else { - if (strcmp(STRING_VALUE_UNPLUGGED, old_state)) - { - new_state = STRING_VALUE_TRICKLE; - } - else - { - new_state = STRING_VALUE_UNPLUGGED; - } + new_state = STRING_VALUE_TRICKLE; } } } - if (strcmp(new_state, old_state)) - { - tux_sw_status_set_value(SW_ID_CHARGER_STATE, (void *)new_state, true); - } + tux_sw_status_set_strvalue(SW_ID_CHARGER_STATE, new_state, true); } /** Modified: software_suite_v2/middleware/tuxdriver/trunk/src/tux_wings.c =================================================================== --- software_suite_v2/middleware/tuxdriver/trunk/src/tux_wings.c 2008-05-17 11:38:57 UTC (rev 1170) +++ software_suite_v2/middleware/tuxdriver/trunk/src/tux_wings.c 2008-05-18 11:35:08 UTC (rev 1171) @@ -36,7 +36,6 @@ tux_wings_update_position(void) { char *new_position = ""; - char *old_position = ""; if (!hw_status_table.position2.wings_down) { @@ -47,13 +46,7 @@ new_position = STRING_VALUE_UP; } - old_position = (char *)tux_sw_status_get_value(SW_ID_WINGS_POSITION); - - if (strcmp(new_position, old_position)) - { - tux_sw_status_set_value(SW_ID_WINGS_POSITION, - (void *)new_position, true); - } + tux_sw_status_set_strvalue(SW_ID_WINGS_POSITION, new_position, true); } /** |