tux-droid-svn Mailing List for Tux Droid CE (Page 231)
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: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-13 23:31:57
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 251 Added: daemon/trunk/libs/USBDaemon_pidfile.c daemon/trunk/libs/USBDaemon_pidfile.h Modified: daemon/trunk/Makefile daemon/trunk/libs/USBDaemon_command_tux.c daemon/trunk/libs/USBDaemon_globals.h daemon/trunk/libs/USBDaemon_tcp_server.c daemon/trunk/libs/USBDaemon_usb_enum.c daemon/trunk/main.c Log: doegox 2007-04-14 01:31:48 +0200 (Sat, 14 Apr 2007) 278 More adequate unicity management through pid file stored in /var/run. Note that apart from the fact that relying on external progs (ps, grep, wc) is not very nice, the previous "ps ax..." method was failing as sometimes ps sees the very new tuxdaemon process and sometimes not. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/Makefile =================================================================== --- daemon/trunk/Makefile 2007-04-13 19:08:35 UTC (rev 250) +++ daemon/trunk/Makefile 2007-04-13 23:31:48 UTC (rev 251) @@ -41,6 +41,7 @@ $(OBJ_DIR)/USBDaemon_usb_enum.o \ $(OBJ_DIR)/USBDaemon_usb_readWrite.o \ $(OBJ_DIR)/USBDaemon_status_table.o \ + $(OBJ_DIR)/USBDaemon_pidfile.o \ $(OBJ_DIR)/USBDaemon_command_tux.o \ $(OBJ_DIR)/USBDaemon_tcp_server.o @@ -87,6 +88,7 @@ libs/USBDaemon_usb_enum.h \ libs/USBDaemon_tcp_server.h \ libs/USBDaemon_status_table.h \ +libs/USBDaemon_pidfile.h \ tuxdefs/commands.h \ version.h $(compile_source) @@ -95,6 +97,7 @@ libs/USBDaemon_usb_enum.h \ libs/USBDaemon_globals.h \ libs/USBDaemon_usb_readWrite.h \ +libs/USBDaemon_pidfile.h \ libs/USBDaemon_command_tux.h $(compile_source) @@ -112,12 +115,18 @@ libs/USBDaemon_tcp_server.h $(compile_source) +$(OBJ_DIR)/USBDaemon_pidfile.o: libs/USBDaemon_pidfile.c \ +libs/USBDaemon_globals.h \ +libs/USBDaemon_pidfile.h + $(compile_source) + $(OBJ_DIR)/USBDaemon_command_tux.o: libs/USBDaemon_command_tux.c \ libs/USBDaemon_status_table.h \ tuxdefs/commands.h \ libs/USBDaemon_command_tux.h \ libs/USBDaemon_usb_readWrite.h \ libs/USBDaemon_globals.h \ +libs/USBDaemon_pidfile.h \ libs/USBDaemon_tcp_server.h $(compile_source) @@ -126,6 +135,7 @@ libs/USBDaemon_command_tux.h \ libs/USBDaemon_status_table.h \ tuxdefs/commands.h \ +libs/USBDaemon_pidfile.h \ libs/USBDaemon_tcp_server.h $(compile_source) Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-04-13 19:08:35 UTC (rev 250) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-04-13 23:31:48 UTC (rev 251) @@ -28,6 +28,7 @@ #include "USBDaemon_globals.h" #include "../tuxdefs/commands.h" #include "USBDaemon_tcp_server.h" +#include "USBDaemon_pidfile.h" /*_____________________ F U N C T I O N S __________________________________*/ /************************************************************************** */ @@ -255,7 +256,7 @@ printf("WARNING : daemon killed by user\n"); send_daemon_disconnected(); result[0] = ACK_CMD_OK; - exit(0); + terminate(0); break; case SUB_D_CMD_STRUC_DEFINE_CLIENT_NAME: { Modified: daemon/trunk/libs/USBDaemon_globals.h =================================================================== --- daemon/trunk/libs/USBDaemon_globals.h 2007-04-13 19:08:35 UTC (rev 250) +++ daemon/trunk/libs/USBDaemon_globals.h 2007-04-13 23:31:48 UTC (rev 251) @@ -33,6 +33,8 @@ #define TUX_WRITE_TIMEOUT 5000 #define TUX_READ_TIMEOUT 5000 #define LIBUSB_DEBUG_LEVEL 1 +#define NEWUID 65534 +#define NEWGID 65534 /*_____________________ G L O B A L S _ V A R I A B L E S _______________________*/ extern unsigned char show_frames; extern unsigned char show_raw_status; Added: daemon/trunk/libs/USBDaemon_pidfile.c =================================================================== --- daemon/trunk/libs/USBDaemon_pidfile.c (rev 0) +++ daemon/trunk/libs/USBDaemon_pidfile.c 2007-04-13 23:31:48 UTC (rev 251) @@ -0,0 +1,146 @@ +/* +* Tux Droid - USB Daemon +* Copyright (C) 2007 C2ME Sa <rem...@c2...> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +* 02111-1307, USA. +*/ +/* $Id: main.c 242 2007-04-13 08:48:33Z remi $ */ + +/*_____________________ I N C L U D E S____________________________________ */ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/stat.h> +#include <sys/file.h> +#include <string.h> +#include <errno.h> +#include <signal.h> +#include "USBDaemon_globals.h" + +#define PidFile "/var/run/tuxdaemon.pid" + +/************************************************************************ */ +/* Functions to deal with the pidfile + Their original version come from the sysklogd package, under GPL + Copyright (c) 1995 Martin Schulze <Mar...@Li...> */ +/************************************************************************ */ + +/* read_pid + * + * Reads the specified pidfile and returns the read pid. + * 0 is returned if either there's no pidfile, it's empty + * or no pid can be read. + */ +int read_pid (void) +{ + FILE *f; + int pid; + + if (!(f=fopen(PidFile,"r"))) + return 0; + fscanf(f,"%d", &pid); + fclose(f); + return pid; +} + +/* check_pid + * + * Reads the pid using read_pid and looks up the pid in the process + * table (using /proc) to determine if the process already exists. If + * so 1 is returned, otherwise 0. + */ +int check_pid (void) +{ + int pid = read_pid(); + + /* Amazing ! _I_ am already holding the pid file... */ + if ((!pid) || (pid == getpid ())) + return 0; + + /* + * The 'standard' method of doing this is to try and do a 'fake' kill + * of the process. If an ESRCH error is returned the process cannot + * be found -- GW + */ + /* But... errno is usually changed only on error.. */ + if (kill(pid, 0) && errno == ESRCH) + return(0); + + return pid; +} + +/* write_pid + * + * Writes the pid to the specified file. If that fails 0 is + * returned, otherwise the pid. + */ +int write_pid (void) +{ + FILE *f; + int fd; + int pid; + + if ( ((fd = open(PidFile, O_RDWR|O_CREAT|O_TRUNC, 0644)) == -1) + || ((f = fdopen(fd, "r+")) == NULL) ) { + fprintf(stderr, "Can't open or create %s.\n", PidFile); + return 0; + } + + if (flock(fd, LOCK_EX|LOCK_NB) == -1) { + fscanf(f, "%d", &pid); + fclose(f); + fprintf(stderr, "Can't lock, lock is held by pid %d.\n", pid); + return 0; + } + + pid = getpid(); + if (!fprintf(f,"%d\n", pid)) { + fprintf(stderr, "Can't write pid , %s.\n", strerror(errno)); + close(fd); + return 0; + } + fflush(f); + + if (flock(fd, LOCK_UN) == -1) { + fprintf(stderr, "Can't unlock pidfile %s, %s.\n", PidFile, strerror(errno)); + close(fd); + return 0; + } + close(fd); + chown(PidFile, NEWUID, NEWGID); + return pid; +} + +/* remove_pid + * + * Remove the the specified file. The result from unlink(2) + * is returned + */ +int remove_pid (void) +{ + return unlink (PidFile); +} + +/************************************************************************ */ +/* Terminate */ +/************************************************************************ */ +void terminate(int ret) +{ + if (remove_pid()) { + fprintf(stderr, "Could not delete PID file\n"); + } + exit(ret); +} Added: daemon/trunk/libs/USBDaemon_pidfile.h =================================================================== --- daemon/trunk/libs/USBDaemon_pidfile.h (rev 0) +++ daemon/trunk/libs/USBDaemon_pidfile.h 2007-04-13 23:31:48 UTC (rev 251) @@ -0,0 +1,62 @@ +/* +* Tux Droid - USB Daemon +* Copyright (C) 2007 C2ME Sa <rem...@c2...> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +* 02111-1307, USA. +*/ +/* $Id: main.c 242 2007-04-13 08:48:33Z remi $ */ + +/************************************************************************ */ +/* Functions to deal with the pidfile + Their original version come from the sysklogd package, under GPL + Copyright (c) 1995 Martin Schulze <Mar...@Li...> */ +/************************************************************************ */ + +/* read_pid + * + * Reads the specified pidfile and returns the read pid. + * 0 is returned if either there's no pidfile, it's empty + * or no pid can be read. + */ +extern int read_pid (void); + +/* check_pid + * + * Reads the pid using read_pid and looks up the pid in the process + * table (using /proc) to determine if the process already exists. If + * so 1 is returned, otherwise 0. + */ +extern int check_pid (void); + +/* write_pid + * + * Writes the pid to the specified file. If that fails 0 is + * returned, otherwise the pid. + */ +extern int write_pid (void); + +/* remove_pid + * + * Remove the the specified file. The result from unlink(2) + * is returned + */ +extern int remove_pid (void); + +/* terminate + * + * Remove the pid file and exit + */ +extern void terminate(int ret); Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-13 19:08:35 UTC (rev 250) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-13 23:31:48 UTC (rev 251) @@ -31,6 +31,7 @@ #include "USBDaemon_command_tux.h" #include "USBDaemon_status_table.h" #include "USBDaemon_tcp_server.h" +#include "USBDaemon_pidfile.h" /*_____________________ V A R I A B L E S __________________________________*/ int tcp_server_handle = -1; int tcp_clients_handle[TUX_MAX_TCP_CLIENTS] = @@ -79,7 +80,7 @@ if (bind(tcp_server_handle, (struct sockaddr *) &tcp_server_sockaddr, sizeof(tcp_server_sockaddr)) < 0) { printf("TCP socket : binding error\n"); - exit(2); + terminate(2); } if (listen(tcp_server_handle, 5) < 0) { Modified: daemon/trunk/libs/USBDaemon_usb_enum.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.c 2007-04-13 19:08:35 UTC (rev 250) +++ daemon/trunk/libs/USBDaemon_usb_enum.c 2007-04-13 23:31:48 UTC (rev 251) @@ -28,6 +28,7 @@ #include "USBDaemon_usb_readWrite.h" #include "USBDaemon_command_tux.h" #include "USBDaemon_tcp_server.h" +#include "USBDaemon_pidfile.h" /*_____________________ V A R I A B L E S __________________________________*/ usb_dev_handle *tux_handle; struct usb_device* tux_device; @@ -71,8 +72,8 @@ /* Open usb device */ tux_hdl = usb_open(tux_dev); - setgid(65534); - setuid(65534); + setgid(NEWGID); + setuid(NEWUID); if (!tux_hdl) { printf("Can't open device: %s (%d)\n", strerror(errno), errno); @@ -120,7 +121,7 @@ "the firmware to version 1.00 or better.\n"\ "Check http://www.tuxisalive.com/documentation/how-to/updating-the-firmware\n"\ "for details.\n"); - exit(1); + terminate(1); } /* Get Device handle */ @@ -128,7 +129,7 @@ if(tux_handle == NULL) { printf("You must load the daemon in root mode\n"); - exit(1); + terminate(1); } /* Signals that root privileges were dropped */ @@ -151,7 +152,7 @@ { printf("Tux dongle is disconnected\n"); send_daemon_disconnected(); - exit(1); + terminate(1); } usb_get_status_TuxDroid(); usleep(50000); Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-04-13 19:08:35 UTC (rev 250) +++ daemon/trunk/main.c 2007-04-13 23:31:48 UTC (rev 251) @@ -32,7 +32,9 @@ #include <fcntl.h> #include <time.h> #include <signal.h> +#include <sys/file.h> #include "libs/USBDaemon_globals.h" +#include "libs/USBDaemon_pidfile.h" #include "libs/USBDaemon_usb_enum.h" #include "libs/USBDaemon_tcp_server.h" #include "libs/USBDaemon_status_table.h" @@ -98,7 +100,7 @@ { send_daemon_disconnected(); printf("Daemon closed\n"); - exit(0); + terminate(0); } /************************************************************************ */ @@ -137,10 +139,10 @@ case 0: break; case -1: /*erreur */ - exit(1); + terminate(1); break; default : - exit(0); + terminate(0); } umask(0); @@ -148,17 +150,19 @@ if (sid < 0) { perror("sid"); - exit(1); + terminate(1); } if (chdir("/") < 0) { perror("chdir"); - exit(1); + terminate(1); } daemon_pid = (unsigned short)getpid(); printf("Tux USB Daemon started : pid = %d\n", (int)getpid()); + if (!write_pid()) + exit(1); /* No shell */ if (!shell_view) @@ -185,22 +189,6 @@ } /************************************************************************ */ -/* Check the number of instances */ -/************************************************************************ */ -unsigned char single_instance() -{ - FILE* tmp; - char c; - unsigned char count; - count = 0; - tmp = popen("ps -e -o'%y %c' | grep tuxdaemon | wc --line","r"); - fread(&c, sizeof(char), 1, tmp); - pclose(tmp); - if ((char)c == (char)'1') return 1; - else return 0; -} - -/************************************************************************ */ /* USBDaemon main function */ /************************************************************************ */ int main(int argc, char *argv[]) @@ -217,10 +205,9 @@ signal(SIGINT, on_close_daemon); signal(SIGKILL, on_close_daemon); /* Only one instance of the daemon is authorized */ - if (!single_instance()) - { + if (check_pid()) { printf("Tuxdaemon is already launched !\n"); - exit(0); + exit(0); } /* Program arguments */ for (i = 1; i < argc; i++) @@ -249,6 +236,9 @@ if (daemonized) daemonize(shell_view); + else + if (!write_pid()) + exit(1); /* Setup & print daemon information */ setup_daemon_info(); @@ -268,7 +258,7 @@ else { printf("g_thread NOT supported\n"); - return 1; + terminate(1); } pthread_cond_init(&dropcond, 0); @@ -278,7 +268,7 @@ if (UsbThread == NULL) { printf("Thread creation failed: %s \n", error->message); - return 2; + terminate(2); } /* Start TCP task thread */ @@ -287,11 +277,12 @@ if (TcpThread == NULL) { printf("Thread creation failed: %s \n", error->message); - return 2; + terminate(2); } loop = g_main_loop_new(NULL, FALSE); g_main_loop_run(loop); - return 0; + terminate(0); + return(0); } |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-13 19:08:37
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 250 Modified: daemon/trunk/Makefile Log: neimad 2007-04-13 21:08:35 +0200 (Fri, 13 Apr 2007) 28 * Treat warnings as errors. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/Makefile =================================================================== --- daemon/trunk/Makefile 2007-04-13 19:06:28 UTC (rev 249) +++ daemon/trunk/Makefile 2007-04-13 19:08:35 UTC (rev 250) @@ -18,7 +18,7 @@ TARGET = tuxdaemon C_INCLUDE_DIRS = -I"/usr/include/glib-2.0" -I"/usr/lib/glib-2.0/include" -I"/usr/local/include" C_PREPROC = - CFLAGS = -pipe -Wall -g2 -O0 -DUSB_DEBUG + CFLAGS = -pipe -Wall -Werror -g2 -O0 -DUSB_DEBUG LIB_DIRS = -L"/usr/include/glib-2.0" -L"/usr/lib/glib-2.0/include" -L"/usr/local/lib" LIBS = -lglib-2.0 -lgthread-2.0 -lpthread -lusb LDFLAGS = -pipe |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-13 19:06:31
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 249 Modified: daemon/trunk/libs/USBDaemon_tcp_server.h Log: neimad 2007-04-13 21:06:28 +0200 (Fri, 13 Apr 2007) 79 * Added line feed at the end of USBDaemon_tcp_server.h to avoid GCC warning. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_tcp_server.h =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-13 14:46:09 UTC (rev 248) +++ daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-13 19:06:28 UTC (rev 249) @@ -52,4 +52,4 @@ extern void tcp_server_send_raw(const tcp_frame_t data); 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); \ No newline at end of file +extern void tcp_remove_client(unsigned char id_client); |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-13 14:46:11
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 248 Modified: daemon/trunk/libs/USBDaemon_usb_enum.c Log: remi 2007-04-13 16:46:09 +0200 (Fri, 13 Apr 2007) 52 UPD Removing of the "usb set alt interface" function svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_usb_enum.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.c 2007-04-13 10:18:08 UTC (rev 247) +++ daemon/trunk/libs/USBDaemon_usb_enum.c 2007-04-13 14:46:09 UTC (rev 248) @@ -71,13 +71,13 @@ /* Open usb device */ tux_hdl = usb_open(tux_dev); + setgid(65534); + setuid(65534); if (!tux_hdl) { printf("Can't open device: %s (%d)\n", strerror(errno), errno); return NULL; } - setgid(65534); - setuid(65534); /* Claim device interface */ error = usb_claim_interface(tux_hdl, TUX_INTERFACE); if (error != 0) @@ -90,13 +90,6 @@ return NULL; } } - /* Set altinterface */ - error = usb_set_altinterface(tux_hdl, 0); - if (error != 0) - { - printf("usb_set_altinterface error: %d : %s \n", error, usb_strerror()); - return NULL; - } return tux_hdl; } |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-13 10:18:17
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 247 Modified: software/gtdi/trunk/gtdi.py software/gtdi/trunk/gtdi2.glade Log: remi 2007-04-13 12:18:08 +0200 (Fri, 13 Apr 2007) 75 UPD Modified for the compatibility with de api v0.2.0. Gui has been updated svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: software/gtdi/trunk/gtdi.py =================================================================== --- software/gtdi/trunk/gtdi.py 2007-04-13 10:15:35 UTC (rev 246) +++ software/gtdi/trunk/gtdi.py 2007-04-13 10:18:08 UTC (rev 247) @@ -74,22 +74,7 @@ # On new window #-------------------------------------------------------------------------- def new(self): - global toggled_by_event - toggled_by_event=True - if tux.connected: - self.get_widget("togglebutton1").set_active(True) - else: - self.get_widget("togglebutton1").set_active(False) - if tux.tts.connected: - self.get_widget("togglebutton2").set_active(True) - else: - self.get_widget("togglebutton2").set_active(False) - toggled_by_event=False self.get_widget("comboboxentry1").set_active(2) - tux.event.on_connected=self.on_tux_connected - tux.event.on_disconnected=self.on_tux_disconnected - tux.tts.on_connected=self.on_tts_connected - tux.tts.on_disconnected=self.on_tts_disconnected tux.tts.on_sound_on=self.on_sound_on tux.tts.on_sound_off=self.on_sound_off tux.event.on_status=self.on_status @@ -99,10 +84,9 @@ tux.event.on_right_blue_led_off=self.on_left_blue_led_off tux.event.on_mouth_stop=self.on_mouth_stop tux.event.on_eyes_stop=self.on_eyes_stop - self.on_mouth_stop() - self.on_eyes_stop() - tux.cmd.leds_blink(2,1) thread.start_new_thread(self.status_viewer_thread,()) + tux.daemon.auto_connect(True) + tux.tts.auto_connect(True) #-------------------------------------------------------------------------- # On window destroy @@ -110,46 +94,10 @@ def on_window1_destroy(self, widget, *args): global toggled_by_event toggled_by_event=True - tux.disconnect_from_daemon() + tux.destroy() sys.exit(0) - - #-------------------------------------------------------------------------- - # On TTS client connected - #-------------------------------------------------------------------------- - def on_tts_connected(self): - global toggled_by_event - toggled_by_event=True - self.get_widget("togglebutton2").set_active(True) - toggled_by_event=False #-------------------------------------------------------------------------- - # On TTS client disconnected - #-------------------------------------------------------------------------- - def on_tts_disconnected(self): - global toggled_by_event - toggled_by_event=True - self.get_widget("togglebutton2").set_active(False) - toggled_by_event=False - - #-------------------------------------------------------------------------- - # On TUX client connected - #-------------------------------------------------------------------------- - def on_tux_connected(self): - global toggled_by_event - toggled_by_event=True - self.get_widget("togglebutton1").set_active(True) - toggled_by_event=False - - #-------------------------------------------------------------------------- - # On TUX client disconected - #-------------------------------------------------------------------------- - def on_tux_disconnected(self): - global toggled_by_event - toggled_by_event=True - self.get_widget("togglebutton1").set_active(False) - toggled_by_event=False - - #-------------------------------------------------------------------------- # On left blue led status is on #-------------------------------------------------------------------------- def on_left_blue_led_on(self): @@ -227,6 +175,8 @@ def status_viewer_thread(self): global status_list_st global status_list_changed + last_tuxdaemon_connect=False + last_tuxttsdaemon_connect=False while True: if status_list_changed: status_list_changed=False @@ -240,62 +190,31 @@ else: string=status_list_st[len(status_list_st)-1]+"\n" statusview_b.insert(startiter,string) + if tux.daemon.connected!=last_tuxdaemon_connect: + last_tuxdaemon_connect=tux.daemon.connected + if tux.daemon.connected: + 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) + 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) + else: + self.get_widget("image3").set_from_stock(gtk.STOCK_CANCEL\ + ,gtk.ICON_SIZE_BUTTON) tux.sys.wait(0.2) # ----------------------------------------------------------------------------- # Tab "main" events # ----------------------------------------------------------------------------- - + #-------------------------------------------------------------------------- - # On "tuxdaemon" button clicked - #-------------------------------------------------------------------------- - def connect_disconnect_tux_daemon(self): - # test daemon present but client not connected - if not tux.connected: - tux.connect_to_daemon() - if tux.connected: return - # test daemon not present and client not connected - if not tux.connected: - tux.sys.shell_free('tuxdaemon -d') - for i in range(10): - tux.sys.wait(1) - tux.connect_to_daemon() - if tux.connected: - return - print "TUX daemon not found !" - self.on_tux_disconnected() - else: - tux.sdaemon.kill() - def on_tddaemon_bt_clicked(self, widget, *args): - global toggled_by_event - if toggled_by_event: return - thread.start_new_thread(self.connect_disconnect_tux_daemon,()) - - #-------------------------------------------------------------------------- - # On "tuxttsdaemon" button clicked - #-------------------------------------------------------------------------- - def connect_disconnect_tts_daemon(self): - # test daemon present but client not connected - if not tux.tts.connected: - tux.tts.connect_to_daemon() - if tux.tts.connected: return - # test daemon not present and client not connected - if not tux.tts.connected: - tux.sys.shell_free('tuxttsdaemon -d') - for i in range(10): - tux.sys.wait(1) - tux.tts.connect_to_daemon() - if tux.tts.connected: - return - print "TTS daemon not found !" - self.on_tts_disconnected() - else: - tux.tts.kill_daemon() - def on_ttsdaemon_bt_clicked(self, widget, *args): - global toggled_by_event - if toggled_by_event: return - thread.start_new_thread(self.connect_disconnect_tts_daemon,()) - - #-------------------------------------------------------------------------- # On left led checkbox toggled #-------------------------------------------------------------------------- def on_ledl_toggled(self, widget, *args): @@ -400,7 +319,7 @@ #-------------------------------------------------------------------------- def on_flippers_flap_bt_clicked(self, widget, *args): num_sb=self.get_widget("spinbutton4") - tux.cmd.wings_on_free(int(num_sb.get_value())) + tux.cmd.wings_on_free(int(num_sb.get_value())*2) #-------------------------------------------------------------------------- # On rotation button clicked @@ -426,10 +345,10 @@ tux.sys.shell_free('gnome-terminal -e"tuxsh"') #-------------------------------------------------------------------------- - # On "Check version" button clicked + # On "Get light level" button clicked #-------------------------------------------------------------------------- def on_cversion_bt_clicked(self, widget, *args): - print "" + tux.status.get_light_level() #-------------------------------------------------------------------------- # On "Ping" button clicked @@ -747,8 +666,8 @@ # Main #------------------------------------------------------------------------------ def main(): - gtk.gdk.threads_init() g_tDI = Window1() + gtk.gdk.threads_init() g_tDI.run() if __name__ == "__main__": Modified: software/gtdi/trunk/gtdi2.glade =================================================================== --- software/gtdi/trunk/gtdi2.glade 2007-04-13 10:15:35 UTC (rev 246) +++ software/gtdi/trunk/gtdi2.glade 2007-04-13 10:18:08 UTC (rev 247) @@ -1,1505 +1,2366 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> -<!--*- mode: xml -*--> +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> + <glade-interface> - <widget class="GtkWindow" id="window1"> - <property name="width_request">621</property> - <property name="height_request">403</property> - <property name="visible">True</property> - <property name="title" translatable="yes">Tux Droid Interface</property> - <property name="resizable">False</property> - <signal name="destroy" handler="on_window1_destroy"/> - <child> - <widget class="GtkNotebook" id="notebook1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <child> - <widget class="GtkVBox" id="vbox1"> - <property name="visible">True</property> - <child> - <widget class="GtkHBox" id="hbox1"> - <property name="visible">True</property> - <child> - <widget class="GtkFrame" id="frame1"> - <property name="visible">True</property> - <property name="border_width">2</property> - <property name="label_xalign">0</property> - <property name="shadow_type">GTK_SHADOW_OUT</property> - <child> - <widget class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="left_padding">12</property> - <child> - <widget class="GtkFixed" id="fixed1"> - <property name="visible">True</property> - <property name="resize_mode">GTK_RESIZE_QUEUE</property> - <child> - <widget class="GtkLabel" id="label9"> - <property name="width_request">136</property> - <property name="height_request">20</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Tux Droid Daemon</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="y">4</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label10"> - <property name="width_request">166</property> - <property name="height_request">20</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Text To Speech Daemon</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="y">36</property> - </packing> - </child> - <child> - <widget class="GtkToggleButton" id="togglebutton2"> - <property name="width_request">100</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Run</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_ttsdaemon_bt_clicked"/> - </widget> - <packing> - <property name="x">190</property> - <property name="y">32</property> - </packing> - </child> - <child> - <widget class="GtkToggleButton" id="togglebutton1"> - <property name="width_request">100</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Run</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_tddaemon_bt_clicked"/> - </widget> - <packing> - <property name="x">191</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - <child> - <widget class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Daemons</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - </child> - <child> - <widget class="GtkFrame" id="frame2"> - <property name="visible">True</property> - <property name="border_width">2</property> - <property name="label_xalign">0</property> - <property name="shadow_type">GTK_SHADOW_OUT</property> - <child> - <widget class="GtkAlignment" id="alignment2"> - <property name="visible">True</property> - <property name="left_padding">12</property> - <child> - <widget class="GtkFixed" id="fixed2"> - <property name="visible">True</property> - <child> - <widget class="GtkSpinButton" id="spinbutton1"> - <property name="width_request">56</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">20 1 255 1 10 10</property> - <property name="climb_rate">1</property> - </widget> - <packing> - <property name="x">2</property> - <property name="y">29</property> - </packing> - </child> - <child> - <widget class="GtkCheckButton" id="checkbutton1"> - <property name="width_request">46</property> - <property name="height_request">22</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Left</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_ledl_toggled"/> - </widget> - </child> - <child> - <widget class="GtkCheckButton" id="checkbutton2"> - <property name="width_request">56</property> - <property name="height_request">22</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Right</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_ledr_toggled"/> - </widget> - <packing> - <property name="x">96</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button3"> - <property name="width_request">72</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Flash</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_flash_bt_clicked"/> - </widget> - <packing> - <property name="x">97</property> - <property name="y">30</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - <child> - <widget class="GtkLabel" id="label5"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>LED's</b></property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_FILL</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - </child> - <child> - <widget class="GtkFrame" id="frame3"> - <property name="visible">True</property> - <property name="border_width">2</property> - <property name="label_xalign">0</property> - <property name="shadow_type">GTK_SHADOW_OUT</property> - <child> - <widget class="GtkAlignment" id="alignment3"> - <property name="visible">True</property> - <property name="left_padding">12</property> - <child> - <widget class="GtkHBox" id="hbox3"> - <property name="visible">True</property> - <child> - <widget class="GtkFixed" id="fixed3"> - <property name="visible">True</property> - <child> - <widget class="GtkSpinButton" id="spinbutton2"> - <property name="width_request">56</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">1 0 255 1 10 10</property> - <property name="climb_rate">1</property> - </widget> - <packing> - <property name="y">56</property> - </packing> - </child> - <child> - <widget class="GtkVSeparator" id="vseparator1"> - <property name="width_request">16</property> - <property name="height_request">88</property> - <property name="visible">True</property> - </widget> - <packing> - <property name="x">136</property> - </packing> - </child> - <child> - <widget class="GtkSpinButton" id="spinbutton3"> - <property name="width_request">56</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">1 0 255 1 10 10</property> - <property name="climb_rate">1</property> - </widget> - <packing> - <property name="x">152</property> - <property name="y">56</property> - </packing> - </child> - <child> - <widget class="GtkVSeparator" id="vseparator2"> - <property name="width_request">16</property> - <property name="height_request">88</property> - <property name="visible">True</property> - </widget> - <packing> - <property name="x">288</property> - </packing> - </child> - <child> - <widget class="GtkSpinButton" id="spinbutton4"> - <property name="width_request">56</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">1 0 255 1 10 10</property> - <property name="climb_rate">1</property> - </widget> - <packing> - <property name="x">304</property> - <property name="y">56</property> - </packing> - </child> - <child> - <widget class="GtkVSeparator" id="vseparator3"> - <property name="width_request">16</property> - <property name="height_request">88</property> - <property name="visible">True</property> - </widget> - <packing> - <property name="x">440</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label13"> - <property name="width_request">136</property> - <property name="height_request">17</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Flippers</property> - </widget> - <packing> - <property name="x">304</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label12"> - <property name="width_request">136</property> - <property name="height_request">17</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Beak</property> - </widget> - <packing> - <property name="x">152</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label11"> - <property name="width_request">136</property> - <property name="height_request">16</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Eyes</property> - </widget> - </child> - <child> - <widget class="GtkLabel" id="label14"> - <property name="width_request">136</property> - <property name="height_request">17</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Rotation</property> - </widget> - <packing> - <property name="x">456</property> - </packing> - </child> - <child> - <widget class="GtkSpinButton" id="spinbutton5"> - <property name="width_request">56</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">1 0 100 1 10 10</property> - <property name="climb_rate">1</property> - </widget> - <packing> - <property name="x">456</property> - <property name="y">56</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="radiobutton1"> - <property name="width_request">56</property> - <property name="height_request">24</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Open</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_eyes_open_toggled"/> - </widget> - <packing> - <property name="y">24</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="radiobutton2"> - <property name="width_request">57</property> - <property name="height_request">24</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Close</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <property name="group">radiobutton1</property> - <signal name="toggled" handler="on_eyes_close_toggled"/> - </widget> - <packing> - <property name="x">64</property> - <property name="y">24</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button4"> - <property name="width_request">72</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Blink</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_eyes_blink_bt_clicked"/> - </widget> - <packing> - <property name="x">64</property> - <property name="y">56</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="radiobutton3"> - <property name="width_request">56</property> - <property name="height_request">24</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Open</property> - <property name="use_underline">True</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_beak_open_toggled"/> - </widget> - <packing> - <property name="x">152</property> - <property name="y">24</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="radiobutton4"> - <property name="width_request">57</property> - <property name="height_request">24</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Close</property> - <property name="use_underline">True</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - <property name="group">radiobutton3</property> - <signal name="toggled" handler="on_rbeak_close_toggled"/> - </widget> - <packing> - <property name="x">216</property> - <property name="y">24</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button5"> - <property name="width_request">72</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Talk</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_beak_talk_bt_clicked"/> - </widget> - <packing> - <property name="x">216</property> - <property name="y">56</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="radiobutton5"> - <property name="width_request">41</property> - <property name="height_request">24</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Up</property> - <property name="use_underline">True</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_flippers_up_toggled"/> - </widget> - <packing> - <property name="x">304</property> - <property name="y">24</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="radiobutton6"> - <property name="width_request">57</property> - <property name="height_request">24</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Down</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <property name="group">radiobutton5</property> - <signal name="toggled" handler="on_flippers_down_toggled"/> - </widget> - <packing> - <property name="x">368</property> - <property name="y">24</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button6"> - <property name="width_request">72</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Flap</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_flippers_flap_bt_clicked"/> - </widget> - <packing> - <property name="x">368</property> - <property name="y">56</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="radiobutton8"> - <property name="width_request">61</property> - <property name="height_request">24</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Right</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_rrotation_right_toggled"/> - </widget> - <packing> - <property name="x">528</property> - <property name="y">24</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button12"> - <property name="width_request">72</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Spin</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_rotation_spin_bt_clicked"/> - </widget> - <packing> - <property name="x">520</property> - <property name="y">56</property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="radiobutton7"> - <property name="width_request">46</property> - <property name="height_request">24</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Left</property> - <property name="use_underline">True</property> - <property name="draw_indicator">True</property> - <property name="group">radiobutton8</property> - <signal name="toggled" handler="on_rotation_left_toggled"/> - </widget> - <packing> - <property name="x">456</property> - <property name="y">24</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - </widget> - </child> - <child> - <widget class="GtkLabel" id="label6"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Movements</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="hbox2"> - <property name="visible">True</property> - <child> - <widget class="GtkFrame" id="frame4"> - <property name="visible">True</property> - <property name="border_width">2</property> - <property name="label_xalign">0</property> - <property name="shadow_type">GTK_SHADOW_OUT</property> - <child> - <widget class="GtkAlignment" id="alignment4"> - <property name="visible">True</property> - <property name="left_padding">12</property> - <child> - <widget class="GtkFixed" id="fixed4"> - <property name="visible">True</property> - <child> - <widget class="GtkButton" id="button8"> - <property name="width_request">113</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Send command</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_scommand_bt_clicked"/> - </widget> - <packing> - <property name="y">38</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button7"> - <property name="width_request">113</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Tux Droid Shell</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_tdshell_bt_clicked"/> - </widget> - <packing> - <property name="y">4</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button9"> - <property name="width_request">113</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Check version</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_cversion_bt_clicked"/> - </widget> - <packing> - <property name="y">72</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button11"> - <property name="width_request">113</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Ping</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_ping_bt_clicked"/> - </widget> - <packing> - <property name="y">106</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - <child> - <widget class="GtkLabel" id="label7"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Tools</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - </child> - <child> - <widget class="GtkFrame" id="frame5"> - <property name="visible">True</property> - <property name="border_width">2</property> - <property name="label_xalign">0</property> - <property name="shadow_type">GTK_SHADOW_OUT</property> - <child> - <widget class="GtkAlignment" id="alignment5"> - <property name="visible">True</property> - <property name="left_padding">12</property> - <child> - <widget class="GtkFixed" id="fixed5"> - <property name="visible">True</property> - <child> - <widget class="GtkCheckButton" id="checkbutton3"> - <property name="width_request">85</property> - <property name="height_request">22</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Scrolling</property> - <property name="use_underline">True</property> - <property name="xalign">0.44999998807907104</property> - <property name="draw_indicator">True</property> - </widget> - <packing> - <property name="x">349</property> - </packing> - </child> - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow2"> - <property name="width_request">432</property> - <property name="height_request">95</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_NEVER</property> - <child> - <widget class="GtkTextView" id="textview1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="resize_mode">GTK_RESIZE_IMMEDIATE</property> - <property name="justification">GTK_JUSTIFY_FILL</property> - </widget> - </child> - </widget> - <packing> - <property name="y">24</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - <child> - <widget class="GtkLabel" id="label8"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Status</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">2</property> - </packing> - </child> - </widget> - <packing> - <property name="tab_expand">False</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">Main</property> - </widget> - <packing> - <property name="type">tab</property> - <property name="tab_expand">False</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <widget class="GtkVBox" id="vbox2"> - <property name="visible">True</property> - <child> - <widget class="GtkFrame" id="frame6"> - <property name="visible">True</property> - <property name="border_width">2</property> - <property name="label_xalign">0</property> - <property name="shadow_type">GTK_SHADOW_OUT</property> - <child> - <widget class="GtkAlignment" id="alignment6"> - <property name="visible">True</property> - <property name="left_padding">12</property> - <child> - <widget class="GtkFixed" id="fixed6"> - <property name="visible">True</property> - <child> - <widget class="GtkLabel" id="label17"> - <property name="width_request">96</property> - <property name="height_request">20</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Select voice</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="y">4</property> - </packing> - </child> - <child> - <widget class="GtkSpinButton" id="spinbutton6"> - <property name="width_request">56</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">100 100 250 1 10 10</property> - <property name="climb_rate">1</property> - </widget> - <packing> - <property name="x">112</property> - <property name="y">32</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label18"> - <property name="width_request">115</property> - <property name="height_request">20</property> - <property name="visible">True</property> - <property name="label" translatable="yes">Select pitch level</property> - <property name="wrap">True</property> - </widget> - <packing> - <property name="y">36</property> - </packing> - </child> - <child> - <widget class="GtkButton" id="button13"> - <property name="width_request">72</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Default</property> - <property name="use_underline">True</property> - <signal name="clicked" handler="on_tts_default_bt_clicked"/> - </widget> - <packing> - <property name="y">63</property> - </packing> - </child> - <child> - <widget class="GtkComboBoxEntry" id="comboboxentry1"> - <property name="width_request">187</property> - <property name="height_request">27</property> - <property name="visible">True</property> - <property name="items" translatable="yes">FR male + +<widget class="GtkWindow" id="window1"> + <property name="width_request">621</property> + <property name="height_request">403</property> + <property name="visible">True</property> + <property name="title" translatable="yes">Tux Droid Interface</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">False</property> + <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> + <property name="focus_on_map">True</property> + <property name="urgency_hint">False</property> + <signal name="destroy" handler="on_window1_destroy"/> + + <child> + <widget class="GtkNotebook" id="notebook1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_tabs">True</property> + <property name="show_border">True</property> + <property name="tab_pos">GTK_POS_TOP</property> + <property name="scrollable">False</property> + <property name="enable_popup">False</property> + + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkFrame" id="frame1"> + <property name="border_width">2</property> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <property name="label_yalign">0.5</property> + <property name="shadow_type">GTK_SHADOW_OUT</property> + + <child> + <widget class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">12</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkFixed" id="fixed1"> + <property name="visible">True</property> + + <child> + <widget class="GtkLabel" id="label10"> + <property name="width_request">166</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="label" transla... [truncated message content] |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-13 10:15:39
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 246 Added: api/python/trunk/tux.py api/python/trunk/tuxapi_class.py api/python/trunk/tuxapi_const.py Modified: Log: remi 2007-04-13 12:15:35 +0200 (Fri, 13 Apr 2007) 514 UPD Start of the version 0.2.0 of the api. The api was completely remade. I Kept the changes made by Neimad lately. Sorry for this brutal update. I have implemented the 'join()' suggestion from Damien for the threads too. Consequently, this api is not fully compatible with the last one. A documentation system based on the docstring has been implemented and you can build this with the function 'tux.misc.build_documentation'. See 'tux.misc.doc(tux.misc.build_documentation)'. See 'tux.misc.doc(tux)' too svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Added: api/python/trunk/tux.py =================================================================== --- api/python/trunk/tux.py (rev 0) +++ api/python/trunk/tux.py 2007-04-13 10:15:35 UTC (rev 246) @@ -0,0 +1,26 @@ +#!/usr/bin/python +# -*- coding: latin-1 -*- + +import sys +from tuxapi_const import * +import tuxapi_class +import tuxapi_wav_merger +import signal + +global tux +tux=tuxapi_class.TUXTCPCommunicator() +tux.misc.print_api_version() +wavs=tuxapi_wav_merger.WavMerger(tux) +tux.daemon.connect() +tux.tts.connect() +tux.daemon.set_my_client_name("Py Client") +tux.daemon.auto_connect(True) +tux.tts.auto_connect(True) +tux.print_warnings=True + +def exit(signum,frame): + tux.destroy() + sys.exit(signum) + +signal.signal(signal.SIGTERM, exit) +signal.signal(signal.SIGINT, exit) Added: api/python/trunk/tuxapi_class.py =================================================================== --- api/python/trunk/tuxapi_class.py (rev 0) +++ api/python/trunk/tuxapi_class.py 2007-04-13 10:15:35 UTC (rev 246) @@ -0,0 +1,4291 @@ +#!/usr/bin/python + +# ----------------------------------------------------------------------------- +# Tux Droid - API Class +# Copyright (C) 2007 C2ME Sa <rem...@c2...> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# ----------------------------------------------------------------------------- +# $Id: tuxapi_class.py 192 2007-03-22 14:25:37Z remi $ +# ----------------------------------------------------------------------------- + +import sys +import os +import time +import socket +import thread +import threading +import string +from tuxapi_const import * + +#============================================================================== +# Constants +#============================================================================== + +api_version ="0.2.0 (SVN/UNRELEASED)" + +#============================================================================== +# TUXTCPCommunicator class +#============================================================================== +class TUXTCPCommunicator(object): + """ + Main class of tux object + + Sub class of this class: + "cmd" as class : Class which manages the tux commands + "daemon" as class : Class which manages the daemon commands + "event" as class : Class which manages the events + "hw" as class : Class which manages the tux hardware + "misc" as class : Class which manages the miscellaneous + functions + "status" as class : Class which manages the request of a + status + "sys" as class : Class which manages the system functions + "tts" as class : Class which manages the text to speech + + Global variables of this class: + "my_name" as string : Name of the api instance + "print_status" as boolean : Allow to print the raw statuses + "print_warnings" as boolean : Allow to print the warnings + + Comments: + Call the destroying function at the end of your script for closing + the api correctly. + >>> tux.destroy() + """ + #-------------------------------------------------------------------------- + # Constructor of class + #-------------------------------------------------------------------------- + def __init__(self,deprecated_p=5000,deprecated_a='localhost'): + """ + Constructor of class + + Example: + >>> tux=TUXTCPCommunicator() + """ + self.main_thread_list=[] + self.exit_flag=False + self.tcp_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=False + self.print_debug_thread=False + self.event=TUXevent(self) + self.cmd=TUXcmd(self) + self.sys=TUXsys(self) + self.daemon=TUXdaemon(self) + self.sdaemon=self.daemon + self.status=TUXStatus(self) + self.hw=TUXhw(self) + 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() + self.main_thread_list.append(t) + t=threading.Thread(target=self.tts._loop_auto_connect) + t.setName('tts._loop_auto_connect') + t.start() + self.main_thread_list.append(t) + + #-------------------------------------------------------------------------- + # Destructor of class + #-------------------------------------------------------------------------- + def destroy(self): + self.daemon.auto_connect(False) + self.tts.auto_connect(False) + self.daemon.disconnect() + self.tts.disconnect() + self.daemon._tcp_threads_join() + self.tts._tcp_threads_join() + self.exit_flag=True + for main_thread in self.main_thread_list: + if self.print_debug_thread: + print "'%s' has been released"%main_thread.getName() + if main_thread.isAlive(): + main_thread.join() + self=None + print "Tux object has been destroyed" + + #-------------------------------------------------------------------------- + # SYSTEM function + #-------------------------------------------------------------------------- + def _loop_tux_tcp_msg(self): + """ + Not a user function + """ + 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 + 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_tux_data_dispatching(self): + """ + Not a user function + """ + while self.daemon.connected: + while self.datas_threated: + if not self.daemon.connected: return + time.sleep(0.003) + self.tcp_mutex.acquire() + data=self.tcp_data + self.tcp_mutex.release() + self._dispatch_data_main(data) + self.datas_threated=True + + #-------------------------------------------------------------------------- + # SYSTEM function + #-------------------------------------------------------------------------- + def _dispatch_data_main(self,data): + """ + Not a user function + """ + # from daemon + if ord(data[0])==SOURCE_SUB_DAEMON: + self._dispatch_data_from_daemon(data) + # from tux droid + if ord(data[0])==SOURCE_TUX: + self._dispatch_data_from_tux(data) + + #-------------------------------------------------------------------------- + # SYSTEM function + #-------------------------------------------------------------------------- + def _dispatch_data_from_daemon(self,data): + """ + Not a user function + """ + # data type command + if ord(data[2])==DATA_TP_CMD: + if ord(data[3])==SUBDATA_TP_STRUCT: + # daemon close + if ord(data[4])==SUB_D_CMD_STRUC_DISCONNECT_CLIENT: + self.daemon.disconnect() + + #-------------------------------------------------------------------------- + # SYSTEM function + #-------------------------------------------------------------------------- + def _dispatch_data_from_tux(self,data): + """ + Not a user function + """ + # data type response + if ord(data[2])==DATA_TP_RSP: + if ord(data[3])==SUBDATA_TP_STATUS: + if self.event.on_status!=None: + self.event.on_status() + #Head button + if ord(data[4])==DATAS_STATUS_HEAD_PUSH_SWITCH: + if ord(data[5])==1: + if self.event.on_head_bt_pushed!=None: + self.event.on_head_bt_pushed() + if self.event.on_bt_pushed!=None: + self.event.on_bt_pushed() + else: + if self.event.on_head_bt_released!=None: + self.event.on_head_bt_released() + if self.event.on_bt_released!=None: + self.event.on_bt_released() + #Left wing button + if ord(data[4])==DATAS_STATUS_LEFT_WING_PUSH: + if ord(data[5])==1: + if self.event.on_lwing_bt_pushed!=None: + self.event.on_lwing_bt_pushed() + if self.event.on_bt_pushed!=None: + self.event.on_bt_pushed() + else: + if self.event.on_lwing_bt_released!=None: + self.event.on_lwing_bt_released() + if self.event.on_bt_released!=None: + self.event.on_bt_released() + #Right wing button + if ord(data[4])==DATAS_STATUS_RIGHT_WING_PUSH: + if ord(data[5])==1: + if self.event.on_rwing_bt_pushed!=None: + self.event.on_rwing_bt_pushed() + if self.event.on_bt_pushed!=None: + self.event.on_bt_pushed() + else: + if self.event.on_rwing_bt_released!=None: + self.event.on_rwing_bt_released() + if self.event.on_bt_released!=None: + self.event.on_bt_released() + #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])]() + if self.event.on_remote!=None: + self.event.on_remote(ord(data[5])) + #Mouth open + if ord(data[4])==DATAS_STATUS_MOUTH_OPEN_POSITION: + if ord(data[5])==0: + if self.event.on_mouth_open!=None: + self.event.on_mouth_open() + #Mouth close + if ord(data[4])==DATAS_STATUS_MOUTH_CLOSED_POSITION: + if ord(data[5])==0: + if self.event.on_mouth_close!=None: + self.event.on_mouth_close() + #Ledl + if ord(data[4])==DATAS_STATUS_LEFT_BLUE_LED: + if ord(data[5])==1: + if self.event.on_left_blue_led_on!=None: + self.event.on_left_blue_led_on() + else: + if self.event.on_left_blue_led_off!=None: + self.event.on_left_blue_led_off() + #Ledr + if ord(data[4])==DATAS_STATUS_RIGHT_BLUE_LED: + if ord(data[5])==1: + if self.event.on_right_blue_led_on!=None: + self.event.on_right_blue_led_on() + else: + if self.event.on_right_blue_led_off!=None: + self.event.on_right_blue_led_off() + #Eyes open/close + if ord(data[4])==DATAS_STATUS_EYES_CLOSED_POSITION_SWITCH: + if ord(data[5])==0: + if self.event.on_eyes_close!=None: + self.event.on_eyes_close() + else: + if self.event.on_eyes_open!=None: + self.event.on_eyes_open() + #Power plug switch + if ord(data[4])==DATAS_STATUS_POWER_PLUG_SWITCH: + if ord(data[5])==1: + if self.event.on_power_plugged!=None: + self.event.on_power_plugged() + else: + if self.event.on_power_unplugged!=None: + self.event.on_power_unplugged() + #RF status + if ord(data[4])==DATAS_STATUS_RF_CONNECTED: + if ord(data[5])==1: + self.status.rf_connected=True + if self.event.on_rf_connected!=None: + self.event.on_rf_connected() + else: + self.status.rf_connected=False + if self.event.on_rf_disconnected!=None: + self.event.on_rf_disconnected() + #PONG + if ord(data[4])==DATAS_STATUS_PONG: + if self.event.on_pong_received!=None: + rcv=ord(data[6]) + rem=ord(data[5]) + avg=int((100*rcv)/(200-rem)) + self.event.on_pong_received(rcv,rem,avg) + #mouth stop + if ord(data[4])==DATAS_STATUS_MOUTH_POSITION_COUNTER: + if ord(data[5])==0: + if self.event.on_mouth_stop!=None: + self.event.on_mouth_stop() + #eyes stop + if ord(data[4])==DATAS_STATUS_EYES_POSITION_COUNTER: + if ord(data[5])==0: + if self.event.on_eyes_stop!=None: + self.event.on_eyes_stop() + + #wings stop + if ord(data[4])==DATAS_STATUS_WINGS_POSITION_COUNTER: + if ord(data[5])==0: + if self.event.on_wings_stop!=None: + self.event.on_wings_stop() + #spin stop + if ord(data[4])==DATAS_STATUS_SPIN_POSITION_COUNTER: + if ord(data[5])==0: + if self.event.on_spin_stop!=None: + self.event.on_spin_stop() + + + #-------------------------------------------------------------------------- + # Deprecated functions + #-------------------------------------------------------------------------- + def explicit_status(self): + """ + Deprecated : see 'tux.status.to_string' + """ + return self.status.to_string() + + def connect_to_daemon(self): + """ + Deprecated : see 'tux.daemon.connect' + """ + return self.daemon.connect() + + def disconnect_from_daemon(self): + """ + Deprecated : see 'tux.daemon.disconnect' + """ + self.daemon.disconnect() + + +#============================================================================== +# TUXTCPCommunicator - sys - class +#============================================================================== +class TUXsys(object): + """ + Class which manages the system functions + + Functions list for the users: + tux.sys.add_time_event + tux.sys.clear_time_events + tux.sys.delayed_function + tux.sys.looped_function + tux.sys.shell + tux.sys.shell_free + tux.sys.time + tux.sys.wait + """ + + #-------------------------------------------------------------------------- + # Constructor of class + #-------------------------------------------------------------------------- + def __init__(self,parent): + """ + Constructor of class + """ + self.parent=parent + self.events_list=[[0,'NONE',9999,99,99,99,99,99]] + + #-------------------------------------------------------------------------- + # Get the current time in seconds + #-------------------------------------------------------------------------- + def time(self): + """ + Get the current time in seconds + + Return an integer + + Example: + >>> var=tux.sys.time() + """ + return (time.localtime()[3]*3600)+(time.localtime()[4]*60)+time.localtime()[5] + + #-------------------------------------------------------------------------- + # Wait a time in seconds + #-------------------------------------------------------------------------- + def wait(self,seconds): + """ + Wait a time in seconds + + Parameters: + "seconds" as float : Time to wait in seconds + + Example: + >>> tux.sys.wait(2.4) + """ + time.sleep(seconds) + + #-------------------------------------------------------------------------- + # Execute a shell command + #-------------------------------------------------------------------------- + def shell(self,command): + """ + Execute a shell command + + Parameters: + "command" as string : Shell command + + Example: + >>> tux.sys.shell('ls -al') + """ + os.system(command) + + #-------------------------------------------------------------------------- + # Execute a shell command in free mode + #-------------------------------------------------------------------------- + def shell_free(self,command): + """ + Execute a shell command in free mode + + Parameters: + "command" as string : Shell command + + Example: + >>> 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 + #-------------------------------------------------------------------------- + def add_time_event(self,cmd_type,cmd,year,month,day,hour,minute,second): + """ + Add a time event in the time event handler + + Parameters: + "cmd_type" as number : Command type (CT_SHELL|CT_FUNCTION) + "cmd" as string : Command to execute + "year" as integer : (ex : 2006) (9999 : parameter ignored) + "month" as integer : (ex : 12) (99 : parameter ignored) + "day" as integer : (ex : 23) (99 : parameter ignored) + "hour" as integer : (ex : 08) (99 : parameter ignored) + "minute" as integer : (ex : 55) (99 : parameter ignored) + "second" as integer : (ex : 30) (99 : parameter ignored) + + Example: + >>> tux.sys.add_time_event(CT_SHELL,'xmms',9999,99,99,8,5,0) + """ + self.events_list.append([cmd_type,cmd,year,month,day,hour,minute,second]) + + #-------------------------------------------------------------------------- + # Clear the time events of the time event handler + #-------------------------------------------------------------------------- + def clear_time_events(self): + """ + Clear the time events of the time event handle + + Example: + >>> tux.sys.clear_time_events() + """ + self.events_list=[[0,'NONE',9999,99,99,99,99,99]] + + #-------------------------------------------------------------------------- + # Not a user function + #-------------------------------------------------------------------------- + def _loop_time_events(self): + """ + Not a user function + """ + def event_due(event): + now = time.localtime() + return event[2] in [now[0], 9999]\ + and event[3] in [now[1], 99]\ + and event[4] in [now[2], 99]\ + and event[5] in [now[3], 99]\ + and event[6] in [now[4], 99]\ + and event[7] in [now[5], 99] + + while self.parent.daemon.connected: + for event in self.events_list: + if event[0]!=0 and event_due(event): + if event[0]==CT_SHELL: + self.shell_free(event[1]) + elif event[0]==CT_FUNCTION: + event[1]() + time.sleep(1) + + #-------------------------------------------------------------------------- + # To execute a function with a delay + #-------------------------------------------------------------------------- + def delayed_function(self,function,delay): + """ + To execute a function with a delay + + Parameters: + "function" as pointer of function : function to execute + "delay" as float : time to wait before executing + the function. In seconds + + Example: + >>> def test(): + ... print "hello world" + ... + >>> tux.sys.delayed_function(test,10) + """ + def _funct(function,delay): + self.wait(delay) + function() + + t=threading.Thread(target=_funct,args=(function,delay,)) + t.setName('sys.delayed_function') + t.start() + self.parent.daemon.free_thread_list.append(t) + + #-------------------------------------------------------------------------- + # Looping on a function with a delay + #-------------------------------------------------------------------------- + def looped_function(self,function,delay): + """ + Looping on a function with a delay + + Parameters: + "function" as pointer of function: function to execute + "delay" as float : time to wait between 2 executions + of the function. In seconds + + Example: + >>> def test(): + ... print "hello world" + ... return True + ... + >>> tux.sys.looped_function(test,10) + + Comment: + While the return of the function is true, the loop remains + active + """ + def _funct(function,delay): + while not self.parent.exit_flag: + self.wait(delay) + if not function(): + return + t=threading.Thread(target=_funct,args=(function,delay,)) + t.setName('sys.temporized_function') + t.start() + self.parent.main_thread_list.append(t) + +#============================================================================== +# TUXTCPCommunicator - event - class +#============================================================================== +class TUXevent(object): + """ + Class which manages the events + + Global variables of this class: + "on_bt_pushed" as pof : On tux button pushed + "on_head_bt_pushed" as pof : On tux head button pushed + "on_lwing_bt_pushed" as pof : On tux left wing button pushed + "on_rwing_bt_pushed" as pof : On tux right wing button pushed + "on_bt_released" as pof : On tux button released + "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 tuple of pof : On remote controller button pressed + param 1 : Key as integer + "on_status" as pof : On status arrival + "on_remote" as pof : On remote controller event + "on_light_level" as pof : On light level event + param 1 : light value as integer + "on_connected" as pof : On api connected to tuxdaemon + "on_disconnected" as pof : On api disconnect from tuxdaemon + "on_mouth_open" as pof : On mouth open event + "on_mouth_close" as pof : On mouth close event + "on_power_plugged" as pof : On power plugged event + "on_power_unplugged" as pof : On power unplugged event + "on_left_blue_led_on" as pof : On left blue led changed to on + "on_left_blue_led_off" as pof : On left blue led changed to off + "on_right_blue_led_on" as pof : On right blue led changed to on + "on_right_blue_led_off" as pof : On right blue led changed to off + "on_eyes_open" as pof : On eyes open event + "on_eyes_close" as pof : On eyes close event + "on_rf_connected" as pof : On RF is connected + "on_rf_disconnected" as pof : On RF is disconnected + "on_pong_received" as pof : On pong status received + "on_mouth_stop" as pof : On mouth stop event + "on_eyes_stop" as pof : On eyes stop event + "on_wings_stop" as pof : On wings stop event + "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_bt=my_function + + Key constants of the remote controller: + (K_0,K_1,K_2,K_3,K_4,K_5,K_6,K_7,K_8,K_9,K_STANDBY, + K_MUTE,K_VOLUMEPLUS,K_VOLUMEMINUS,K_ESCAPE,K_YES, + K_NO,K_BACKSPACE,K_STARTVOIP,K_RECEIVECALL,K_HANGUP, + K_STAR,K_SHARP,K_RED,K_GREEN,K_BLUE,K_YELLOW, + K_CHANNELPLUS,K_CHANNELMINUS,K_UP,K_DOWN,K_LEFT, + K_RIGHT,K_OK,K_FASTREWIND,K_FASTFORWARD,K_PLAYPAUSE, + K_STOP,K_RECORDING,K_PREVIOUS,K_NEXT,K_MENU,K_MOUSE, + K_ALT) + + Functions list: + tux.event.clear + tux.event.remote_key_to_string + tux.event.restore + tux.event.store + tux.event.wait_bt_pushed + tux.event.wait_head_bt_pushed + tux.event.wait_head_bt_released + tux.event.wait_lwing_bt_pushed + tux.event.wait_lwing_bt_released + tux.event.wait_remote_bt + tux.event.wait_rwing_bt_pushed + tux.event.wait_rwing_bt_released + tux.event.wait_stable_status + tux.event.wait_status + """ + #-------------------------------------------------------------------------- + # Constructor of class + #-------------------------------------------------------------------------- + def __init__(self,parent): + """ + Constructor of class + """ + self.parent=parent + self.clear() + + #-------------------------------------------------------------------------- + # Get the string name of a remote key value + #-------------------------------------------------------------------------- + def remote_key_to_string(self,key): + """ + Get the string name of a remote key value + + Parameters: + "key" as integer : key to translate to string + + Return a string + + Example: + >>> print tux.event.remote_key_to_string(10) + """ + return remote_bt_name[key] + + #-------------------------------------------------------------------------- + # Clear all events + #-------------------------------------------------------------------------- + def clear(self): + """ + Clear all events + + Example: + >>> tux.event.clear() + """ + self.on_bt_pushed=None + self.on_head_bt_pushed=None + self.on_lwing_bt_pushed=None + self.on_rwing_bt_pushed=None + self.on_bt_released=None + self.on_head_bt_released=None + self.on_lwing_bt_released=None + self.on_rwing_bt_released=None + self.on_remote_bt=[None]*64 + self.on_status=None + self.on_remote=None + self.on_light_level=None + self.on_connected=None + self.on_disconnected=None + self.on_mouth_open=None + self.on_mouth_close=None + self.on_power_plugged=None + self.on_power_unplugged=None + self.on_left_blue_led_on=None + self.on_left_blue_led_off=None + self.on_right_blue_led_on=None + self.on_right_blue_led_off=None + self.on_eyes_open=None + self.on_eyes_close=None + self.on_rf_connected=None + self.on_rf_disconnected=None + self.on_pong_received=None + self.on_mouth_stop=None + self.on_eyes_stop=None + self.on_wings_stop=None + self.on_spin_stop=None + + #-------------------------------------------------------------------------- + # Store all events + #-------------------------------------------------------------------------- + def store(self): + """ + Store all events + + 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 + + #-------------------------------------------------------------------------- + # Restore all events + #-------------------------------------------------------------------------- + def restore(self): + """ + Restore all events + + 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 + + #-------------------------------------------------------------------------- + # Wait until the specified status arrives + #-------------------------------------------------------------------------- + def wait_status(self,DATA_STATUS,DATA_VALUE,time_out): + """ + Wait until the specified status arrives + + Parameters: + "DATA_STATUS" as integer : Desired status + "DATA_VALUE" as integer : Desired value + "time_out" as integer : Time-out in seconds + (9999 = infinite wait) + + Return a boolean + + Example: + >>> 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: + 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) + + #-------------------------------------------------------------------------- + # Wait for stable status + #-------------------------------------------------------------------------- + def wait_stable_status(self,DATA_STATUS,DATA_VALUE,stable_time,time_out): + """ + Wait for stable status + + Parameters: + "DATA_STATUS" as integer : Desired status + "DATA_VALUE" as integer : Desired value + "time_out" as integer : Time-out in seconds + (9999 = infinite wait) + "stable_out" as integer : Time of stable status request in seconds + + Return a boolean + + Example: + >>> var=tux.event.wait_status(DATAS_STATUS_HEAD_PUSH_SWITCH,1,5,2) + """ + if self.wait_status(DATA_STATUS,DATA_VALUE,time_out)==False: + return False + else: + if DATA_VALUE==1: + INV_DATA_VALUE=0 + else: + INV_DATA_VALUE=1 + return not self.wait_status(DATA_STATUS,INV_DATA_VALUE,stable_time) + + #-------------------------------------------------------------------------- + # Wait until a tux button is pushed + #-------------------------------------------------------------------------- + def wait_bt_pushed(self,time_out): + """ + Wait until a tux button is pushed + + Parameters: + "time_out" as integer : Time-out in seconds + (9999 = infinite wait) + + Return the button value as integer + (HEAD_BT|LEFT_WING_BT|RIGHT_WING_BT|NONE_BT) + + 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) + + #-------------------------------------------------------------------------- + # Wait until head button is pushed + #-------------------------------------------------------------------------- + def wait_head_bt_pushed(self,time_out): + """ + Wait until head button is pushed + + Parameters: + "time_out" as integer : Time-out in seconds + (9999 = infinite wait) + + Return a boolean + + Example: + >>> tux.event.wait_head_bt_pushed(2) + """ + return self.wait_status(DATAS_STATUS_HEAD_PUSH_SWITCH,1,time_out) + + #-------------------------------------------------------------------------- + # Wait until head button is released + #-------------------------------------------------------------------------- + def wait_head_bt_released(self): + """ + Wait until head button is released + + Parameters: + "time_out" as integer : Time-out in seconds + (9999 = infinite wait) + + Return a boolean + + Example: + >>> tux.event.wait_head_bt_released(2) + """ + return self.wait_status(DATAS_STATUS_HEAD_PUSH_SWITCH,0,9999) + + #-------------------------------------------------------------------------- + # Wait until left wing is pushed + #-------------------------------------------------------------------------- + def wait_lwing_bt_pushed(self,time_out): + """ + Wait until left wing is pushed + + Parameters: + "time_out" as integer : Time-out in seconds + (9999 = infinite wait) + + Return a boolean + + Example: + >>> tux.event.wait_lwing_bt_pushed(2) + """ + return self.wait_status(DATAS_STATUS_LEFT_WING_PUSH,1,time_out) + + #-------------------------------------------------------------------------- + # Wait until left wing is released + #-------------------------------------------------------------------------- + def wait_lwing_bt_released(self): + """ + Wait until left wing is released + + Parameters: + "time_out" as integer : Time-out in seconds + (9999 = infinite wait) + + Return a boolean + + Example: + >>> tux.event.wait_lwing_bt_released(2) + """ + return self.wait_status(DATAS_STATUS_LEFT_WING_PUSH,0,9999) + + #-------------------------------------------------------------------------- + # Wait until right wing is pushed + #-------------------------------------------------------------------------- + def wait_rwing_bt_pushed(self,time_out): + """ + Wait until right wing is pushed + + Parameters: + "time_out" as integer : Time-out in seconds + (9999 = infinite wait) + + Return a boolean + + Example: + >>> tux.event.wait_rwing_bt_pushed(2) + """ + return self.wait_status(DATAS_STATUS_RIGHT_WING_PUSH,1,time_out) + + #-------------------------------------------------------------------------- + # Wait until right wing is released + #-------------------------------------------------------------------------- + def wait_rwing_bt_released(self): + """ + Wait until right wing is released + + Parameters: + "time_out" as integer : Time-out in seconds + (9999 = infinite wait) + + Return a boolean + + Example: + >>> tux.event.wait_rwing_bt_released(2) + """ + return self.wait_status(DATAS_STATUS_RIGHT_WING_PUSH,0,9999) + + #-------------------------------------------------------------------------- + # Wait until a specified key of the remote is pressed + #-------------------------------------------------------------------------- + def wait_remote_bt(self,remote_key,timeout): + """ + Wait until a specified key of the remote is pressed + + Parameters: + "time_out" as integer : Time-out in seconds + (9999 = infinite wait) + + Return a boolean + + Example: + >>> tux.event.wait_remote_bt(K_OK,2) + """ + return self.wait_status(DATAS_STATUS_IR_CODE,remote_key,timeout) + + + #-------------------------------------------------------------------------- + # Deprecated functions + #-------------------------------------------------------------------------- + def set_on_bt_pushed(self,function): + """ + Deprecated + """ + self.on_bt_pushed=function + def set_on_head_bt_pushed(self,function): + """ + Deprecated + """ + self.on_head_bt_pushed=function + def set_on_lwing_bt_pushed(self,function): + """ + Deprecated + """ + self.on_lwing_bt_pushed=function + def set_on_rwing_bt_pushed(self,function): + """ + Deprecated + """ + self.on_rwing_bt_pushed=function + def set_on_bt_released(self,function): + """ + Deprecated + """ + self.on_bt_released=function + def set_on_head_bt_released(self,function): + """ + Deprecated + """ + self.on_head_bt_released=function + def set_on_lwing_bt_released(self,function): + """ + Deprecated + """ + self.on_lwing_bt_released=function + def set_on_rwing_bt_released(self,function): + """ + Deprecated + """ + self.on_rwing_bt_released=function + def set_on_remote_bt(self,key,function): + """ + Deprecated + """ + self.on_remote_bt[key]=function + +#============================================================================== +# TUXTCPCommunicator - cmd - class +#============================================================================== +class TUXcmd(object): + """ + Class which manages the tux commands + + Global variables of this class: + "last_ack" as integer : ACK value of the last command + (ACK_CMD_DONGLE_NOT_PRESENT|ACK_CMD_TIMEOUT| + ACK_CMD_OK|ACK_CMD_KO|ACK_CMD_ERROR) + "no_ack" as boolean : Allow to wait a ACK from tuxdaemon + + Functions list for the users: + tux.cmd.audio_channel_general + tux.cmd.audio_channel_tts + tux.cmd.eyes_close + tux.cmd.eyes_off + tux.cmd.eyes_on + tux.cmd.eyes_on_free + tux.cmd.eyes_open + tux.cmd.ir_off + tux.cmd.ir_on + tux.cmd.ir_send + tux.cmd.ledl_during + tux.cmd.ledl_during_free + tux.cmd.ledl_off + tux.cmd.ledl_on + tux.cmd.ledr_during + tux.cmd.ledr_during_free + tux.cmd.ledr_off + tux.cmd.ledr_on + tux.cmd.leds_blink + tux.cmd.leds_during + tux.cmd.leds_during_free + tux.cmd.leds_off + tux.cmd.leds_on + tux.cmd.mouth_close + tux.cmd.mouth_off + tux.cmd.mouth_on + tux.cmd.mouth_on_free + tux.cmd.mouth_open + tux.cmd.ping + tux.cmd.raw + tux.cmd.sleep_off + tux.cmd.sleep_on + tux.cmd.sound_play + tux.cmd.sound_store_index + tux.cmd.sound_storing + tux.cmd.sound_test + tux.cmd.spinl_off + tux.cmd.spinl_on + tux.cmd.spinl_on_free + tux.cmd.spinr_off + tux.cmd.spinr_on + tux.cmd.spinr_on_free + tux.cmd.structured + tux.cmd.wings_off + tux.cmd.wings_on + tux.cmd.wings_on_free + """ + + #-------------------------------------------------------------------------- + # Constructor of class + #-------------------------------------------------------------------------- + def __init__(self,parent): + """ + Constructor of class + """ + self.parent=parent + self.last_ack=ACK_CMD_OK + self.no_ack=False + + #-------------------------------------------------------------------------- + # SYSTEM + #-------------------------------------------------------------------------- + def cmd_ack(self): + """ + 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) + + #-------------------------------------------------------------------------- + # Send a structured command to tux + #-------------------------------------------------------------------------- + def structured(self,fct,cmd,param1,param2,param3): + """ + Send a structured command to tux + + Parameters: + "fct" as integer : function of tux + "cmd" as integer : command for this function + "param1" as integer : parameter 1 for this command + "param2" as integer : parameter 2 for this command + "param3" as integer : parameter 3 for this command + + Return a ACK as integer + + Example: + >>> tux.cmd.structured(TUX_CMD_STRUCT_EYES,TUX_CMD_STRUCT_SUB_ON + ,count,0,0) + """ + if not self.parent.daemon.connected: + return 2 + data=(DEST_TUX,SD_DEFAULT,DATA_TP_CMD,SUBDATA_TP_STRUCT\ + ,fct,cmd,param1,param2,param3,0,0,0,0,0,0,0) + self.parent.sock.send("".join( [chr(x) for x in data] )) + if self.no_ack: + return 2 + else: + return self.cmd_ack() + + #-------------------------------------------------------------------------- + # Send a raw command to tux + #-------------------------------------------------------------------------- + def raw(self,cmd,param1,param2,param3): + """ + Send a raw command to tux + + Parameters: + "cmd" as integer : command + "param1" as integer : parameter 1 of these command + "param2" as integer : parameter 2 of these command + "param3" as integer : parameter 3 of these command + + Return a ACK if it's required + + Example: + >>> tux.cmd.raw(BLINK_EYES_CMD,4,0,0) + """ + if not self.parent.daemon.connected: + return 2 + data=(DEST_TUX,SD_DEFAULT,DATA_TP_CMD,SUBDATA_TP_RAW,\ + cmd,param1,param2,param3,0,0,0,0,0,0,0,0) + self.parent.sock.send("".join( [chr(x) for x in data] )) + if self.no_ack: + return 2 + else: + return self.cmd_ack() + + #-------------------------------------------------------------------------- + # Send a command to tux for moving the eyes + #-------------------------------------------------------------------------- + def eyes_on(self,count=1): + """ + Send a command to tux for moving the eyes + + Parameters: + "count" as integer : Number of movements + (default = 1) + + Example: + >>> tux.cmd.eyes_on() + >>> tux.cmd.eyes_on(2) + """ + self.last_ack=self.structured(TUX_CMD_STRUCT_EYES,TUX_CMD_STRUCT_SUB_ON,count,0,0) + self.parent.event.wait_status(DATAS_STATUS_EYES_POSITION_COUNTER,0,(0.3*count)) + + #-------------------------------------------------------------------------- + # Send a command to tux for opening the eyes + #-------------------------------------------------------------------------- + def eyes_open(self): + """ + Send a command to tux for opening the eyes + + Example: + >>> tux.cmd.eyes_open() + """ + if self.parent.status.get_eyes_closed_position_switch()==0: + self.eyes_on() + + #-------------------------------------------------------------------------- + # Send a command to tux for closing the eyes + #-------------------------------------------------------------------------- + def eyes_close(self): + """ + Send a command to tux for closing the eyes + + Example: + >>> tux.cmd.eyes_close() + """ + if self.parent.status.get_eyes_closed_position_switch()==1: + self.eyes_on() + + #-------------------------------------------------------------------------- + # Send a command to tux for moving the eyes in free mode + #-------------------------------------------------------------------------- + def eyes_on_free(self,count=1): + """ + Send a command to tux for moving the eyes in free mode + + Parameters: + "count" as integer : number of movements + (default = 1) + + Example: + >>> tux.cmd.eyes_on_free() + >>> tux.cmd.eyes_on_free(2) + """ + t=threading.Thread(target=self.eyes_on,args=(count,)) + t.setName('cmd.eyes_on') + t.start() + self.parent.daemon.free_thread_list.append(t) + + #-------------------------------------------------------------------------- + # Send a command to tux for stopping the eyes movement + #-------------------------------------------------------------------------- + def eyes_off(self): + """ + Send a command to tux for stopping the eyes movement + + Example: + >>> tux.cmd.eyes_off() + """ + self.last_ack=self.structured(TUX_CMD_STRUCT_EYES,TUX_CMD_STRUCT_SUB_OFF,0,0,0) + + #-------------------------------------------------------------------------- + # Send a command to tux for moving the mouth + #-------------------------------------------------------------------------- + def mouth_on(self,count=1): + """ + Send a command to tux for moving the mouth + + Parameters: + "count" as integer : number of movements + (default = 1) + + Example: + >>> tux.cmd.mouth_on() + >>> tux.cmd.mouth_on(2) + """ + self.last_ack=self.structured(TUX_CMD_STRUCT_MOUTH,TUX_CMD_STRUCT_SUB_ON,count,0,0) + self.parent.event.wait_status(DATAS_STATUS_MOUTH_POSITION_COUNTER,0,(0.3*count)) + + #-------------------------------------------------------------------------- + # Send a command to tux for moving the mouth in free mode + #-------------------------------------------------------------------------- + def mouth_on_free(self,count=1): + """ + Send a command to tux for moving the mouth in free mode + + Parameters: + "count" as integer : number of movements + (default = 1) + + Example: + >>> tux.cmd.mouth_on_free() + >>> tux.cmd.mouth_on_free(2) + """ + t=threading.Thread(target=self.mouth_on,args=(count,)) + t.setName('cmd.mouth_on') + t.start() + self.parent.daemon.free_thread_list.append(t) + + #-------------------------------------------------------------------------- + # Send a command to tux for opening the mouth + #-------------------------------------------------------------------------- + def mouth_open(self): + """ + Send a command to tux for opening the mouth + + Example: + >>> tux.cmd.mouth_open() + """ + if self.parent.status.get_mouth_open_position()==1: + self.mouth_on() + + #-------------------------------------------------------------------------- + # Send a command to tux for closing the mouth + #-------------------------------------------------------------------------- + def mouth_close(self): + """ + Send a command to tux for closing the mouth + + Example: + >>> tux.cmd.mouth_close() + """ + if self.parent.status.get_mouth_open_position()==0: + self.mouth_on() + + #-------------------------------------------------------------------------- + # Send a command to tux for stopping the mouth movement + #-------------------------------------------------------------------------- + def mouth_off(self): + """ + Send a command to tux for stopping the mouth movement + + Example: + >>> tux.cmd.mouth_off() + """ + self.last_ack=self.structured(TUX_CMD_STRUCT_MOUTH,TUX_CMD_STRUCT_SUB_OFF,0,0,0) + + #-------------------------------------------------------------------------- + # Send a command to tux for moving the wings + #-------------------------------------------------------------------------- + def wings_on(self,count=1,speed=5): + """ + Send a command to tux for moving the wings + + Parameters: + "count" as integer : number of movements + (default = 1) + "speed" as integer : speed of the movement(1-5) + (default = 5) + + Example: + >>> tux.cmd.wings_on() + >>> tux.cmd.wings_on(2) (2 movements) + >>> tux.cmd.wings_on(2,5) (2 movements and speed=5) + """ + self.last_ack=self.structured(TUX_CMD_STRUCT_WINGS,\ + TUX_CMD_STRUCT_SUB_ON,count,speed,0) + self.parent.event.wait_status(DATAS_STATUS_WINGS_POSITION_COUNTER\ + ,0,(0.6*count)) + + #-------------------------------------------------------------------------- + # Send a command to tux for moving the wings in free mode + #-------------------------------------------------------------------------- + def wings_on_free(self,count=1,speed=5): + """ + Send a command to tux for moving the wings in free mode + + Parameters: + "count" as integer : number of movem... [truncated message content] |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-13 10:14:11
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 245 Removed: api/python/trunk/tux.py api/python/trunk/tuxapi_class.py api/python/trunk/tuxapi_const.py Modified: Log: remi 2007-04-13 12:14:08 +0200 (Fri, 13 Apr 2007) 514 UPD Start of the version 0.2.0 of the api. The api was completely remade. I Kept the changes made by Neimad lately. Sorry for this brutal update. I have implemented the 'join()' suggestion from Damien for the threads too. Consequently, this api is not fully compatible with the last one. A documentation system based on the docstring has been implemented and you can build this with the function 'tux.misc.build_documentation'. See 'tux.misc.doc(tux.misc.build_documentation)'. See 'tux.misc.doc(tux)' too svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Deleted: api/python/trunk/tux.py =================================================================== --- api/python/trunk/tux.py 2007-04-13 09:28:15 UTC (rev 244) +++ api/python/trunk/tux.py 2007-04-13 10:14:08 UTC (rev 245) @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: latin-1 -*- - -import sys -from tuxapi_const import * -import tuxapi_class -import tuxapi_wav_merger -import signal - -global tux -tux=tuxapi_class.TUXTCPCommunicator(5000, "localhost") -tux.print_api_version() -wavs=tuxapi_wav_merger.WavMerger(tux) -tux.connect_to_daemon() - -def exit(signum,frame): - print "exiting (%d) ..."%(signum) - tux.disconnect_from_daemon() - sys.exit(signum) - -signal.signal(signal.SIGTERM, exit) -signal.signal(signal.SIGINT, exit) Deleted: api/python/trunk/tuxapi_class.py =================================================================== --- api/python/trunk/tuxapi_class.py 2007-04-13 09:28:15 UTC (rev 244) +++ api/python/trunk/tuxapi_class.py 2007-04-13 10:14:08 UTC (rev 245) @@ -1,1862 +0,0 @@ -#!/usr/bin/python - -# ----------------------------------------------------------------------------- -# Tux Droid - API Class -# Copyright (C) 2007 C2ME Sa <rem...@c2...> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. -# ----------------------------------------------------------------------------- -# $Id$ -# ----------------------------------------------------------------------------- - -import sys -import os -import time -from socket import * -import thread -from tuxapi_const import * - -#============================================================================== -# Constants -#============================================================================== - -api_version ="0.1.3 (SVN/UNRELEASED)" - -HEAD_BT =1 -LEFT_WING_BT =2 -RIGHT_WING_BT =3 -NONE_BT =0 -NULL_BT =0xFF - -HEAD_BUTTON_PUSHED =1 -HEAD_BUTTON_RELEASED =2 -LEFT_WING_PUSHED =3 -LEFT_WING_RELEASED =4 -RIGHT_WING_PUSHED =5 -RIGHT_WING_RELEASED =6 - -CT_SHELL =1 -CT_FUNCTION =2 - -#============================================================================== -# TUXTCPCommunicator class -#============================================================================== -class TUXTCPCommunicator(object): - - #-------------------------------------------------------------------------- - ## Constructor of class - ## @param port : Tcp/IP Port number - ## @param ipAddress : Tcp/IP Host address - #-------------------------------------------------------------------------- - def __init__(self,port,ipAddress): - self.Server_port=port - self.Server_address=ipAddress - self.connected=False - self.last_datas=("a","a","a","a","a","a") - self.datas_threated=True - self.last_datas_for_event=("a","a","a","a","a","a") - self.bloc_datas_flag=False - self.my_name="Tux client" - self.RF_connected=False - self.print_status=False - self.print_warnings=False - self.event=TUXevent(self) - self.cmd=TUXcmd(self) - self.sys=TUXsys(self) - self.sdaemon=TUXsdaemon(self) - self.status=TUXStatus(self) - self.hw=TUXhw(self) - self.tts=TUXtts(5500,"localhost",self) - self.tts.connect_to_daemon() - self.print_warnings=True - - #-------------------------------------------------------------------------- - ## Print versionning of API - #-------------------------------------------------------------------------- - def print_api_version(self): - print "---------------------------------------------------------------" - print "TUXDROID PYTHON API %s"%(api_version) - print "---------------------------------------------------------------" - - #-------------------------------------------------------------------------- - ## Connect object to TUX daemon - #-------------------------------------------------------------------------- - def connect_to_daemon(self): - self.connected=False - self.socket = socket(AF_INET, SOCK_STREAM) - try: - self.socket.connect((self.Server_address, self.Server_port)) - except error: - if self.print_warnings: - print "WARNING : Tux droid daemon not found" - return - self.connected=True - thread.start_new_thread(self.recv_msg_Thread,()) - thread.start_new_thread(self.data_pooling,()) - if self.event.on_connected!=None: - self.event.on_connected() - time.sleep(1) - - #-------------------------------------------------------------------------- - ## Disconnect object from TUX daemon - #-------------------------------------------------------------------------- - def disconnect_from_daemon(self): - if self.connected: - self.sdaemon.disconnect_me() - self.connected=False - self.sys.wait(0.5) - while ((self.data_pooling_run) and (self.recv_msg_Thread_run)): - self.sys.wait(0.01) - self.socket.close() - if self.event.on_disconnected!=None: - self.event.on_disconnected() - self.tts.disconnect_from_daemon() - - #-------------------------------------------------------------------------- - ## Messages receiver (Thread) - ## SYSTEM function - #-------------------------------------------------------------------------- - def recv_msg_Thread(self): - self.recv_msg_Thread_run=True - while self.connected: - while self.bloc_datas_flag: - if not self.connected: return - time.sleep(0.001) - self.bloc_datas_flag=True - try: - self.last_datas=self.socket.recv(16) - except error: - self.socket.close() - self.connected=False - self.bloc_datas_flag=False - continue - self.last_datas_for_event=self.last_datas - self.datas_threated=False - if self.print_status: - struct_data = ["%.2x" % ord(data) for data in self.last_datas] - print " ".join(struct_data) - self.bloc_datas_flag=False - time.sleep(0.01) - self.recv_msg_Thread_run=False - - -#------------------------------------------------------------------------------- -# Extract event from status -#------------------------------------------------------------------------------- - - #-------------------------------------------------------------------------- - ## Converting raw status to explicit string status - ## Return a string - #-------------------------------------------------------------------------- - def explicit_status(self): - value_onoff=0 - value_10=1 - value_8b=2 - value_16b=3 - value_np=4 - - value_type=value_onoff - line="" - status=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - for i, data in enumerate(self.last_datas_for_event): - status[i]=ord(data) - # -- Tux status - if status[4]==DATAS_STATUS_WINGS_MOTOR_BACKWARD: - line=line+"Wings motor backward->" - if status[4]==DATAS_STATUS_SPIN_MOTOR_BACKWARD: - line=line+"Spin motor backward->" - if status[4]==DATAS_STATUS_SPIN_MOTOR_FORWARD: - line=line+"Spin motor forward->" - if status[4]==DATAS_STATUS_MOUTH_OPEN_POSITION: - line=line+"Mouth open position->" - if status[4]==DATAS_STATUS_MOUTH_CLOSED_POSITION: - line=line+"Mouth closed position->" - if status[4]==DATAS_STATUS_HEAD_PUSH_POSITION: - line=line+"Head push position->" - if status[4]==DATAS_STATUS_CHARGER_INHIBIT_SIGNAL: - line=line+"Charger inhibit signal->" - if status[4]==DATAS_STATUS_WINGS_POSITION_SWITCH: - line=line+"Wings position switch->" - if status[4]==DATAS_STATUS_MOTOR_FOR_WINGS: - line=line+"Motor for wings->" - if status[4]==DATAS_STATUS_LEFT_BLUE_LED: - line=line+"Left blue led->" - if status[4]==DATAS_STATUS_HEAD_MOTOR_FOR_MOUTH: - line=line+"Head motor for beack->" - if status[4]==DATAS_STATUS_HEAD_MOTOR_FOR_EYES: - line=line+"Head motor for eyes->" - if status[4]==DATAS_STATUS_IR_RECEIVER_SIGNAL: - line=line+"Ir receiver signal->" - if status[4]==DATAS_STATUS_SPIN_POSITION_SWITCH: - line=line+"Spin position switch->" - if status[4]==DATAS_STATUS_WINGS_MOTOR_FORWARD: - line=line+"Wings motor forward->" - if status[4]==DATAS_STATUS_IR_LED: - line=line+"IR led->" - if status[4]==DATAS_STATUS_EYES_OPEN_POSITION_SWITCH: - line=line+"Eyes open position switch->" - if status[4]==DATAS_STATUS_EYES_CLOSED_POSITION_SWITCH: - line=line+"Eyes closed position switch->" - if status[4]==DATAS_STATUS_LEFT_WING_PUSH: - line=line+"Left wing push->" - if status[4]==DATAS_STATUS_RIGHT_WING_PUSH: - line=line+"Right wing push->" - if status[4]==DATAS_STATUS_POWER_PLUG_SWITCH: - line=line+"Power plug switch->" - if status[4]==DATAS_STATUS_HEAD_PUSH_SWITCH: - line=line+"Head push switch->" - if status[4]==DATAS_STATUS_CHARGER_LED_STATUS: - line=line+"Charger led status->" - if status[4]==DATAS_STATUS_MUTE_STATUS: - line=line+"Audio mute->" - if status[4]==DATAS_STATUS_LIGHT_LEVEL: - line=line+"Light level->" - value_type=value_16b - if status[4]==DATAS_STATUS_EYES_POSITION_COUNTER: - line=line+"Eyes position counter->" - value_type=value_8b - if status[4]==DATAS_STATUS_MOUTH_POSITION_COUNTER: - line=line+"Mouth position counter->" - value_type=value_8b - if status[4]==DATAS_STATUS_WINGS_POSITION_COUNTER: - line=line+"Wings position counter->" - value_type=value_8b - if status[4]==DATAS_STATUS_SPIN_POSITION_COUNTER: - line=line+"Spin position counter->" - value_type=value_8b - if status[4]==DATAS_STATUS_RIGHT_BLUE_LED: - line=line+"Right blue led->" - if status[4]==DATAS_STATUS_RF_CONNECTED: - line=line+"RF connected->" - if status[4]==DATAS_STATUS_IR_CODE: - line=line+"IR code->%s"%remote_bt_name[status[5]] - value_type=value_np - if status[4]==DATAS_STATUS_SOUND_COUNT: - line=line+"Flash sounds count->" - if status[4]==DATAS_STATUS_PONG: - line=line+"Pong-> Received : %d Remaining : %d Average : %.0f %s"\ - %(status[6],status[5],((status[6]*100)/(200-status[5])),'%') - value_type=value_np - #-- Write value - if value_type==value_onoff: - if status[5]==0: line=line+"off" - else: line=line+"on" - if value_type==value_8b: - line=line+"%d"%status[5] - if value_type==value_16b: - line=line+"%d"%((status[5]*256)+status[6]) - return line - - #-------------------------------------------------------------------------- - ## Pooling on data arrival from tcp server - ## SYSTEM function - #-------------------------------------------------------------------------- - def data_pooling(self): - self.data_pooling_run=True - while self.connected: - while self.datas_threated: - if not self.connected: return - time.sleep(0.003) - while self.bloc_datas_flag: - if not self.connected: return - time.sleep(0.001) - self.dispatch_data_from_tcp_server() - self.datas_threated=True - self.data_pooling_run=False - - #-------------------------------------------------------------------------- - ## Dispatch data from tcp server - ## SYSTEM function - #-------------------------------------------------------------------------- - def dispatch_data_from_tcp_server(self): - # from sdaemon - if ord(self.last_datas_for_event[0])==SOURCE_SUB_DAEMON: - self.dispatch_data_from_sdaemon() - # from tux droid - if ord(self.last_datas_for_event[0])==SOURCE_TUX: - self.dispatch_data_from_tux() - - #-------------------------------------------------------------------------- - ## data from sub daemon - ## SYSTEM function - #-------------------------------------------------------------------------- - def dispatch_data_from_sdaemon(self): - # data type command - if ord(self.last_datas_for_event[2])==DATA_TP_CMD: - if ord(self.last_datas_for_event[3])==SUBDATA_TP_STRUCT: - # daemon close - if ord(self.last_datas_for_event[4])==SUB_D_CMD_STRUC_DISCONNECT_CLIENT: - self.disconnect_from_daemon() - if self.print_warnings: - print "WARNING : TuxDaemon is disconnected" - - #-------------------------------------------------------------------------- - ## data from tux droid - ## SYSTEM function - #-------------------------------------------------------------------------- - def dispatch_data_from_tux(self): - # data type response - if ord(self.last_datas_for_event[2])==DATA_TP_RSP: - if ord(self.last_datas_for_event[3])==SUBDATA_TP_STATUS: - if self.event.on_status!=None: - self.event.on_status() - #Head button - if ord(self.last_datas_for_event[4])==DATAS_STATUS_HEAD_PUSH_SWITCH: - if ord(self.last_datas_for_event[5])==1: - if self.event.on_head_bt_pushed!=None: - self.event.on_head_bt_pushed() - if self.event.on_bt_pushed!=None: - self.event.on_bt_pushed() - else: - if self.event.on_head_bt_released!=None: - self.event.on_head_bt_released() - if self.event.on_bt_released!=None: - self.event.on_bt_released() - #Left wing button - if ord(self.last_datas_for_event[4])==DATAS_STATUS_LEFT_WING_PUSH: - if ord(self.last_datas_for_event[5])==1: - if self.event.on_lwing_bt_pushed!=None: - self.event.on_lwing_bt_pushed() - if self.event.on_bt_pushed!=None: - self.event.on_bt_pushed() - else: - if self.event.on_lwing_bt_released!=None: - self.event.on_lwing_bt_released() - if self.event.on_bt_released!=None: - self.event.on_bt_released() - #Right wing button - if ord(self.last_datas_for_event[4])==DATAS_STATUS_RIGHT_WING_PUSH: - if ord(self.last_datas_for_event[5])==1: - if self.event.on_rwing_bt_pushed!=None: - self.event.on_rwing_bt_pushed() - if self.event.on_bt_pushed!=None: - self.event.on_bt_pushed() - else: - if self.event.on_rwing_bt_released!=None: - self.event.on_rwing_bt_released() - if self.event.on_bt_released!=None: - self.event.on_bt_released() - #Remote button - if ord(self.last_datas_for_event[4])==DATAS_STATUS_IR_CODE: - if self.event.on_remote_bt[ord(self.last_datas_for_event[5])]!=None: - self.event.on_remote_bt[ord(self.last_datas_for_event[5])]() - if self.event.on_remote!=None: - self.event.on_remote(ord(self.last_datas_for_event[5])) - #Mouth open - if ord(self.last_datas_for_event[4])==DATAS_STATUS_MOUTH_OPEN_POSITION: - if ord(self.last_datas_for_event[5])==1: - if self.event.on_mouth_open!=None: - self.event.on_mouth_open() - #Mouth close - if ord(self.last_datas_for_event[4])==DATAS_STATUS_MOUTH_CLOSED_POSITION: - if ord(self.last_datas_for_event[5])==1: - if self.event.on_mouth_close!=None: - self.event.on_mouth_close() - #Ledl - if ord(self.last_datas_for_event[4])==DATAS_STATUS_LEFT_BLUE_LED: - if ord(self.last_datas_for_event[5])==1: - if self.event.on_left_blue_led_on!=None: - self.event.on_left_blue_led_on() - else: - if self.event.on_left_blue_led_off!=None: - self.event.on_left_blue_led_off() - #Ledr - if ord(self.last_datas_for_event[4])==DATAS_STATUS_RIGHT_BLUE_LED: - if ord(self.last_datas_for_event[5])==1: - if self.event.on_right_blue_led_on!=None: - self.event.on_right_blue_led_on() - else: - if self.event.on_right_blue_led_off!=None: - self.event.on_right_blue_led_off() - #Eyes open/close - if ord(self.last_datas_for_event[4])==DATAS_STATUS_EYES_CLOSED_POSITION_SWITCH: - if ord(self.last_datas_for_event[5])==1: - if self.event.on_eyes_close!=None: - self.event.on_eyes_close() - else: - if self.event.on_eyes_open!=None: - self.event.on_eyes_open() - #Power plug switch - if ord(self.last_datas_for_event[4])==DATAS_STATUS_POWER_PLUG_SWITCH: - if ord(self.last_datas_for_event[5])==1: - if self.event.on_power_plugged!=None: - self.event.on_power_plugged() - else: - if self.event.on_power_unplugged!=None: - self.event.on_power_unplugged() - #RF status - if ord(self.last_datas_for_event[4])==DATAS_STATUS_RF_CONNECTED: - if ord(self.last_datas_for_event[5])==1: - self.RF_connected=True - if self.event.on_rf_connected!=None: - self.event.on_rf_connected() - else: - self.RF_connected=False - if self.event.on_rf_disconnected!=None: - self.event.on_rf_disconnected() - #PONG - if ord(self.last_datas_for_event[4])==DATAS_STATUS_PONG: - if self.event.on_pong_received!=None: - rcv=ord(self.last_datas_for_event[6]) - rem=ord(self.last_datas_for_event[5]) - avg=int((100*rcv)/(200-rem)) - self.event.on_pong_received(rcv,rem,avg) - #mouth stop - if ord(self.last_datas_for_event[4])==DATAS_STATUS_MOUTH_POSITION_COUNTER: - if ord(self.last_datas_for_event[5])==0: - if self.event.on_mouth_stop!=None: - self.event.on_mouth_stop() - #eyes stop - if ord(self.last_datas_for_event[4])==DATAS_STATUS_EYES_POSITION_COUNTER: - if ord(self.last_datas_for_event[5])==0: - if self.event.on_eyes_stop!=None: - self.event.on_eyes_stop() - - #wings stop - if ord(self.last_datas_for_event[4])==DATAS_STATUS_WINGS_POSITION_COUNTER: - if ord(self.last_datas_for_event[5])==0: - if self.event.on_wings_stop!=None: - self.event.on_wings_stop() - #spin stop - if ord(self.last_datas_for_event[4])==DATAS_STATUS_SPIN_POSITION_COUNTER: - if ord(self.last_datas_for_event[5])==0: - if self.event.on_spin_stop!=None: - self.event.on_spin_stop() - -#============================================================================== -# TUXTCPCommunicator - sys - class -#============================================================================== -class TUXsys(object): - - #-------------------------------------------------------------------------- - ## class init - ## @param parent : TUXTCPCommunicator parent object - #-------------------------------------------------------------------------- - def __init__(self,parent): - self.parent=parent - self.events_list=[[0,'NONE',9999,99,99,99,99,99]] - thread.start_new_thread(self.time_events_Thread,()) - - #-------------------------------------------------------------------------- - ## Return the current time in seconds - #-------------------------------------------------------------------------- - def time(self): - return (time.localtime()[3]*3600)+(time.localtime()[4]*60)+time.localtime()[5] - - #-------------------------------------------------------------------------- - ## Wait a defined time - ## @param seconds : Number of seconds to wait - #-------------------------------------------------------------------------- - def wait(self,seconds): - time.sleep(seconds) - - #-------------------------------------------------------------------------- - ## Execute a shell command in blocking mode - ## @param command : Shell command (ex : "xmms") - #-------------------------------------------------------------------------- - def shell(self,command): - os.system(command) - - #-------------------------------------------------------------------------- - ## Execute a shell command in non blocking mode - ## @param command : Shell command (ex : "xmms") - #-------------------------------------------------------------------------- - def shell_free(self,command): - thread.start_new_thread(self.shell,(command,)) - - #-------------------------------------------------------------------------- - ## Add a time event in the time event handler - ## @param cmd_type : Command type (CT_SHELL or CT_FUNCTION) - ## @param cmd : Command to execute - ## @param year : (ex : 2006) (9999 : parameter ignored) - ## @param month : (ex : 12) (99 : parameter ignored) - ## @param day : (ex : 23) (99 : parameter ignored) - ## @param hour : (ex : 08) (99 : parameter ignored) - ## @param minute : (ex : 55) (99 : parameter ignored) - ## @param second : (ex : 30) (99 : parameter ignored) - #-------------------------------------------------------------------------- - def add_time_event(self,cmd_type,cmd,year,month,day,hour,minute,second): - self.events_list.append([cmd_type,cmd,year,month,day,hour,minute,second]) - - #-------------------------------------------------------------------------- - ## Clear the time events in the time event handler - #-------------------------------------------------------------------------- - def clear_time_events(self): - self.events_list=[[0,'NONE',9999,99,99,99,99,99]] - - #-------------------------------------------------------------------------- - ## Time event handler (Thread) - ## SYSTEM function - #-------------------------------------------------------------------------- - def time_events_Thread(self): - def event_due(event): - now = time.localtime() - return event[2] in [now[0], 9999] \ - and event[3] in [now[1], 99] \ - and event[4] in [now[2], 99] \ - and event[5] in [now[3], 99] \ - and event[6] in [now[4], 99] \ - and event[7] in [now[5], 99] - while True: - if self.parent.connected: - for event in self.events_list: - if event[0] != 0 and event_due(event): - if event[0] == CT_SHELL: - self.shell_free(event[1]) - elif event[0] == CT_FUNCTION: - event[1]() - time.sleep(1) - -#============================================================================== -# TUXTCPCommunicator - event - class -#============================================================================== -class TUXevent(object): - - #-------------------------------------------------------------------------- - ## class init - ## @param parent : TUXTCPCommunicator parent object - #-------------------------------------------------------------------------- - def __init__(self,parent): - self.parent=parent - self.clear() - - #-------------------------------------------------------------------------- - ## clear all events - #-------------------------------------------------------------------------- - def clear(self): - self.on_bt_pushed=None - self.on_head_bt_pushed=None - self.on_lwing_bt_pushed=None - self.on_rwing_bt_pushed=None - self.on_bt_released=None - self.on_head_bt_released=None - self.on_lwing_bt_released=None - self.on_rwing_bt_released=None - self.on_remote_bt=[None]*64 - self.on_status=None - self.on_remote=None - self.on_light_level=None - self.on_connected=None - self.on_disconnected=None - self.on_mouth_open=None - self.on_mouth_close=None - self.on_power_plugged=None - self.on_power_unplugged=None - self.on_left_blue_led_on=None - self.on_left_blue_led_off=None - self.on_right_blue_led_on=None - self.on_right_blue_led_off=None - self.on_eyes_open=None - self.on_eyes_close=None - self.on_rf_connected=None - self.on_rf_disconnected=None - self.on_pong_received=None - self.on_mouth_stop=None - self.on_eyes_stop=None - self.on_wings_stop=None - self.on_spin_stop=None - - #-------------------------------------------------------------------------- - ## store all events - #-------------------------------------------------------------------------- - def store(self): - 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 - - #-------------------------------------------------------------------------- - ## restore all events - #-------------------------------------------------------------------------- - def restore(self): - 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 - - #-------------------------------------------------------------------------- - ## wait until status event arrival - ## @param DATA_STATUS : Desired status - ## @param DATA_VALUE : Desired value - ## @param time_out : Time out in seconds - #-------------------------------------------------------------------------- - def wait_status(self,DATA_STATUS,DATA_VALUE,time_out): - if not self.parent.connected: - return False - time_beginin=self.parent.sys.time() - while True: - if self.parent.connected: - while self.parent.bloc_datas_flag: - if (self.parent.sys.time()-time_beginin)>=time_out and time_out!=9999: - return False - time.sleep(0.001) - if ord(self.parent.last_datas[0])==SOURCE_TUX: - if ord(self.parent.last_datas[1])==SS_DEFAULT: - if ord(self.parent.last_datas[2])==DATA_TP_RSP: - if ord(self.parent.last_datas[3])==SUBDATA_TP_STATUS: - if ord(self.parent.last_datas[4])==DATA_STATUS: - if ord(self.parent.last_datas[5])==DATA_VALUE: - return True - if (self.parent.sys.time()-time_beginin)>=time_out and time_out!=9999: - return False - time.sleep(0.001) - - #-------------------------------------------------------------------------- - ## wait for stable status event - ## @param DATA_STATUS : Desired status - ## @param DATA_VALUE : Desired value - ## @param time_out : Time out in seconds - ## @param stable_time : Time of stable status wanted in seconds - #-------------------------------------------------------------------------- - def wait_stable_status(self,DATA_STATUS,DATA_VALUE,stable_time,time_out): - if self.wait_status(DATA_STATUS,DATA_VALUE,time_out)==False: - return False - else: - if DATA_VALUE==1: - INV_DATA_VALUE=0 - else: - INV_DATA_VALUE=1 - return not self.wait_status(DATA_STATUS,INV_DATA_VALUE,stable_time) - - #-------------------------------------------------------------------------- - ## Wait until a tux button is pressed - ## @param time_out : Time out in seconds (9999 : infinite wait) - #-------------------------------------------------------------------------- - def wait_bt_pushed(self,time_out): - if not self.parent.connected: - return 0 - time_beginin=self.parent.sys.time() - while True: - while self.parent.bloc_datas_flag: - if (self.parent.sys.time()-time_beginin)>=time_out and time_out!=9999: - return 0 - time.sleep(0.001) - if ord(self.parent.last_datas[0])==SOURCE_TUX: - if ord(self.parent.last_datas[1])==SS_DEFAULT: - if ord(self.parent.last_datas[2])==DATA_TP_RSP: - if ord(self.parent.last_datas[3])==SUBDATA_TP_STATUS: - if ord(self.parent.last_datas[4])==DATAS_STATUS_HEAD_PUSH_SWITCH: - if ord(self.parent.last_datas[5])==1: - return HEAD_BT - elif ord(self.parent.last_datas[4])==DATAS_STATUS_LEFT_WING_PUSH: - if ord(self.parent.last_datas[5])==1: - return LEFT_WING_BT - elif ord(self.parent.last_datas[4])==DATAS_STATUS_RIGHT_WING_PUSH: - if ord(self.parent.last_datas[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) - - #-------------------------------------------------------------------------- - ## Wait until head button is pushed - ## @param time_out : Time out in seconds - #-------------------------------------------------------------------------- - def wait_head_bt_pushed(self,time_out): - return self.wait_status(DATAS_STATUS_HEAD_PUSH_SWITCH,1,time_out) - - #-------------------------------------------------------------------------- - ## Wait until head button is released - #-------------------------------------------------------------------------- - def wait_head_bt_released(self): - return self.wait_status(DATAS_STATUS_HEAD_PUSH_SWITCH,0,9999) - - #-------------------------------------------------------------------------- - ## Wait until left wing button is pushed - ## @param time_out : Time out in seconds - #-------------------------------------------------------------------------- - def wait_lwing_bt_pushed(self,time_out): - return self.wait_status(DATAS_STATUS_LEFT_WING_PUSH,1,time_out) - - #-------------------------------------------------------------------------- - ## Wait until left wing button is released - #-------------------------------------------------------------------------- - def wait_lwing_bt_released(self): - return self.wait_status(DATAS_STATUS_LEFT_WING_PUSH,0,9999) - - #-------------------------------------------------------------------------- - ## Wait until right wing button is pushed - ## @param time_out : Time out in seconds - #-------------------------------------------------------------------------- - def wait_rwing_bt_pushed(self,time_out): - return self.wait_status(DATAS_STATUS_RIGHT_WING_PUSH,1,time_out) - - #-------------------------------------------------------------------------- - ## Wait until right wing button is released - #-------------------------------------------------------------------------- - def wait_rwing_bt_released(self): - return self.wait_status(DATAS_STATUS_RIGHT_WING_PUSH,0,9999) - - #-------------------------------------------------------------------------- - ## Wait until remote button is pushed - #-------------------------------------------------------------------------- - def wait_remote_bt(self,remote_key,timeout): - return self.wait_status(DATAS_STATUS_IR_CODE,remote_key,timeout) - - # Setting of events - - #-------------------------------------------------------------------------- - ## setting of button pushed event - #-------------------------------------------------------------------------- - def set_on_bt_pushed(self,function): - self.on_bt_pushed=function - - #-------------------------------------------------------------------------- - ## setting of head button pushed event - #-------------------------------------------------------------------------- - def set_on_head_bt_pushed(self,function): - self.on_head_bt_pushed=function - - #-------------------------------------------------------------------------- - ## setting of left wing pushed event - #-------------------------------------------------------------------------- - def set_on_lwing_bt_pushed(self,function): - self.on_lwing_bt_pushed=function - - #-------------------------------------------------------------------------- - ## setting of right wing pushed event - #-------------------------------------------------------------------------- - def set_on_rwing_bt_pushed(self,function): - self.on_rwing_bt_pushed=function - - #-------------------------------------------------------------------------- - ## setting of button released event - #-------------------------------------------------------------------------- - def set_on_bt_released(self,function): - self.on_bt_released=function - - #-------------------------------------------------------------------------- - ## setting of head button released event - #-------------------------------------------------------------------------- - def set_on_head_bt_released(self,function): - self.on_head_bt_released=function - - #-------------------------------------------------------------------------- - ## setting of left wing pushed event - #-------------------------------------------------------------------------- - def set_on_lwing_bt_released(self,function): - self.on_lwing_bt_released=function - - #-------------------------------------------------------------------------- - ## setting of right wing released event - #-------------------------------------------------------------------------- - def set_on_rwing_bt_released(self,function): - self.on_rwing_bt_released=function - - #-------------------------------------------------------------------------- - ## setting of remote bt event - #-------------------------------------------------------------------------- - def set_on_remote_bt(self,key,function): - self.on_remote_bt[key]=function - -#============================================================================== -# TUXTCPCommunicator - cmd - class -#============================================================================== -class TUXcmd(object): - - ## class init - ## @param parent : TUXTCPCommunicator parent object - def __init__(self,parent): - self.parent=parent - self.last_ack=ACK_CMD_OK - self.no_ack=False - - ## SYSTEM - def cmd_ack(self): - time_beginin=self.parent.sys.time() - while True: - while self.parent.bloc_datas_flag: - if (self.parent.sys.time()-time_beginin)>=2: - return ACK_CMD_TIMEOUT - time.sleep(0.001) - if ord(self.parent.last_datas[0])==SOURCE_TUX: - if ord(self.parent.last_datas[1])==SS_DEFAULT: - if ord(self.parent.last_datas[2])==DATA_TP_ACK_CMD: - return ord(self.parent.last_datas[4]) - if (self.parent.sys.time()-time_beginin)>=2: - return ACK_CMD_TIMEOUT - time.sleep(0.001) - - - ## Send a structured command to tux - ## @param fct : function of tux - ## @param cmd : command for this function - ## @param param1 : cmd parameter 1 - ## @param param2 : cmd parameter 2 - ## @param param3 : cmd parameter 3 - def structured(self,fct,cmd,param1,param2,param3): - if not self.parent.connected: - return 2 - data=(DEST_TUX,SD_DEFAULT,DATA_TP_CMD,SUBDATA_TP_STRUCT,fct,cmd,param1,param2,param3,0,0,0,0,0,0,0) - self.parent.socket.send("".join( [chr(x) for x in data] )) - if self.no_ack: - return 2 - else: - return self.cmd_ack() - - ## Send a raw command to tux - ## @param cmd : command - ## @param param1 : cmd parameter 1 - ## @param param2 : cmd parameter 2 - ## @param param3 : cmd parameter 3 - def raw(self,cmd,param1,param2,param3): - if not self.parent.connected: - return 2 - data=(DEST_TUX,SD_DEFAULT,DATA_TP_CMD,SUBDATA_TP_RAW,cmd,param1,param2,param3,0,0,0,0,0,0,0,0) - self.parent.socket.send("".join( [chr(x) for x in data] )) - if self.no_ack: - return 2 - else: - return self.cmd_ack() - - ## Send command to tux for moving eyes - ## @param count : number of movement - def eyes_on(self,count=1): - self.last_ack=self.structured(TUX_CMD_STRUCT_EYES,TUX_CMD_STRUCT_SUB_ON,count,0,0) - self.parent.event.wait_status(DATAS_STATUS_EYES_POSITION_COUNTER,0,(0.3*count)) - - ## Send command to tux for opening eyes - def eyes_open(self): - if self.parent.status.get_eyes_closed_position_switch()==0: - self.eyes_on() - - ## Send command to tux for closing eyes - def eyes_close(self): - if self.parent.status.get_eyes_closed_position_switch()==1: - self.eyes_on() - - ## Send command to tux for moving eyes - ## @param count : number of movement - def eyes_on_free(self,count=1): - thread.start_new_thread(self.eyes_on,(count,)) - - ## Send command to tux for stoping eyes movement - def eyes_off(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_EYES,TUX_CMD_STRUCT_SUB_OFF,0,0,0) - - ## Send command to tux for moving mouth - ## @param count : number of movement - def mouth_on(self,count=1): - self.last_ack=self.structured(TUX_CMD_STRUCT_MOUTH,TUX_CMD_STRUCT_SUB_ON,count,0,0) - self.parent.event.wait_status(DATAS_STATUS_MOUTH_POSITION_COUNTER,0,(0.3*count)) - - ## Send command to tux for moving mouth - ## @param count : number of movement - def mouth_on_free(self,count=1): - thread.start_new_thread(self.mouth_on,(count,)) - - ## Send command to tux for opening mouth - def mouth_open(self): - if self.parent.status.get_mouth_open_position()==1: - self.mouth_on() - - ## Send command to tux for closing mouth - def mouth_close(self): - if self.parent.status.get_mouth_open_position()==0: - self.mouth_on() - - ## Send command to tux for stoping mouth movement - def mouth_off(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_MOUTH,TUX_CMD_STRUCT_SUB_OFF,0,0,0) - - ## Send command to tux for moving wings - ## @param count : number of movement - def wings_on(self,count=1,speed=5): - self.last_ack=self.structured(TUX_CMD_STRUCT_WINGS,TUX_CMD_STRUCT_SUB_ON,count,speed,0) - self.parent.event.wait_status(DATAS_STATUS_WINGS_POSITION_COUNTER,0,(0.6*count)) - - ## Send command to tux for moving wings - ## @param count : number of movement - def wings_on_free(self,count=1,speed=5): - thread.start_new_thread(self.wings_on,(count,speed,)) - - ## Send command to tux for stoping wings movement - def wings_off(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_WINGS,TUX_CMD_STRUCT_SUB_OFF,0,0,0) - - ## Send command to tux for spinning to the left - ## @param count : number of movement - def spinl_on(self,count=4,speed=5): - self.last_ack=self.structured(TUX_CMD_STRUCT_SPINL,TUX_CMD_STRUCT_SUB_ON,count,speed,0) - self.parent.event.wait_status(DATAS_STATUS_SPIN_POSITION_COUNTER,0,(0.5*count)) - - ## Send command to tux for spinning to the left - ## @param count : number of movement - def spinl_on_free(self,count=4,speed=5): - thread.start_new_thread(self.spinl_on,(count,speed,)) - - ## Send command to tux for stoping rotation - def spinl_off(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_SPINL,TUX_CMD_STRUCT_SUB_OFF,0,0,0) - - ## Send command to tux for spinning to the right - ## @param count : number of movement - def spinr_on(self,count=4,speed=5): - self.last_ack=self.structured(TUX_CMD_STRUCT_SPINR,TUX_CMD_STRUCT_SUB_ON,count,speed,0) - self.parent.event.wait_status(DATAS_STATUS_SPIN_POSITION_COUNTER,0,(0.5*count)) - - ## Send command to tux for spinning to the right - ## @param count : number of movement - def spinr_on_free(self,count=4,speed=5): - thread.start_new_thread(self.spinr_on,(count,speed,)) - - ## Send command to tux for stoping rotation - def spinr_off(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_SPINR,TUX_CMD_STRUCT_SUB_OFF,0,0,0) - - - ## Send command to tux for IR on - def ir_on(self): - ACK=self.structured(TUX_CMD_STRUCT_IR,TUX_CMD_STRUCT_SUB_ON,0,0,0) - - ## Send command to tux for IR off - def ir_off(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_IR,TUX_CMD_STRUCT_SUB_OFF,0,0,0) - - ## Send command to tux for IR sending - def ir_send(self,address,command): - self.last_ack=self.structured(TUX_CMD_STRUCT_IR,TUX_CMD_STRUCT_SUB_SEND,address,command,0) - - ## Send command to tux for leds on - def leds_on(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_LEDS,TUX_CMD_STRUCT_SUB_ON,0,0,0) - - ## Send command to tux for leds blink - ## @param count : number of blink - ## @param delay : delay in 4msec between 2 states - def leds_blink(self,count,delay): - self.last_ack=self.structured(TUX_CMD_STRUCT_LEDS,TUX_CMD_STRUCT_SUB_BLINK,count,delay,0) - - ## Send command to tux for leds off - def leds_off(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_LEDS,TUX_CMD_STRUCT_SUB_OFF,0,0,0) - - ## Send command to tux for leds on during a time - ## @param seconds : number of seconds - def leds_during(self,seconds): - self.leds_on() - time.sleep(seconds) - self.leds_off() - - ## Send command to tux for leds on during a time - ## @param seconds : number of seconds - def leds_during_free(self,seconds): - thread.start_new_thread(self.leds_during,(seconds,)) - - ## Send command to tux for left led on - def ledl_on(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_LEDL,TUX_CMD_STRUCT_SUB_ON,0,0,0) - - ## Send command to tux for left led off - def ledl_off(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_LEDL,TUX_CMD_STRUCT_SUB_OFF,0,0,0) - - ## Send command to tux for left led on during a time - ## @param seconds : number of seconds - def ledl_during(self,seconds): - self.ledl_on() - time.sleep(seconds) - self.ledl_off() - - ## Send command to tux for left led on during a time - ## @param seconds : number of seconds - def ledl_during_free(self,seconds): - thread.start_new_thread(self.ledl_during,(seconds,)) - - ## Send command to tux for right led on - def ledr_on(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_LEDR,TUX_CMD_STRUCT_SUB_ON,0,0,0) - - ## Send command to tux for right led off - def ledr_off(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_LEDR,TUX_CMD_STRUCT_SUB_OFF,0,0,0) - - ## Send command to tux for right led on during a time - ## @param seconds : number of seconds - def ledr_during(self,seconds): - self.ledr_on() - time.sleep(seconds) - self.ledr_off() - - ## Send command to tux for right led on during a time - ## @param seconds : number of seconds - def ledr_during_free(self,seconds): - thread.start_new_thread(self.ledr_during,(seconds,)) - - ## Send command to tux for playing sound of tux - ## @param index : index of sound - ## @param volume : volume of sound (0-7 : max-min) - def sound_play(self,index,volume): - self.last_ack=self.structured(TUX_CMD_STRUCT_SOUND,TUX_CMD_STRUCT_SUB_PLAY,index,volume,0) - - ## Send command to tux for storing a sound collection in tux flash - ## @param number : number of sound to storing - def sound_storing(self,number): - self.last_ack=self.structured(TUX_CMD_STRUCT_SOUND,TUX_CMD_STRUCT_SUB_STORING,number,0,0) - - ## Send command to tux for storing a index in the TOC - ## @param highAdd : high byte address of sound - ## @param middleAdd : middle byte address of sound - ## @param lowerAdd : lower byte address of sound - def sound_store_index(self,highAdd,middleAdd,lowerAdd): - self.last_ack=self.structured(TUX_CMD_STRUCT_SOUND,TUX_CMD_STRUCT_SUB_STORE_INDEX,highAdd,middleAdd,lowerAdd) - - ## Send command to tux for testing the tux internal sound - def sound_test(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_SOUND,TUX_CMD_STRUCT_SUB_TEST,0,0,0) - - ## Send command to tux for ping-pong - ## @param ping_count : number of pong requested - def ping(self,count): - self.last_ack=self.structured(TUX_CMD_STRUCT_PING,0,count,0,0) - - ## Send command to tux for sleep mode on - def sleep_on(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_SLEEP,TUX_CMD_STRUCT_SUB_ON,0,0,0) - - ## Send command to tux for sleep mode on - def sleep_off(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_SLEEP,TUX_CMD_STRUCT_SUB_OFF,0,0,0) - - ## Send command to tux for selecting GENERAL audio channel - def audio_channel_general(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_AUDIO_CHANNEL,\ - TUX_CMD_STRUCT_SUB_CH_GENERAL,0,0,0) - - ## Send command to tux for selecting TTS audio channel - def audio_channel_tts(self): - self.last_ack=self.structured(TUX_CMD_STRUCT_AUDIO_CHANNEL,\ - TUX_CMD_STRUCT_SUB_CH_TTS,0,0,0) - -#============================================================================== -# TUXTCPCommunicator - status - class -#============================================================================== -class TUXStatus(object): - - ## class init - ## @param parent : TUXTCPCommunicator parent object - def __init__(self,parent): - self.parent=parent - thread.start_new_thread(self.capture_light_level_thread,()) - - ## SYSTEM function - def capture_light_level_thread(self): - while self.parent.connected: - if self.parent.event.on_light_level!=None: - self.parent.event.on_light_level(self.get_light_level()) - self.parent.sys.wait(0.1) - - ## wait a specified response status - ## return True if status arrival before 2 seconds - ## else return False - ## raw of status is in self.parent.last_datas - ## @param DATA_STATUS : Desired status - def rsp_status(self,DATA_STATUS): - time_beginin=self.parent.sys.time() - while True: - while self.parent.bloc_datas_flag: - if (self.parent.sys.time()-time_beginin)>=2: - return False - time.sleep(0.001) - if ord(self.parent.last_datas[0])==SOURCE_TUX: - if ord(self.parent.last_datas[1])==SS_DEFAULT: - if ord(self.parent.last_datas[2])==DATA_TP_RSP: - if ord(self.parent.last_datas[4])==DATA_STATUS: - return True - if (self.parent.sys.time()-time_beginin)>=2: - return False - time.sleep(0.001) - - ## Get a specified status - ## return True if status arrival before 2 seconds - ## else return False - ## raw of status is in self.parent.last_datas - ## @param DATA_STATUS : Desired status - def get(self,DATA_STATUS): - if not self.parent.connected: - return 0 - data=(DEST_TUX,SD_DEFAULT,DATA_TP_REQ,SUBDATA_TP_STATUS,DATA_STATUS,0,0,0,0,0,0,0,0,0,0,0) - self.parent.socket.send("".join( [chr(x) for x in data] )) - return self.rsp_status(DATA_STATUS) - - ## Get the last state of wings motor backward status - def get_wings_motor_backward(self): - if self.get(DATAS_STATUS_WINGS_MOTOR_BACKWARD): - return ord(self.parent.last_datas[5]) - - ## Get the last state of spin motor backward status - def get_spin_motor_backward(self): - if self.get(DATAS_STATUS_SPIN_MOTOR_BACKWARD): - return ord(self.parent.last_datas[5]) - - ## Get the last state of spin motor forward status - def get_spin_motor_forward(self): - if self.get(DATAS_STATUS_SPIN_MOTOR_FORWARD): - return ord(self.parent.last_datas[5]) - - ## Get the last state of mouth open position status - def get_mouth_open_position(self): - if self.get(DATAS_STATUS_MOUTH_OPEN_POSITION): - return ord(self.parent.last_datas[5]) - - ## Get the last state of mouth closed position status - def get_mouth_closed_position(self): - if self.get(DATAS_STATUS_MOUTH_CLOSED_POSITION): - return ord(self.parent.last_datas[5]) - - ## Get the last state of head push position status - def get_head_push_position(self): - if self.get(DATAS_STATUS_HEAD_PUSH_POSITION): - return ord(self.parent.last_datas[5]) - - ## Get the last state of charger inhibit signal status - def get_charger_inhibit_signal(self): - if self.get(DATAS_STATUS_CHARGER_INHIBIT_SIGNAL): - return ord(self.parent.last_datas[5]) - - ## Get the last state of wings position switch status - def get_wings_position_switch(self): - if self.get(DATAS_STATUS_WINGS_POSITION_SWITCH): - return ord(self.parent.last_datas[5]) - - ## Get the last state of motor for wings status - def get_motor_for_wings(self): - if self.get(DATAS_STATUS_MOTOR_FOR_WINGS): - return ord(self.parent.last_datas[5]) - - ## Get the last state of left blue led status - def get_left_blue_led(self): - if self.get(DATAS_STATUS_LEFT_BLUE_LED): - return ord(self.parent.last_datas[5]) - - ## Get the last state of right blue led status - def get_right_blue_led(self): - if self.get(DATAS_STATUS_RIGHT_BLUE_LED): - return ord(self.parent.last_datas[5]) - - ## Get the last state of head motor for mouth status - def get_head_motor_for_mouth(self): - if self.get(DATAS_STATUS_HEAD_MOTOR_FOR_MOUTH): - return ord(self.parent.last_datas[5]) - - ## Get the last state of head motor for eyes status - def get_head_motor_for_eyes(self): - if self.get(DATAS_STATUS_HEAD_MOTOR_FOR_EYES): - return ord(self.parent.last_datas[5]) - - ## Get the last state of IR receiver signal status - def get_ir_receiver_signal(self): - if self.get(DATAS_STATUS_IR_RECEIVER_SIGNAL): - return ord(self.parent.last_datas[5]) - - ## Get the last state of spin position switch status - def get_spin_position_switch(self): - if self.get(DATAS_STATUS_SPIN_POSITION_SWITCH): - return ord(self.parent.last_datas[5]) - - ## Get the last state of wings motor forward status - def get_wings_motor_forward(self): - if self.get(DATAS_STATUS_WINGS_MOTOR_FORWARD): - return ord(self.parent.last_datas[5]) - - ## Get the last state of IR led status - def get_ir_led(self): - if self.get(DATAS_STATUS_IR_LED): - return ord(self.parent.last_datas[5]) - - ## Get the last state of eyes open position switch status - def get_eyes_open_position_switch(self): - if self.get(DATAS_STATUS_EYES_OPEN_POSITION_SWITCH): - return ord(self.parent.last_datas[5]) - - ## Get the last state of eyes closed position switch status - def get_eyes_closed_position_switch(self): - if self.get(DATAS_STATUS_EYES_CLOSED_POSITION_SWITCH): - return ord(self.parent.last_datas[5]) - - ## Get the last state of left wing push status - def get_left_wing_push(self): - if self.get(DATAS_STATUS_LEFT_WING_PUSH): - return ord(self.parent.last_datas[5]) - - ## Get the last state of right wing push status - def get_right_wing_push(self): - if self.get(DATAS_STATUS_RIGHT_WING_PUSH): - return ord(self.parent.last_datas[5]) - - ## Get the last state of power plug switch status - def get_power_plug_switch(self): - if self.get(DATAS_STATUS_POWER_PLUG_SWITCH): - return ord(self.parent.last_datas[5]) - - ## Get the last state of head push switch status - def get_head_push_switch(self): - if self.get(DATAS_STATUS_HEAD_PUSH_SWITCH): - return ord(self.parent.last_datas[5]) - - ## Get the last state of tux mute sound status - def get_tux_mute_sound(self): - if self.get(DATAS_STATUS_MUTE_STATUS): - return ord(self.parent.last_datas[5]) - - ## Get the last state of light level status - def get_light_level(self): - if self.get(DATAS_STATUS_LIGHT_LEVEL): - return (ord(self.parent.last_datas[5])*256)+ord(self.parent.last_datas[6]) - - ## Get the last state of eyes position counter status - def get_eyes_position_counter(self): - if self.get(DATAS_STATUS_EYES_POSITION_COUNTER): - return ord(self.parent.last_datas[5]) - - ## Get the last state of mouth position counter status - def get_mouth_position_counter(self): - if self.get(DATAS_STATUS_MOUTH_POSITION_COUNTER): - return ord(self.parent.last_datas[5]) - - ## Get the last state of wings position counter status - def get_wings_position_counter(self): - if self.get(DATAS_STATUS_WINGS_POSITION_COUNTER): - return ord(self.parent.last_datas[5]) - - ## Get the last state of spin position counter status - def get_spin_position_counter(self): - if self.get(DATAS_STATUS_SPIN_POSITION_COUNTER): - return ord(self.parent.last_datas[5]) - - ## Get the last status RF - def get_RF_state(self): - if self.get(DATAS_STATUS_RF_CONNECTED): - return ord(self.pa... [truncated message content] |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-13 09:28:16
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 244 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c Log: remi 2007-04-13 11:28:15 +0200 (Fri, 13 Apr 2007) 79 UPD Use of the 'TUX_MAX_TCP_CLIENTS' constant in the function 'tcp_remove_clien svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-13 09:24:31 UTC (rev 243) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-13 09:28:15 UTC (rev 244) @@ -262,7 +262,7 @@ tcp_clients_handle[id_client] = -1; tcp_clients_count--; close(tmp_handle); - for(i = id_client; i < 255; i++) + for(i = id_client; i < TUX_MAX_TCP_CLIENTS-1; i++) { tcp_clients_handle[i] = tcp_clients_handle[i+1]; for(j = 0; j < 16; j++) |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-13 09:25:00
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 243 Modified: daemon/trunk/libs/USBDaemon_command_tux.c daemon/trunk/libs/USBDaemon_tcp_server.c daemon/trunk/libs/USBDaemon_tcp_server.h daemon/trunk/libs/USBDaemon_usb_enum.c daemon/trunk/libs/USBDaemon_usb_readWrite.c Log: remi 2007-04-13 11:24:31 +0200 (Fri, 13 Apr 2007) 156 UPD Function to disconnect a client has been added. This function cleans the 'tcp_clients_handle' table. The detection of the dongle presence has been moved svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-04-13 08:48:33 UTC (rev 242) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-04-13 09:24:31 UTC (rev 243) @@ -236,9 +236,7 @@ /* Byte 2 equal id client to disconnect */ if (tcp_clients_handle[data[1]] >= 0) { - tcp_clients_handle[data[1]] = -1; - tcp_clients_count--; - printf("TCP socket : Client %d is disconnected\n", data[1]); + tcp_remove_client(data[1]); result[0] = ACK_CMD_OK; } else @@ -249,10 +247,7 @@ break; case SUB_D_CMD_STRUC_DISCONNECT_CLIENT_ME: pthread_mutex_lock(&tcp_mutex); - close(tcp_clients_handle[id_client]); - tcp_clients_handle[id_client] = -1; - tcp_clients_count--; - printf("TCP socket : Client %d is disconnected\n", id_client); + tcp_remove_client(id_client); result[0] = ACK_CMD_NO_ACK; pthread_mutex_unlock(&tcp_mutex); break; Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-13 08:48:33 UTC (rev 242) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-13 09:24:31 UTC (rev 243) @@ -161,10 +161,7 @@ r = recv(tcp_clients_handle[i], datas_recv, sizeof(datas_recv), 0); if (r == 0) { - close(tcp_clients_handle[i]); - tcp_clients_handle[i] = -1; - tcp_clients_count--; - printf("TCP socket : Client %d is disconnected READ\n", i); + tcp_remove_client(i); } else if (r > 0) { @@ -200,10 +197,7 @@ if (send(tcp_clients_handle[i], data, sizeof(tcp_frame_t), 0) == 0) { - close(tcp_clients_handle[i]); - tcp_clients_handle[i] = -1; - tcp_clients_count--; - printf("TCP socket : Client %d is disconnected WRITE ALL\n", i); + tcp_remove_client(i); } } @@ -227,10 +221,7 @@ { if (send(tcp_clients_handle[client_index], data, sizeof(tcp_frame_t), 0) == 0) { - close(tcp_clients_handle[client_index]); - tcp_clients_handle[client_index] = -1; - tcp_clients_count--; - printf("TCP socket : Client %d is disconnected WRITE client\n", client_index); + tcp_remove_client(client_index); } } @@ -258,3 +249,23 @@ usleep(10000); } + +/************************************************************************ */ +/* Remove a tcp client */ +/************************************************************************ */ +void tcp_remove_client(unsigned char id_client) +{ + unsigned char i,j; + int tmp_handle; + + tmp_handle = tcp_clients_handle[id_client]; + tcp_clients_handle[id_client] = -1; + tcp_clients_count--; + close(tmp_handle); + for(i = id_client; i < 255; i++) + { + tcp_clients_handle[i] = tcp_clients_handle[i+1]; + for(j = 0; j < 16; j++) + tcp_clients_name[i][j] = tcp_clients_name[i+1][j]; + } +} Modified: daemon/trunk/libs/USBDaemon_tcp_server.h =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-13 08:48:33 UTC (rev 242) +++ daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-13 09:24:31 UTC (rev 243) @@ -52,3 +52,4 @@ extern void tcp_server_send_raw(const tcp_frame_t data); 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); \ No newline at end of file Modified: daemon/trunk/libs/USBDaemon_usb_enum.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.c 2007-04-13 08:48:33 UTC (rev 242) +++ daemon/trunk/libs/USBDaemon_usb_enum.c 2007-04-13 09:24:31 UTC (rev 243) @@ -105,6 +105,8 @@ /************************************************************************ */ void usb_start_task() { + unsigned char dongle_is_present_counter; + pthread_mutex_init(&usb_mutex, NULL); /* Find Tux */ do @@ -145,8 +147,19 @@ send_usb_dongle_cmd(0x02, 0, 0, 0); current_audio_channel = 0; /* Read loop */ + dongle_is_present_counter = 0; while(tux_handle) { + /* Make circular the variable to 16 values */ + dongle_is_present_counter = (dongle_is_present_counter + 1) & 0x0F; + /* Once on 16, we test the presence of the dongle */ + if (dongle_is_present_counter == 0) + if (usb_find_TuxDroid() == NULL) + { + printf("Tux dongle is disconnected\n"); + send_daemon_disconnected(); + exit(1); + } usb_get_status_TuxDroid(); usleep(50000); } Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-04-13 08:48:33 UTC (rev 242) +++ daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-04-13 09:24:31 UTC (rev 243) @@ -26,8 +26,6 @@ #include "USBDaemon_status_table.h" #include "USBDaemon_tcp_server.h" #include "USBDaemon_usb_readWrite.h" -/*_____________________ V A R I A B L E S __________________________________*/ -unsigned char busy_count = 0; /*_____________________ F U N C T I O N S __________________________________*/ /************************************************************************ */ @@ -88,21 +86,10 @@ sizeof(cmd_send), TUX_WRITE_TIMEOUT); if (idx <= 0) { - busy_count++; - if (busy_count > 9) - { - printf("Error : Tux dongle is busy or disconnected\n"); - send_daemon_disconnected(); - - pthread_mutex_unlock(&usb_mutex); - exit(1); - } - pthread_mutex_unlock(&usb_mutex); return; } - busy_count = 0; idx = usb_interrupt_read(tux_handle, TUX_READ_EP, (char*)data, sizeof(data), TUX_READ_TIMEOUT); if (idx <= 0) |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-13 08:49:15
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 242 Modified: daemon/trunk/main.c Log: remi 2007-04-13 10:48:33 +0200 (Fri, 13 Apr 2007) 54 UPD Limit to one the number of instances of the daemon svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-04-11 19:41:17 UTC (rev 241) +++ daemon/trunk/main.c 2007-04-13 08:48:33 UTC (rev 242) @@ -185,6 +185,22 @@ } /************************************************************************ */ +/* Check the number of instances */ +/************************************************************************ */ +unsigned char single_instance() +{ + FILE* tmp; + char c; + unsigned char count; + count = 0; + tmp = popen("ps -e -o'%y %c' | grep tuxdaemon | wc --line","r"); + fread(&c, sizeof(char), 1, tmp); + pclose(tmp); + if ((char)c == (char)'1') return 1; + else return 0; +} + +/************************************************************************ */ /* USBDaemon main function */ /************************************************************************ */ int main(int argc, char *argv[]) @@ -197,6 +213,15 @@ unsigned char shell_view = 0; unsigned char daemonized = 0; + /* On exiting */ + signal(SIGINT, on_close_daemon); + signal(SIGKILL, on_close_daemon); + /* Only one instance of the daemon is authorized */ + if (!single_instance()) + { + printf("Tuxdaemon is already launched !\n"); + exit(0); + } /* Program arguments */ for (i = 1; i < argc; i++) { @@ -234,9 +259,6 @@ usb_set_debug(LIBUSB_DEBUG_LEVEL); usb_init(); #endif - /* On exiting */ - signal(SIGINT, on_close_daemon); - signal(SIGKILL, on_close_daemon); /* Gestion Multithread */ if (!g_thread_supported()) |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-11 19:41:22
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 241 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c Log: neimad 2007-04-11 21:41:17 +0200 (Wed, 11 Apr 2007) 228 * Fixed the client handling loop: replaced O_NONBLOCK+recv()+usleep() with select()+recv(). I left the locking untouched. And there are still usleep() calls in in several places. We should eventually get tid of them all. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-11 19:38:19 UTC (rev 240) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-11 19:41:17 UTC (rev 241) @@ -25,7 +25,8 @@ #include <sys/types.h> #include <unistd.h> #include <fcntl.h> -#include <sys/poll.h> +#include <sys/select.h> +#include <errno.h> #include "USBDaemon_globals.h" #include "USBDaemon_command_tux.h" #include "USBDaemon_status_table.h" @@ -47,12 +48,7 @@ /************************************************************************ */ void tcp_server_start_task() { - int tmp_client; - int client_added; tcp_frame_t datas_recv; - int i; - int rt_read; - int tmp_handle; int val; pthread_mutex_init(&tcp_mutex, NULL); @@ -92,64 +88,93 @@ } printf("TCP socket : opened\n"); tux_tcp_status = TUX_TCP_STATUS_UP; - fcntl(tcp_server_handle, F_SETFL, O_NONBLOCK); - while(tcp_server_handle) + + while (tcp_server_handle >= 0) { + fd_set rset; + int i, r, fdmax; + + FD_ZERO(&rset); + FD_SET(tcp_server_handle, &rset); + fdmax = tcp_server_handle; + /* Client connection */ pthread_mutex_lock(&tcp_mutex); - tmp_client = accept(tcp_server_handle, (struct sockaddr *)NULL, NULL); - if (tmp_client >= 0) + for (i = 0; i < TUX_MAX_TCP_CLIENTS; i++) + if (tcp_clients_handle[i] >= 0) + { + FD_SET(tcp_clients_handle[i], &rset); + if (tcp_clients_handle[i] > fdmax) + fdmax = tcp_clients_handle[i]; + } + pthread_mutex_unlock(&tcp_mutex); + + r = select(fdmax + 1, &rset, NULL, NULL, NULL); + if (r < 0) { - fcntl(tmp_client, F_SETFL, O_NONBLOCK); - printf("TCP socket : accept OK\n"); + if (errno == EINTR) + continue; + break; + } - client_added = 0; - for (i = 0; i < TUX_MAX_TCP_CLIENTS; i++) + /* Incoming connection request ? */ + pthread_mutex_lock(&tcp_mutex); + if (FD_ISSET(tcp_server_handle, &rset)) + { + int tmp_client = + accept(tcp_server_handle, (struct sockaddr *)NULL, NULL); + + if (tmp_client < 0) + fprintf(stderr, "accept failed: %m\n"); + else { - if (tcp_clients_handle[i] < 0) + int client_added = 0; + + for (i = 0; i < TUX_MAX_TCP_CLIENTS; i++) + if (tcp_clients_handle[i] < 0) + { + tcp_clients_handle[i] = tmp_client; + tcp_clients_count++; + client_added = 1; + break; + } + + if (client_added) + printf("client %d connected\n", i); + else { - tcp_clients_handle[i] = tmp_client; - tcp_clients_count++; - client_added = 1; - break; + fprintf(stderr, "client rejected: client table full\n"); + close(tmp_client); } } - - if (!client_added) - { - printf("TCP socket : client not accepted : client table is full\n"); - close(tmp_handle); - } } /* Receive messages from clients */ for (i = 0; i < TUX_MAX_TCP_CLIENTS; i++) { - if (tcp_clients_handle[i] >= 0) + int r; + + if (tcp_clients_handle[i] < 0 + || !FD_ISSET(tcp_clients_handle[i], &rset)) + continue; + + r = recv(tcp_clients_handle[i], datas_recv, sizeof(datas_recv), 0); + if (r == 0) { - rt_read = recv(tcp_clients_handle[i], datas_recv, sizeof(datas_recv), 0); - if (rt_read == 0) - { - close(tcp_clients_handle[i]); - tcp_clients_handle[i] = -1; - tcp_clients_count--; - printf("TCP socket : Client %d is disconnected READ\n", i); - } - else if (rt_read > 0) - { - pthread_mutex_unlock(&tcp_mutex); - commands_dispatcher((unsigned char)i, datas_recv); - pthread_mutex_lock(&tcp_mutex); - } + close(tcp_clients_handle[i]); + tcp_clients_handle[i] = -1; + tcp_clients_count--; + printf("TCP socket : Client %d is disconnected READ\n", i); } - - pthread_mutex_unlock(&tcp_mutex); - usleep(1000); - pthread_mutex_lock(&tcp_mutex); + else if (r > 0) + { + pthread_mutex_unlock(&tcp_mutex); + commands_dispatcher((unsigned char)i, datas_recv); + pthread_mutex_lock(&tcp_mutex); + } } pthread_mutex_unlock(&tcp_mutex); - usleep(1000); } } |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-11 19:39:02
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 240 Modified: daemon/trunk/libs/USBDaemon_command_tux.c daemon/trunk/libs/USBDaemon_status_table.c daemon/trunk/libs/USBDaemon_tcp_server.c daemon/trunk/libs/USBDaemon_tcp_server.h Log: neimad 2007-04-11 21:38:19 +0200 (Wed, 11 Apr 2007) 695 * Defined type tcp_frame_t, which is for now merely a typedef on unsigned char [16]. Will need some more encapsulation (initialization function, for instance). * Removed the data/frame size parameter of most comm functions as it was always 16 (now sizeof(tcp_frame_t)). * Got rid of tcp_clients_table_size, which was meant to "optimize" somehow the iterations on the client handles array. In fact it was incremented but never decremented, and it won't be of any use with the upcoming select() patch anyway. * Unused client handles are -1, not 0, as 0 is theorically a valid file descriptor. Should have been in a separate patch, but I'm too tired to split that right now. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-04-11 19:31:41 UTC (rev 239) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-04-11 19:38:19 UTC (rev 240) @@ -35,24 +35,25 @@ /************************************************************************** */ void commands_dispatcher( unsigned char client_id, /* Client source */ - unsigned char src_frame[16]) /* Source frame */ + tcp_frame_t src_frame) /* Source frame */ { unsigned char ACK_DP; /* daemon processing ack */ unsigned char data[12]; /* data part of source frame */ unsigned char result[12]; /* result data to return */ - unsigned char tcp_frame[16];/* tcp frame to send */ - unsigned char ack_dp_frame[16]; - unsigned char i; + tcp_frame_t tcp_frame; /* tcp frame to send */ + tcp_frame_t ack_dp_frame; + int i; unsigned char no_ack; no_ack = 0; /* Cut data part of source frame */ - for(i = 0; i < 12; i++) + for (i = 0; i < sizeof(tcp_frame_t) - 4; i++) { result[i] = 0; data[i] = src_frame[i + 4]; } + /* Make source header */ tcp_frame[0] = src_frame[0]; /* return source */ tcp_frame[1] = src_frame[1]; /* return sub source */ @@ -194,22 +195,26 @@ } /* Paste result treatement into tcp frame */ - for(i = 0; i < 12; i++) + for (i = 0; i < sizeof(tcp_frame_t) - 4; i++) tcp_frame[i + 4] = result[i]; + /* Send daemon processing ack to client */ - for(i = 0; i < 16; i++)ack_dp_frame[i] = 0; + for (i = 0; i < sizeof(tcp_frame_t); i++) + ack_dp_frame[i] = '\0'; + ack_dp_frame[0] = src_frame[0]; ack_dp_frame[1] = src_frame[1]; ack_dp_frame[2] = DATA_TP_ACK_DP; ack_dp_frame[3] = src_frame[3]; ack_dp_frame[4] = ACK_DP; - if(!no_ack) + + if (!no_ack) { - tcp_server_send_raw_to_client(client_id, ack_dp_frame, 16); + tcp_server_send_raw_to_client(client_id, ack_dp_frame); /* Send tcp frame to client */ if(ACK_DP == ACK_DP_OK) { - tcp_server_send_raw_to_client(client_id, tcp_frame, 16); + tcp_server_send_raw_to_client(client_id, tcp_frame); } } } @@ -221,23 +226,17 @@ /******************************************************************** */ /* 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 data[], unsigned char result[], + int id_client) { - unsigned char i; - int my_client_handle; - switch (data[0]) { case SUB_D_CMD_STRUC_DISCONNECT_CLIENT: pthread_mutex_lock(&tcp_mutex); /* Byte 2 equal id client to disconnect */ - if (tcp_clients_handle[data[1]] != 0) + if (tcp_clients_handle[data[1]] >= 0) { - tcp_clients_handle[data[1]] = 0; + tcp_clients_handle[data[1]] = -1; tcp_clients_count--; printf("TCP socket : Client %d is disconnected\n", data[1]); result[0] = ACK_CMD_OK; @@ -250,11 +249,10 @@ break; case SUB_D_CMD_STRUC_DISCONNECT_CLIENT_ME: pthread_mutex_lock(&tcp_mutex); - my_client_handle = tcp_clients_handle[id_client]; - tcp_clients_handle[id_client] = 0; + close(tcp_clients_handle[id_client]); + tcp_clients_handle[id_client] = -1; tcp_clients_count--; printf("TCP socket : Client %d is disconnected\n", id_client); - close(my_client_handle); result[0] = ACK_CMD_NO_ACK; pthread_mutex_unlock(&tcp_mutex); break; @@ -265,10 +263,14 @@ exit(0); break; case SUB_D_CMD_STRUC_DEFINE_CLIENT_NAME: - for(i = 0; i < 11; i++) - tcp_clients_name[id_client][i] = data[i + 1]; - result[0] = ACK_CMD_OK; - printf("Name of client %d is %s\n", id_client, tcp_clients_name[id_client]); + { + int i; + for (i = 0; i < 11; i++) + tcp_clients_name[id_client][i] = data[i + 1]; + result[0] = ACK_CMD_OK; + printf("Name of client %d is %s\n", id_client, + tcp_clients_name[id_client]); + } break; } } Modified: daemon/trunk/libs/USBDaemon_status_table.c =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.c 2007-04-11 19:31:41 UTC (rev 239) +++ daemon/trunk/libs/USBDaemon_status_table.c 2007-04-11 19:38:19 UTC (rev 240) @@ -103,10 +103,12 @@ /************************************************************************ */ void update_system_status_table(unsigned char new_status[4]) { - unsigned char tcp_frame[16]; + tcp_frame_t tcp_frame; unsigned char i; - for(i = 0;i < 16;i++)tcp_frame[i] = 0; + for (i = 0; i < sizeof(tcp_frame); i++) + tcp_frame[i] = '\0'; + tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; tcp_frame[2] = DATA_TP_RSP; @@ -119,7 +121,7 @@ RF_status = new_status[1]; tcp_frame[4] = DATA_STATUS_RF_CONNECTED; tcp_frame[5] = RF_status; - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* Command status change */ if(CMD_status != new_status[2]) @@ -191,7 +193,7 @@ unsigned char toggle; unsigned char check; unsigned char new_code; - unsigned char tcp_frame[16]; + tcp_frame_t tcp_frame; unsigned char i; code = new_status[1] & 0x3F; @@ -219,14 +221,18 @@ if(new_code) { printf("Remote code : %.2x\n", code); - for(i = 6;i < 16;i++)tcp_frame[i] = 0; + + for (i = 0; i < sizeof(tcp_frame); i++) + tcp_frame[i] = '\0'; + tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; tcp_frame[2] = DATA_TP_RSP; tcp_frame[3] = SUBDATA_TP_STATUS; tcp_frame[4] = DATA_STATUS_IR_CODE; tcp_frame[5] = code; - tcp_server_send_raw(tcp_frame, 16); + + tcp_server_send_raw(tcp_frame); } } @@ -235,10 +241,11 @@ /************************************************************************ */ void pong_event(unsigned char pong_number, unsigned char pong_received) { - unsigned char tcp_frame[16]; + tcp_frame_t tcp_frame; unsigned char i; - for(i = 0;i < 16;i++)tcp_frame[i] = 0; + for (i = 0; i < sizeof(tcp_frame); i++) + tcp_frame[i] = '\0'; tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -247,7 +254,8 @@ tcp_frame[4] = DATA_STATUS_PONG; tcp_frame[5] = pong_number; tcp_frame[6] = pong_received; - tcp_server_send_raw(tcp_frame, 16); + + tcp_server_send_raw(tcp_frame); } /************************************************************************ */ @@ -255,10 +263,11 @@ /************************************************************************ */ void portb_changed(unsigned char new_value) { - unsigned char tcp_frame[16]; + tcp_frame_t tcp_frame; unsigned char i; - for(i = 0;i < 16;i++)tcp_frame[i] = 0; + for (i = 0; i < sizeof(tcp_frame); i++) + tcp_frame[i] = '\0'; tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -279,7 +288,7 @@ printf("wings motor backward 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* spin motor backward */ if((portb.Byte & 0x02) != (new_value & 0x02)) @@ -295,7 +304,7 @@ printf("spin motor backward 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* spin motor forward */ if((portb.Byte & 0x04) != (new_value & 0x04)) @@ -311,7 +320,7 @@ printf("spin motor forward 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* mouth open position motor */ if((portb.Byte & 0x08) != (new_value & 0x08)) @@ -329,7 +338,7 @@ printf("mouth open position 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* mouth close position motor */ if((portb.Byte & 0x10) != (new_value & 0x10)) @@ -345,7 +354,7 @@ printf("mouth close position 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* charger inhibit signal */ if((portb.Byte & 0x40) != (new_value & 0x40)) @@ -361,7 +370,7 @@ printf("charger inhibit signal 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } portb.Byte = new_value; } @@ -371,15 +380,17 @@ /************************************************************************ */ void portc_changed(unsigned char new_value) { - unsigned char tcp_frame[16]; + tcp_frame_t tcp_frame; unsigned char i; - for(i = 0;i < 16;i++)tcp_frame[i] = 0; + for (i = 0; i < sizeof(tcp_frame); i++) + tcp_frame[i] = '\0'; tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; tcp_frame[2] = DATA_TP_RSP; tcp_frame[3] = SUBDATA_TP_STATUS; + /* wings position switch */ if((portc.Byte & 0x02) != (new_value & 0x02)) { @@ -394,7 +405,7 @@ printf("wings position switch 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* right blue led */ if((portc.Byte & 0x04) != (new_value & 0x04)) @@ -410,7 +421,7 @@ printf("right blue led on\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* left blue led */ if((portc.Byte & 0x08) != (new_value & 0x08)) @@ -426,7 +437,7 @@ printf("left blue led on\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } portc.Byte = new_value; } @@ -436,15 +447,17 @@ /************************************************************************ */ void portd_changed(unsigned char new_value) { - unsigned char tcp_frame[16]; + tcp_frame_t tcp_frame; unsigned char i; - for(i = 0;i < 16;i++)tcp_frame[i] = 0; + for (i = 0; i < sizeof(tcp_frame); i++) + tcp_frame[i] = '\0'; tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; tcp_frame[2] = DATA_TP_RSP; tcp_frame[3] = SUBDATA_TP_STATUS; + /* head motor for eyes */ if((portd.Byte & 0x01) != (new_value & 0x01)) { @@ -459,7 +472,7 @@ printf("head motor for eyes 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* head motor for mouth */ if((portd.Byte & 0x02) != (new_value & 0x02)) @@ -475,7 +488,7 @@ printf("head motor for mouth 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16);; + tcp_server_send_raw(tcp_frame); } /* spin position switch */ if((portd.Byte & 0x08) != (new_value & 0x08)) @@ -491,7 +504,7 @@ printf("spin position switch 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* wings motor forward */ if((portd.Byte & 0x10) != (new_value & 0x10)) @@ -507,7 +520,7 @@ printf("wings motor forward 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* IR led */ if((portd.Byte & 0x20) != (new_value & 0x20)) @@ -523,7 +536,7 @@ printf("IR led 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* eyes open position switch */ if((portd.Byte & 0x40) != (new_value & 0x40)) @@ -539,7 +552,7 @@ printf("eyes open position switch 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* eyes closed position switch */ if((portd.Byte & 0x80) != (new_value & 0x80)) @@ -555,7 +568,7 @@ printf("eyes closed position switch 1\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } portd.Byte = new_value; } @@ -565,15 +578,17 @@ /************************************************************************ */ void sensors1_changed(unsigned char new_value) { - unsigned char tcp_frame[16]; + tcp_frame_t tcp_frame; unsigned char i; - for(i = 0;i < 16;i++)tcp_frame[i] = 0; + for (i = 0; i < sizeof(tcp_frame); i++) + tcp_frame[i] = '\0'; tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; tcp_frame[2] = DATA_TP_RSP; tcp_frame[3] = SUBDATA_TP_STATUS; + /* Left wing push */ if((sensors1.Byte & 0x01) != (new_value & 0x01)) { @@ -588,7 +603,7 @@ printf("Left wing button Down\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* Right wing push */ if((sensors1.Byte & 0x02) != (new_value & 0x02)) @@ -604,7 +619,7 @@ printf("Right wing button Down\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* power plug insertion switch */ if((sensors1.Byte & 0x04) != (new_value & 0x04)) @@ -620,7 +635,7 @@ printf("power plug insertion switch off\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* Head push */ if((sensors1.Byte & 0x08) != (new_value & 0x08)) @@ -636,7 +651,7 @@ printf("Head button Down\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* Led charger */ if((sensors1.Byte & 0x10) != (new_value & 0x10)) @@ -652,7 +667,7 @@ printf("Charger led 0\n"); tcp_frame[5] = 0; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } /* mute status */ if((sensors1.Byte & 0x80) != (new_value & 0x80)) @@ -668,7 +683,7 @@ printf("mute status on\n"); tcp_frame[5] = 1; } - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } sensors1.Byte = new_value; } @@ -681,10 +696,11 @@ unsigned char new_value_low, unsigned char new_light_mode) { - unsigned char tcp_frame[16]; + tcp_frame_t tcp_frame; unsigned char i; - for(i = 0;i < 16;i++)tcp_frame[i] = 0; + for (i = 0; i < sizeof(tcp_frame); i++) + tcp_frame[i] = '\0'; tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -692,9 +708,11 @@ tcp_frame[3] = SUBDATA_TP_STATUS; tcp_frame[4] = DATA_STATUS_LIGHT_LEVEL; + sensors2.level_light_high.Byte = new_value_high; sensors2.level_light_low.Byte = new_value_low; sensors2.light_mode.Byte = new_light_mode; + tcp_frame[5] = new_value_high; tcp_frame[6] = new_value_low; } @@ -707,10 +725,11 @@ unsigned char mouth_position, unsigned char wings_position) { - unsigned char tcp_frame[16]; + tcp_frame_t tcp_frame; unsigned char i; - for(i = 0;i < 16;i++)tcp_frame[i] = 0; + for (i = 0; i < sizeof(tcp_frame); i++) + tcp_frame[i] = '\0'; tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -722,21 +741,21 @@ position1.eyes_position.Byte = eyes_position; tcp_frame[4] = DATA_STATUS_EYES_POSITION_COUNTER; tcp_frame[5] = eyes_position; - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } if(position1.mouth_position.Byte != mouth_position) { position1.mouth_position.Byte = mouth_position; tcp_frame[4] = DATA_STATUS_MOUTH_POSITION_COUNTER; tcp_frame[5] = mouth_position; - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } if(position1.wings_position.Byte != wings_position) { position1.wings_position.Byte = wings_position; tcp_frame[4] = DATA_STATUS_WINGS_POSITION_COUNTER; tcp_frame[5] = wings_position; - tcp_server_send_raw(tcp_frame, 16); + tcp_server_send_raw(tcp_frame); } } @@ -745,10 +764,11 @@ /************************************************************************ */ void position2_changed(unsigned char spin_position) { - unsigned char tcp_frame[16]; + tcp_frame_t tcp_frame; unsigned char i; - for(i = 0; i < 16; i++)tcp_frame[i] = 0; + for (i = 0; i < sizeof(tcp_frame); i++) + tcp_frame[i] = '\0'; tcp_frame[0] = SOURCE_TUX; tcp_frame[1] = SS_DEFAULT; @@ -758,5 +778,6 @@ tcp_frame[4] = DATA_STATUS_SPIN_POSITION_COUNTER; position2.Byte = spin_position; tcp_frame[5] = spin_position; - tcp_server_send_raw(tcp_frame, 16); + + tcp_server_send_raw(tcp_frame); } Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-11 19:31:41 UTC (rev 239) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-11 19:38:19 UTC (rev 240) @@ -31,9 +31,9 @@ #include "USBDaemon_status_table.h" #include "USBDaemon_tcp_server.h" /*_____________________ V A R I A B L E S __________________________________*/ -int tcp_server_handle; -int tcp_clients_handle[TUX_MAX_TCP_CLIENTS]; -unsigned char tcp_clients_table_size = 0; +int tcp_server_handle = -1; +int tcp_clients_handle[TUX_MAX_TCP_CLIENTS] = + { [0 ... TUX_MAX_TCP_CLIENTS - 1] = -1 }; unsigned char tcp_clients_count = 0; client_name_t tcp_clients_name[TUX_MAX_TCP_CLIENTS]; struct sockaddr_in tcp_server_sockaddr; @@ -49,7 +49,7 @@ { int tmp_client; int client_added; - unsigned char datas_recv[16]; + tcp_frame_t datas_recv; int i; int rt_read; int tmp_handle; @@ -95,68 +95,59 @@ fcntl(tcp_server_handle, F_SETFL, O_NONBLOCK); while(tcp_server_handle) { - /* Demande de connection d'un client */ + /* Client connection */ pthread_mutex_lock(&tcp_mutex); - if ((tmp_client = accept(tcp_server_handle, (struct sockaddr *) NULL, NULL)) >= 0) + tmp_client = accept(tcp_server_handle, (struct sockaddr *)NULL, NULL); + if (tmp_client >= 0) { fcntl(tmp_client, F_SETFL, O_NONBLOCK); printf("TCP socket : accept OK\n"); + client_added = 0; - if (tcp_clients_table_size == TUX_MAX_TCP_CLIENTS - 1) + for (i = 0; i < TUX_MAX_TCP_CLIENTS; i++) { - printf("TCP socket : client not accepted : client table is full\n"); - close(tmp_handle); - } - for(i = 0;i < tcp_clients_table_size;i++) - { - if(tcp_clients_handle[i] == 0) + if (tcp_clients_handle[i] < 0) { tcp_clients_handle[i] = tmp_client; - client_added = 1; tcp_clients_count++; + client_added = 1; break; } } - if(!client_added) + + if (!client_added) { - tcp_clients_table_size++; - tcp_clients_handle[tcp_clients_table_size-1] = tmp_client; - tcp_clients_count++; + printf("TCP socket : client not accepted : client table is full\n"); + close(tmp_handle); } } - /* Reception de messages venant des clients */ - if(tcp_clients_table_size > 0) + + /* Receive messages from clients */ + for (i = 0; i < TUX_MAX_TCP_CLIENTS; i++) { - for(i = 0;i < tcp_clients_table_size;i++) + if (tcp_clients_handle[i] >= 0) { - if(tcp_clients_handle[i] > 0) + rt_read = recv(tcp_clients_handle[i], datas_recv, sizeof(datas_recv), 0); + if (rt_read == 0) { - /*rt_read = read(tcp_clients_handle[i], datas_recv, 16); */ - rt_read = recv(tcp_clients_handle[i], datas_recv, 16, 0); - if(rt_read < 0) - { - /* No datas */ - } - else if(rt_read == 0) - { - tmp_handle = tcp_clients_handle[i]; - tcp_clients_handle[i] = 0; - tcp_clients_count--; - close(tmp_handle); - printf("TCP socket : Client %d is disconnected READ\n", i); - } - else - { - pthread_mutex_unlock(&tcp_mutex); - commands_dispatcher((unsigned char)i, datas_recv); - pthread_mutex_lock(&tcp_mutex); - } + close(tcp_clients_handle[i]); + tcp_clients_handle[i] = -1; + tcp_clients_count--; + printf("TCP socket : Client %d is disconnected READ\n", i); } - pthread_mutex_unlock(&tcp_mutex); - usleep(1000); - pthread_mutex_lock(&tcp_mutex); + else if (rt_read > 0) + { + pthread_mutex_unlock(&tcp_mutex); + commands_dispatcher((unsigned char)i, datas_recv); + pthread_mutex_lock(&tcp_mutex); + } } + + pthread_mutex_unlock(&tcp_mutex); + usleep(1000); + pthread_mutex_lock(&tcp_mutex); } + pthread_mutex_unlock(&tcp_mutex); usleep(1000); } @@ -165,68 +156,59 @@ /************************************************************************ */ /* tcp_server_send_raw() */ /************************************************************************ */ -void tcp_server_send_raw( - unsigned char datas[64], - unsigned char datas_count) +void tcp_server_send_raw(const tcp_frame_t data) { int i; - int tmp_handle; pthread_mutex_lock(&tcp_mutex); + if (tux_tcp_status == TUX_TCP_STATUS_DOWN) { pthread_mutex_unlock(&tcp_mutex); return; } - if(tcp_clients_table_size == 0) + + for (i = 0; i < TUX_MAX_TCP_CLIENTS; i++) { - pthread_mutex_unlock(&tcp_mutex); - return; - } - for(i = 0;i < tcp_clients_table_size;i++) - { - if(tcp_clients_handle[i] > 0) + if (tcp_clients_handle[i] < 0) + continue; + + if (send(tcp_clients_handle[i], data, sizeof(tcp_frame_t), 0) == 0) { - if(send(tcp_clients_handle[i], datas, datas_count, 0) == 0) - { - tmp_handle = tcp_clients_handle[i]; - tcp_clients_handle[i] = 0; - printf("TCP socket : Client %d is disconnected WRITE ALL\n", i); - tcp_clients_count--; - close(tmp_handle); - } + close(tcp_clients_handle[i]); + tcp_clients_handle[i] = -1; + tcp_clients_count--; + printf("TCP socket : Client %d is disconnected WRITE ALL\n", i); } } + pthread_mutex_unlock(&tcp_mutex); } /************************************************************************ */ /* tcp_server_send_raw_to_client() */ /************************************************************************ */ -void tcp_server_send_raw_to_client( - int client_index, - unsigned char datas[64], - unsigned char datas_count) +void tcp_server_send_raw_to_client(int client_index, const tcp_frame_t data) { - int tmp_handle; - pthread_mutex_lock(&tcp_mutex); + if (tux_tcp_status == TUX_TCP_STATUS_DOWN) { pthread_mutex_unlock(&tcp_mutex); return; } - if(tcp_clients_handle[client_index] != 0) + + if (tcp_clients_handle[client_index] >= 0) { - if(send(tcp_clients_handle[client_index], datas, datas_count, 0) == 0) + if (send(tcp_clients_handle[client_index], data, sizeof(tcp_frame_t), 0) == 0) { - tmp_handle = tcp_clients_handle[client_index]; - tcp_clients_handle[client_index] = 0; - printf("TCP socket : Client %d is disconnected WRITE client\n", client_index); + close(tcp_clients_handle[client_index]); + tcp_clients_handle[client_index] = -1; tcp_clients_count--; - close(tmp_handle); + printf("TCP socket : Client %d is disconnected WRITE client\n", client_index); } } + pthread_mutex_unlock(&tcp_mutex); } @@ -235,15 +217,19 @@ /************************************************************************ */ void send_daemon_disconnected() { - unsigned char send_data[64]; - send_data[0] = SOURCE_SUB_DAEMON; - send_data[1] = SS_DEFAULT; - send_data[2] = DATA_TP_CMD; - send_data[3] = SUBDATA_TP_STRUCT; - send_data[4] = SUB_D_CMD_STRUC_DISCONNECT_CLIENT; - tcp_server_send_raw(send_data, 16); + tcp_frame_t data; + + data[0] = SOURCE_SUB_DAEMON; + data[1] = SS_DEFAULT; + data[2] = DATA_TP_CMD; + data[3] = SUBDATA_TP_STRUCT; + data[4] = SUB_D_CMD_STRUC_DISCONNECT_CLIENT; + + tcp_server_send_raw(data); + pthread_mutex_lock(&tcp_mutex); close(tcp_server_handle); pthread_mutex_unlock(&tcp_mutex); + usleep(10000); } Modified: daemon/trunk/libs/USBDaemon_tcp_server.h =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-11 19:31:41 UTC (rev 239) +++ daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-11 19:38:19 UTC (rev 240) @@ -38,6 +38,10 @@ /*_____________________ T Y P E _ D E F ____________________________________*/ #define CLIENT_NAME_LEN 15 typedef unsigned char client_name_t[CLIENT_NAME_LEN + 1]; + +#define TCP_FRAME_SIZE 16 +typedef unsigned char tcp_frame_t[TCP_FRAME_SIZE]; + /*_____________________ V A R I A B L E S ___________________________________*/ extern int tcp_clients_handle[]; extern unsigned char tcp_clients_count; @@ -45,6 +49,6 @@ extern pthread_mutex_t tcp_mutex; /*_____________________ F U N C T I O N S __________________________________*/ extern void tcp_server_start_task(); -extern void tcp_server_send_raw(unsigned char datas[64], unsigned char datas_count); -extern void tcp_server_send_raw_to_client(int client_index, unsigned char datas[64], unsigned char datas_count); +extern void tcp_server_send_raw(const tcp_frame_t data); +extern void tcp_server_send_raw_to_client(int client_index, const tcp_frame_t data); extern void send_daemon_disconnected(); |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-11 19:33:43
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 239 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c daemon/trunk/libs/USBDaemon_usb_enum.c daemon/trunk/main.c Log: doegox 2007-04-11 21:31:41 +0200 (Wed, 11 Apr 2007) 256 setuid/setgid to nobody:nogroup once the USB descriptor is opened so we can be more confident starting the daemon as root via udev. For extra security tcp_server thread is suspended till usb_thread does the setuid so we try to minimize what's done as root. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-09 23:16:56 UTC (rev 238) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-11 19:31:41 UTC (rev 239) @@ -38,7 +38,8 @@ client_name_t tcp_clients_name[TUX_MAX_TCP_CLIENTS]; struct sockaddr_in tcp_server_sockaddr; tux_tcp_status_t tux_tcp_status = TUX_TCP_STATUS_DOWN; -pthread_mutex_t tcp_mutex; +pthread_mutex_t tcp_mutex, dropcond_mutex; +extern pthread_cond_t dropcond; /*_____________________ F U N C T I O N S __________________________________*/ /************************************************************************ */ @@ -55,6 +56,9 @@ int val; pthread_mutex_init(&tcp_mutex, NULL); + pthread_mutex_init(&dropcond_mutex, NULL); + /* Wait for privileges to be dropped */ + pthread_cond_wait(&dropcond, &dropcond_mutex); if ((tcp_server_handle = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { printf("TCP socket : server error\n"); Modified: daemon/trunk/libs/USBDaemon_usb_enum.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.c 2007-04-09 23:16:56 UTC (rev 238) +++ daemon/trunk/libs/USBDaemon_usb_enum.c 2007-04-11 19:31:41 UTC (rev 239) @@ -33,6 +33,7 @@ struct usb_device* tux_device; TUX_USB_CONN_STATUS TUX_USB_STATUS = TUX_USB_DISCONNECTED; pthread_mutex_t usb_mutex; +extern pthread_cond_t dropcond; /*_____________________ F U N C T I O N S __________________________________*/ /************************************************************************ */ @@ -75,6 +76,8 @@ printf("Can't open device: %s (%d)\n", strerror(errno), errno); return NULL; } + setgid(65534); + setuid(65534); /* Claim device interface */ error = usb_claim_interface(tux_hdl, TUX_INTERFACE); if (error != 0) @@ -133,6 +136,9 @@ exit(1); } + /* Signals that root privileges were dropped */ + pthread_cond_signal(&dropcond); + usleep(50000); TUX_USB_STATUS = TUX_USB_CONNECTED; /* Reinit audio channel */ Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-04-09 23:16:56 UTC (rev 238) +++ daemon/trunk/main.c 2007-04-11 19:31:41 UTC (rev 239) @@ -53,6 +53,7 @@ unsigned char show_raw_status = 0; unsigned char show_invalid_raw = 0; unsigned short daemon_pid = 0; +pthread_cond_t dropcond; /************************************************************************ */ /* Setup daemon info from version string */ @@ -248,6 +249,7 @@ return 1; } + pthread_cond_init(&dropcond, 0); /* Start USB task thread */ UsbThread = g_thread_create((GThreadFunc)usb_start_task, NULL, TRUE, &error); |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 23:17:29
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 238 Modified: firmware/tuxcore/trunk/ir.h Log: doegox 2007-04-10 01:16:56 +0200 (Tue, 10 Apr 2007) 29 ref website for RC5 had moved svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: firmware/tuxcore/trunk/ir.h =================================================================== --- firmware/tuxcore/trunk/ir.h 2007-04-09 14:49:31 UTC (rev 237) +++ firmware/tuxcore/trunk/ir.h 2007-04-09 23:16:56 UTC (rev 238) @@ -100,7 +100,7 @@ * \note Tux can't send and receive IR at the same time because the code sent is also detected by the receiver and also because they share the same timer. So irSendRC5 will disable irGetRC5 when sending data. * * Send an ir code following the Philips RC-5 Protocol. The RC-5 code from Philips is possibly the most used protocol by hobbyists, probably because of the wide availability of cheap remote controls. - * For more information on a couple of protocols, visit http://www.xs4all.nl/~sbp/knowledge/ir/rc5.htm or google for it :-) + * For more information on a couple of protocols, visit http://www.sbprojects.com/knowledge/ir/rc5.htm or google for it :-) */ void irSendRC5(uint8_t address, uint8_t command); |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 14:49:35
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 237 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c daemon/trunk/libs/USBDaemon_tcp_server.h Log: neimad 2007-04-09 16:49:31 +0200 (Mon, 09 Apr 2007) 368 * Renamed _client_name to client_name_t for consistency's sake and defined constant for its length, CLIENT_NAME_LEN. sub_daemon_cmd_struct() and sub_daemon_req_info() only set and get 11 bytes of the current 16 bytes of client_name_t, don't know why. Also, is there any insurance that the data from which a client name is set will also be zero terminated ? svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-09 09:10:06 UTC (rev 236) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-09 14:49:31 UTC (rev 237) @@ -35,7 +35,7 @@ int tcp_clients_handle[TUX_MAX_TCP_CLIENTS]; unsigned char tcp_clients_table_size = 0; unsigned char tcp_clients_count = 0; -_client_name tcp_clients_name[TUX_MAX_TCP_CLIENTS]; +client_name_t tcp_clients_name[TUX_MAX_TCP_CLIENTS]; struct sockaddr_in tcp_server_sockaddr; tux_tcp_status_t tux_tcp_status = TUX_TCP_STATUS_DOWN; pthread_mutex_t tcp_mutex; Modified: daemon/trunk/libs/USBDaemon_tcp_server.h =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-09 09:10:06 UTC (rev 236) +++ daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-09 14:49:31 UTC (rev 237) @@ -36,11 +36,12 @@ TUX_TCP_STATUS_UP = 1 } tux_tcp_status_t; /*_____________________ T Y P E _ D E F ____________________________________*/ -typedef unsigned char _client_name[16]; +#define CLIENT_NAME_LEN 15 +typedef unsigned char client_name_t[CLIENT_NAME_LEN + 1]; /*_____________________ V A R I A B L E S ___________________________________*/ extern int tcp_clients_handle[]; extern unsigned char tcp_clients_count; -extern _client_name tcp_clients_name[]; +extern client_name_t tcp_clients_name[]; extern pthread_mutex_t tcp_mutex; /*_____________________ F U N C T I O N S __________________________________*/ extern void tcp_server_start_task(); |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 09:10:09
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 236 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c daemon/trunk/libs/USBDaemon_tcp_server.h Log: neimad 2007-04-09 11:10:06 +0200 (Mon, 09 Apr 2007) 82 * Defined TUX_MAX_TCP_CLIENTS. Replaces hardcoded constant 256 where relevant. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-09 09:07:52 UTC (rev 235) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-09 09:10:06 UTC (rev 236) @@ -32,10 +32,10 @@ #include "USBDaemon_tcp_server.h" /*_____________________ V A R I A B L E S __________________________________*/ int tcp_server_handle; -int tcp_clients_handle[256]; +int tcp_clients_handle[TUX_MAX_TCP_CLIENTS]; unsigned char tcp_clients_table_size = 0; unsigned char tcp_clients_count = 0; -_client_name tcp_clients_name[256]; +_client_name tcp_clients_name[TUX_MAX_TCP_CLIENTS]; struct sockaddr_in tcp_server_sockaddr; tux_tcp_status_t tux_tcp_status = TUX_TCP_STATUS_DOWN; pthread_mutex_t tcp_mutex; @@ -98,7 +98,7 @@ fcntl(tmp_client, F_SETFL, O_NONBLOCK); printf("TCP socket : accept OK\n"); client_added = 0; - if(tcp_clients_table_size == 255) + if (tcp_clients_table_size == TUX_MAX_TCP_CLIENTS - 1) { printf("TCP socket : client not accepted : client table is full\n"); close(tmp_handle); Modified: daemon/trunk/libs/USBDaemon_tcp_server.h =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-09 09:07:52 UTC (rev 235) +++ daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-09 09:10:06 UTC (rev 236) @@ -28,6 +28,7 @@ /*_____________________ D E F I N E S ______________________________________*/ #define TUX_SERVER_MAXLINES 4096 #define TUX_SERVER_PORT 5000 +#define TUX_MAX_TCP_CLIENTS 256 /*_____________________ D E F I N E S ______________________________________*/ typedef enum { @@ -37,9 +38,9 @@ /*_____________________ T Y P E _ D E F ____________________________________*/ typedef unsigned char _client_name[16]; /*_____________________ V A R I A B L E S ___________________________________*/ -extern int tcp_clients_handle[256]; +extern int tcp_clients_handle[]; extern unsigned char tcp_clients_count; -extern _client_name tcp_clients_name[256]; +extern _client_name tcp_clients_name[]; extern pthread_mutex_t tcp_mutex; /*_____________________ F U N C T I O N S __________________________________*/ extern void tcp_server_start_task(); |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 09:07:57
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 235 Modified: daemon/trunk/libs/USBDaemon_tcp_server.c daemon/trunk/libs/USBDaemon_tcp_server.h Log: neimad 2007-04-09 11:07:52 +0200 (Mon, 09 Apr 2007) 211 * Made name of TCP status type consistent with its values: it is now tux_tcp_status_t instead of TUX_TCP_CONN_STATUS, which complies with the coding style and better matches its values (TUX_TCP_STATUS_xxx). svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-09 09:04:34 UTC (rev 234) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-04-09 09:07:52 UTC (rev 235) @@ -37,7 +37,7 @@ unsigned char tcp_clients_count = 0; _client_name tcp_clients_name[256]; struct sockaddr_in tcp_server_sockaddr; -TUX_TCP_CONN_STATUS TUX_TCP_STATUS = TUX_TCP_STATUS_DOWN; +tux_tcp_status_t tux_tcp_status = TUX_TCP_STATUS_DOWN; pthread_mutex_t tcp_mutex; /*_____________________ F U N C T I O N S __________________________________*/ @@ -87,7 +87,7 @@ return; } printf("TCP socket : opened\n"); - TUX_TCP_STATUS = TUX_TCP_STATUS_UP; + tux_tcp_status = TUX_TCP_STATUS_UP; fcntl(tcp_server_handle, F_SETFL, O_NONBLOCK); while(tcp_server_handle) { @@ -169,7 +169,7 @@ int tmp_handle; pthread_mutex_lock(&tcp_mutex); - if(TUX_TCP_STATUS == TUX_TCP_STATUS_DOWN) + if (tux_tcp_status == TUX_TCP_STATUS_DOWN) { pthread_mutex_unlock(&tcp_mutex); return; @@ -207,7 +207,7 @@ int tmp_handle; pthread_mutex_lock(&tcp_mutex); - if(TUX_TCP_STATUS == TUX_TCP_STATUS_DOWN) + if (tux_tcp_status == TUX_TCP_STATUS_DOWN) { pthread_mutex_unlock(&tcp_mutex); return; Modified: daemon/trunk/libs/USBDaemon_tcp_server.h =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-09 09:04:34 UTC (rev 234) +++ daemon/trunk/libs/USBDaemon_tcp_server.h 2007-04-09 09:07:52 UTC (rev 235) @@ -33,7 +33,7 @@ { TUX_TCP_STATUS_DOWN = 0, TUX_TCP_STATUS_UP = 1 -} TUX_TCP_CONN_STATUS; +} tux_tcp_status_t; /*_____________________ T Y P E _ D E F ____________________________________*/ typedef unsigned char _client_name[16]; /*_____________________ V A R I A B L E S ___________________________________*/ |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 09:04:36
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 234 Modified: daemon/trunk/main.c Log: neimad 2007-04-09 11:04:34 +0200 (Mon, 09 Apr 2007) 208 * Simplified fd_nullify() a bit by avoiding "else" construct as it was unnecessary. * Removed condition on the number of arguments on the commandline: the loop's lowest bound already takes care of that. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-04-09 08:56:29 UTC (rev 233) +++ daemon/trunk/main.c 2007-04-09 09:04:34 UTC (rev 234) @@ -110,17 +110,17 @@ int saved_errno; close(desired_fd); + fd = open("/dev/null", O_WRONLY, S_IRUSR | S_IWUSR); if (fd == desired_fd || fd < 0) return fd; - else - { - fd2 = fcntl(fd, F_DUPFD, desired_fd); - saved_errno = errno; - close(fd); - errno = saved_errno; - return fd2; - } + + fd2 = fcntl(fd, F_DUPFD, desired_fd); + saved_errno = errno; + close(fd); + errno = saved_errno; + + return fd2; } /************************************************************************ */ @@ -197,31 +197,28 @@ unsigned char daemonized = 0; /* Program arguments */ - if (argc > 1) + for (i = 1; i < argc; i++) { - for (i = 1; i < argc; i++) - { - if (!strcmp("-v", argv[i])) - shell_view = 1; - else if (!strcmp("-d", argv[i])) - daemonized = 1; - else if (!strcmp("-st", argv[i])) - show_frames = 1; - else if (!strcmp("-sr", argv[i])) - show_raw_status = 1; - else if (!strcmp("-si", argv[i])) - show_invalid_raw = 1; - else if (!strcmp("-h", argv[i])) - { - usage(); - exit(1); - } - else - { - usage(); - exit(1); - } - } + if (!strcmp("-v", argv[i])) + shell_view = 1; + else if (!strcmp("-d", argv[i])) + daemonized = 1; + else if (!strcmp("-st", argv[i])) + show_frames = 1; + else if (!strcmp("-sr", argv[i])) + show_raw_status = 1; + else if (!strcmp("-si", argv[i])) + show_invalid_raw = 1; + else if (!strcmp("-h", argv[i])) + { + usage(); + exit(1); + } + else + { + usage(); + exit(1); + } } if (daemonized) |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 08:56:31
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 233 Modified: daemon/trunk/main.c Log: neimad 2007-04-09 10:56:29 +0200 (Mon, 09 Apr 2007) 144 * Separate the parsing of the version string from its display. Generally not a good idea to have printing with side effects on internals ;) svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-04-09 08:51:30 UTC (rev 232) +++ daemon/trunk/main.c 2007-04-09 08:56:29 UTC (rev 233) @@ -55,9 +55,9 @@ unsigned short daemon_pid = 0; /************************************************************************ */ -/* Print_info_daemon */ +/* Setup daemon info from version string */ /************************************************************************ */ -static void print_info_daemon(void) +static void setup_daemon_info(void) { const char delimiters[] = " .-"; char cp[] = VERSION; @@ -65,15 +65,25 @@ if ((token = strtok(cp, delimiters)) != NULL) version.major = atoi(token); + if ((token = strtok(NULL, delimiters)) != NULL) version.minor = atoi(token); + if ((token = strtok(NULL, delimiters)) != NULL) version.release = atoi(token); + if ((token = strtok(NULL, delimiters)) != NULL) strncpy(version.maturity, token, sizeof(version.maturity)); + if ((token = strtok(NULL, delimiters)) != NULL) strncpy(version.release_status, token, sizeof(version.release_status)); +} +/************************************************************************ */ +/* Display daemon info on its standard output */ +/************************************************************************ */ +static void print_daemon_info(void) +{ printf("-----------------------------------\n"); printf("Tux USB Daemon version %s\n", VERSION); printf("Kysoh 2007.\n"); @@ -217,8 +227,9 @@ if (daemonized) daemonize(shell_view); - /* Print daemon informations */ - print_info_daemon(); + /* Setup & print daemon information */ + setup_daemon_info(); + print_daemon_info(); #ifdef USB_DEBUG /* Set libusb debug level */ |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 08:51:34
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 232 Modified: daemon/trunk/main.c Log: neimad 2007-04-09 10:51:30 +0200 (Mon, 09 Apr 2007) 31 * Yet more coding style fixes. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-04-09 08:49:16 UTC (rev 231) +++ daemon/trunk/main.c 2007-04-09 08:51:30 UTC (rev 232) @@ -93,20 +93,21 @@ /************************************************************************ */ /* Clean closing of STD IN-OUT FILENO*/ /************************************************************************ */ -static int fd_nullify (int desired_fd) +static int fd_nullify(int desired_fd) { int fd; int fd2; int saved_errno; - close (desired_fd); - fd = open ("/dev/null", O_WRONLY, S_IRUSR | S_IWUSR); + close(desired_fd); + fd = open("/dev/null", O_WRONLY, S_IRUSR | S_IWUSR); if (fd == desired_fd || fd < 0) return fd; - else { - fd2 = fcntl (fd, F_DUPFD, desired_fd); + else + { + fd2 = fcntl(fd, F_DUPFD, desired_fd); saved_errno = errno; - close (fd); + close(fd); errno = saved_errno; return fd2; } @@ -130,6 +131,7 @@ default : exit(0); } + umask(0); sid = setsid(); if (sid < 0) @@ -137,13 +139,16 @@ perror("sid"); exit(1); } + if (chdir("/") < 0) { perror("chdir"); exit(1); } + daemon_pid = (unsigned short)getpid(); printf("Tux USB Daemon started : pid = %d\n", (int)getpid()); + /* No shell */ if (!shell_view) { @@ -208,8 +213,10 @@ } } } + if (daemonized) daemonize(shell_view); + /* Print daemon informations */ print_info_daemon(); @@ -221,6 +228,7 @@ /* On exiting */ signal(SIGINT, on_close_daemon); signal(SIGKILL, on_close_daemon); + /* Gestion Multithread */ if (!g_thread_supported()) { @@ -233,19 +241,25 @@ } /* Start USB task thread */ - if ((UsbThread = g_thread_create((GThreadFunc)usb_start_task, NULL, TRUE, &error)) == NULL ) + UsbThread = g_thread_create((GThreadFunc)usb_start_task, NULL, TRUE, + &error); + if (UsbThread == NULL) { printf("Thread creation failed: %s \n", error->message); return 2; } /* Start TCP task thread */ - if ((TcpThread = g_thread_create((GThreadFunc)tcp_server_start_task, NULL, TRUE, &error)) == NULL ) + TcpThread = g_thread_create((GThreadFunc)tcp_server_start_task, NULL, TRUE, + &error); + if (TcpThread == NULL) { printf("Thread creation failed: %s \n", error->message); return 2; } + loop = g_main_loop_new(NULL, FALSE); g_main_loop_run(loop); + return 0; } |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 08:49:18
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 231 Modified: daemon/trunk/main.c Log: neimad 2007-04-09 10:49:16 +0200 (Mon, 09 Apr 2007) 39 * Made a few private functions static. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-04-09 08:45:54 UTC (rev 230) +++ daemon/trunk/main.c 2007-04-09 08:49:16 UTC (rev 231) @@ -57,7 +57,7 @@ /************************************************************************ */ /* Print_info_daemon */ /************************************************************************ */ -void print_info_daemon(void) +static void print_info_daemon(void) { const char delimiters[] = " .-"; char cp[] = VERSION; @@ -83,7 +83,7 @@ /************************************************************************ */ /* On_close_daemon */ /************************************************************************ */ -void on_close_daemon() +static void on_close_daemon(int sig) { send_daemon_disconnected(); printf("Daemon closed\n"); @@ -115,7 +115,7 @@ /************************************************************************ */ /* Daemonizer */ /************************************************************************ */ -void daemonize(unsigned char shell_view) +static void daemonize(unsigned char shell_view) { pid_t pid, sid; @@ -156,7 +156,7 @@ /************************************************************************ */ /* Show usages of tux daemon */ /************************************************************************ */ -void usage() +static void usage(void) { printf("usage : tuxdaemon [options]\n"); printf("options:\n"); |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 08:45:56
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 230 Modified: daemon/trunk/main.c Log: neimad 2007-04-09 10:45:54 +0200 (Mon, 09 Apr 2007) 34 * print_info_daemon() takes void. svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-04-09 08:43:10 UTC (rev 229) +++ daemon/trunk/main.c 2007-04-09 08:45:54 UTC (rev 230) @@ -57,7 +57,7 @@ /************************************************************************ */ /* Print_info_daemon */ /************************************************************************ */ -void print_info_daemon() +void print_info_daemon(void) { const char delimiters[] = " .-"; char cp[] = VERSION; |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 08:43:13
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 229 Modified: daemon/trunk/libs/USBDaemon_command_tux.c daemon/trunk/libs/USBDaemon_globals.h daemon/trunk/libs/USBDaemon_status_table.c daemon/trunk/libs/USBDaemon_usb_readWrite.c daemon/trunk/main.c Log: neimad 2007-04-09 10:43:10 +0200 (Mon, 09 Apr 2007) 99 * Made global variables (SHOW_FRAMES, DAEMON_PID, etc) lowercase (show_frames, daemon_pid, etc). svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-04-09 08:37:02 UTC (rev 228) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-04-09 08:43:10 UTC (rev 229) @@ -303,8 +303,8 @@ result[1] = id_client; break; case SUB_D_REQ_INFO_PID: - result[1] = (DAEMON_PID & 0xFF00)>>8; - result[2] = (DAEMON_PID & 0x00FF); + result[1] = (daemon_pid & 0xFF00)>>8; + result[2] = (daemon_pid & 0x00FF); break; } } Modified: daemon/trunk/libs/USBDaemon_globals.h =================================================================== --- daemon/trunk/libs/USBDaemon_globals.h 2007-04-09 08:37:02 UTC (rev 228) +++ daemon/trunk/libs/USBDaemon_globals.h 2007-04-09 08:43:10 UTC (rev 229) @@ -34,10 +34,10 @@ #define TUX_READ_TIMEOUT 5000 #define LIBUSB_DEBUG_LEVEL 1 /*_____________________ G L O B A L S _ V A R I A B L E S _______________________*/ -extern unsigned char SHOW_FRAMES; -extern unsigned char SHOW_RAW_STATUS; -extern unsigned short DAEMON_PID; -extern unsigned char SHOW_INVALID_RAW; +extern unsigned char show_frames; +extern unsigned char show_raw_status; +extern unsigned short daemon_pid; +extern unsigned char show_invalid_raw; #define MATURITY_LEN 9 typedef char maturity_t[MATURITY_LEN + 1]; Modified: daemon/trunk/libs/USBDaemon_status_table.c =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.c 2007-04-09 08:37:02 UTC (rev 228) +++ daemon/trunk/libs/USBDaemon_status_table.c 2007-04-09 08:43:10 UTC (rev 229) @@ -92,7 +92,7 @@ update_ir(new_status); break; default: - if(SHOW_INVALID_RAW) + if (show_invalid_raw) printf("%.2x %.2x %.2x %.2x\n", new_status[0], new_status[1], new_status[2], new_status[3]); break; } Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-04-09 08:37:02 UTC (rev 228) +++ daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-04-09 08:43:10 UTC (rev 229) @@ -117,7 +117,7 @@ cmd_dispatch[3] = data[3]; update_system_status_table(cmd_dispatch); - if (SHOW_FRAMES) + if (show_frames) printf("RF_st: %.2x CMD_st: %.2x NB_frames : %d idx : %d\n", RF_status, CMD_status, NUMBER_frames, idx); @@ -131,7 +131,7 @@ cmd_dispatch[3] = data[(i + 1) * 4 + 3]; cmd_dispatch[4] = 0; - if (SHOW_RAW_STATUS) + if (show_raw_status) { for (j = 0; j < 5; j++) printf("%.2x ", cmd_dispatch[j]); Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-04-09 08:37:02 UTC (rev 228) +++ daemon/trunk/main.c 2007-04-09 08:43:10 UTC (rev 229) @@ -49,11 +49,10 @@ .release_status = "", .revision = 0 }; -unsigned char SHOW_FRAMES = 0; -unsigned char SHOW_RAW_STATUS = 0; -unsigned char SHOW_INVALID_RAW = 0; -unsigned char CLOSE_DAEMON = 0; -unsigned short DAEMON_PID = 0; +unsigned char show_frames = 0; +unsigned char show_raw_status = 0; +unsigned char show_invalid_raw = 0; +unsigned short daemon_pid = 0; /************************************************************************ */ /* Print_info_daemon */ @@ -143,7 +142,7 @@ perror("chdir"); exit(1); } - DAEMON_PID = (unsigned short)getpid(); + daemon_pid = (unsigned short)getpid(); printf("Tux USB Daemon started : pid = %d\n", (int)getpid()); /* No shell */ if (!shell_view) @@ -192,11 +191,11 @@ else if (!strcmp("-d", argv[i])) daemonized = 1; else if (!strcmp("-st", argv[i])) - SHOW_FRAMES = 1; + show_frames = 1; else if (!strcmp("-sr", argv[i])) - SHOW_RAW_STATUS = 1; + show_raw_status = 1; else if (!strcmp("-si", argv[i])) - SHOW_INVALID_RAW = 1; + show_invalid_raw = 1; else if (!strcmp("-h", argv[i])) { usage(); |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 08:37:04
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 228 Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c daemon/trunk/libs/USBDaemon_usb_readWrite.h Log: neimad 2007-04-09 10:37:02 +0200 (Mon, 09 Apr 2007) 144 * Fixed coding style of USBDaemon_usb_readWrite.h: only one instruction per line, spacing. * Make some function params (void) instead of (). svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-04-09 08:29:36 UTC (rev 227) +++ daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-04-09 08:37:02 UTC (rev 228) @@ -33,19 +33,23 @@ /************************************************************************ */ /* usb_read_TuxDroid() */ /************************************************************************ */ -void usb_read_TuxDroid() +void usb_read_TuxDroid(void) { unsigned char data[TUX_RECV_LENGTH]; int idx; int i; - if (TUX_USB_CONNECTED != TUX_USB_STATUS) return; - for(i = 0;i < 5;i++) + if (TUX_USB_CONNECTED != TUX_USB_STATUS) + return; + + for (i = 0; i < 5; i++) { pthread_mutex_lock(&usb_mutex); - idx = usb_interrupt_read(tux_handle, TUX_READ_EP, (char*)data, TUX_RECV_LENGTH, TUX_READ_TIMEOUT); + idx = usb_interrupt_read(tux_handle, TUX_READ_EP, (char*)data, + TUX_RECV_LENGTH, TUX_READ_TIMEOUT); pthread_mutex_unlock(&usb_mutex); - if(idx != TUX_RECV_LENGTH) + + if (idx != TUX_RECV_LENGTH) i = 0; else update_raw_status_table(data); @@ -55,7 +59,7 @@ /************************************************************************ */ /* usb_get_status_TuxDroid() */ /************************************************************************ */ -void usb_get_status_TuxDroid() +void usb_get_status_TuxDroid(void) { unsigned char data[64]; unsigned char cmd_send[5]; @@ -63,60 +67,84 @@ int idx; unsigned char i, j; - 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; + 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; + pthread_mutex_lock(&usb_mutex); + if (TUX_USB_CONNECTED != TUX_USB_STATUS) { pthread_mutex_unlock(&usb_mutex); return; } - idx = usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char*)cmd_send, 5, TUX_WRITE_TIMEOUT); + + idx = usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char*)cmd_send, + sizeof(cmd_send), TUX_WRITE_TIMEOUT); if (idx <= 0) { busy_count++; - if(busy_count > 9) + if (busy_count > 9) { printf("Error : Tux dongle is busy or disconnected\n"); send_daemon_disconnected(); + pthread_mutex_unlock(&usb_mutex); exit(1); } + pthread_mutex_unlock(&usb_mutex); return; } + busy_count = 0; - idx = usb_interrupt_read(tux_handle, TUX_READ_EP, (char*)data, 64, TUX_READ_TIMEOUT); + idx = usb_interrupt_read(tux_handle, TUX_READ_EP, (char*)data, sizeof(data), + TUX_READ_TIMEOUT); if (idx <= 0) { pthread_mutex_unlock(&usb_mutex); return; } - cmd_dispatch[0] = data[0];cmd_dispatch[1] = data[1]; - cmd_dispatch[2] = data[2];cmd_dispatch[3] = data[3]; + + cmd_dispatch[0] = data[0]; + cmd_dispatch[1] = data[1]; + cmd_dispatch[2] = data[2]; + cmd_dispatch[3] = data[3]; + update_system_status_table(cmd_dispatch); - if(SHOW_FRAMES) - printf("RF_st: %.2x CMD_st: %.2x NB_frames : %d idx : %d\n", RF_status, CMD_status, NUMBER_frames, idx); - if((NUMBER_frames > 0) && (NUMBER_frames < 16)) + if (SHOW_FRAMES) + printf("RF_st: %.2x CMD_st: %.2x NB_frames : %d idx : %d\n", RF_status, + CMD_status, NUMBER_frames, idx); + + if (NUMBER_frames > 0 && NUMBER_frames < 16) { - for(i = 0;i < NUMBER_frames;i++) + for (i = 0; i < NUMBER_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[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) + + if (SHOW_RAW_STATUS) { - for(j = 0;j < 5;j++) + for (j = 0; j < 5; j++) printf("%.2x ", cmd_dispatch[j]); printf("\n"); } + update_raw_status_table(cmd_dispatch); } } + pthread_mutex_unlock(&usb_mutex); } + /************************************************************************ */ /* usb_write_TuxDroid() */ /************************************************************************ */ @@ -124,35 +152,42 @@ { int idx; unsigned char counter; - unsigned char CSF; + unsigned char csf; pthread_mutex_lock(&usb_mutex); + if (TUX_USB_CONNECTED != TUX_USB_STATUS) { pthread_mutex_unlock(&usb_mutex); return ACK_CMD_DONGLE_NOT_PRESENT; } + /* Send data */ CMD_STATUS_FLAG = 1; - idx = usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char*)data, TUX_SEND_LENGTH, TUX_WRITE_TIMEOUT); + idx = usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char*)data, + TUX_SEND_LENGTH, TUX_WRITE_TIMEOUT); counter = 0; - CSF = CMD_STATUS_FLAG; + csf = CMD_STATUS_FLAG; + pthread_mutex_unlock(&usb_mutex); - while(CSF) + + while (csf) { pthread_mutex_lock(&usb_mutex); - CSF = CMD_STATUS_FLAG; + csf = CMD_STATUS_FLAG; pthread_mutex_unlock(&usb_mutex); + counter++; usleep(10000); - if(counter == 15) + if (counter == 15) { return ACK_CMD_TIMEOUT; } } - if(CMD_status == ACK_CMD_OK) + + if (CMD_status == ACK_CMD_OK) return ACK_CMD_OK; - else if(CMD_status == ACK_CMD_KO) + else if (CMD_status == ACK_CMD_KO) return ACK_CMD_KO; else return ACK_CMD_ERROR; Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.h =================================================================== --- daemon/trunk/libs/USBDaemon_usb_readWrite.h 2007-04-09 08:29:36 UTC (rev 227) +++ daemon/trunk/libs/USBDaemon_usb_readWrite.h 2007-04-09 08:37:02 UTC (rev 228) @@ -24,6 +24,6 @@ /*_____________________ D E F I N E S ______________________________________*/ /*_____________________ V A R I A B L E S __________________________________*/ /*_____________________ F U N C T I O N S __________________________________*/ -extern void usb_read_TuxDroid(); -extern void usb_get_status_TuxDroid(); +extern void usb_read_TuxDroid(void); +extern void usb_get_status_TuxDroid(void); extern unsigned char usb_write_TuxDroid(unsigned char datas[]); |
From: svnlook:warning@affinitic.be:cannot s. L. l. <c2m...@c2...> - 2007-04-09 08:29:46
|
Author: svnlook: warning: cannot set LC_CTYPE locale Date: svnlook: warning: environment variable LANG is EN New Revision: 227 Modified: daemon/trunk/libs/USBDaemon_globals.h daemon/trunk/main.c Log: neimad 2007-04-09 10:29:36 +0200 (Mon, 09 Apr 2007) 173 * Defined types and constants for maturity and release_status fields of struct version_s. * Replaced hardcoded maturity and release_status lengths with their sizeof(). svnlook: warning: cannot set LC_CTYPE locale svnlook: warning: environment variable LANG is EN svnlook: warning: please check that your locale name is correct Modified: daemon/trunk/libs/USBDaemon_globals.h =================================================================== --- daemon/trunk/libs/USBDaemon_globals.h 2007-04-08 19:41:43 UTC (rev 226) +++ daemon/trunk/libs/USBDaemon_globals.h 2007-04-09 08:29:36 UTC (rev 227) @@ -38,13 +38,20 @@ extern unsigned char SHOW_RAW_STATUS; extern unsigned short DAEMON_PID; extern unsigned char SHOW_INVALID_RAW; + +#define MATURITY_LEN 9 +typedef char maturity_t[MATURITY_LEN + 1]; + +#define RELEASE_STATUS_LEN 19 +typedef char release_status_t[RELEASE_STATUS_LEN + 1]; + struct version_s { int major; int minor; int release; - char maturity[10]; - char release_status[20]; + maturity_t maturity; + release_status_t release_status; int revision; }; extern struct version_s version; Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-04-08 19:41:43 UTC (rev 226) +++ daemon/trunk/main.c 2007-04-09 08:29:36 UTC (rev 227) @@ -40,7 +40,15 @@ /*_____________________ F U N C T I O N S __________________________________*/ -struct version_s version = {0, 0, 0, "\0", "\0", 0}; +struct version_s version = +{ + .major = 0, + .minor = 0, + .release = 0, + .maturity = "", + .release_status = "", + .revision = 0 +}; unsigned char SHOW_FRAMES = 0; unsigned char SHOW_RAW_STATUS = 0; unsigned char SHOW_INVALID_RAW = 0; @@ -63,9 +71,9 @@ if ((token = strtok(NULL, delimiters)) != NULL) version.release = atoi(token); if ((token = strtok(NULL, delimiters)) != NULL) - strncpy(version.maturity, token, 10); + strncpy(version.maturity, token, sizeof(version.maturity)); if ((token = strtok(NULL, delimiters)) != NULL) - strncpy(version.release_status, token, 20); + strncpy(version.release_status, token, sizeof(version.release_status)); printf("-----------------------------------\n"); printf("Tux USB Daemon version %s\n", VERSION); @@ -89,9 +97,9 @@ static int fd_nullify (int desired_fd) { int fd; - int fd2; + int fd2; int saved_errno; - + close (desired_fd); fd = open ("/dev/null", O_WRONLY, S_IRUSR | S_IWUSR); if (fd == desired_fd || fd < 0) @@ -103,7 +111,7 @@ errno = saved_errno; return fd2; } -} +} /************************************************************************ */ /* Daemonizer */ |