[tuxdroid-svn] r80 - in daemon/trunk: . libs
Status: Beta
Brought to you by:
ks156
From: added by p. f. a. <ap...@c2...> - 2007-02-26 13:46:13
|
Author: remi Date: 2007-02-26 14:45:05 +0100 (Mon, 26 Feb 2007) New Revision: 80 Modified: daemon/trunk/README daemon/trunk/USBDaemon.mdsp daemon/trunk/USBDaemon_main.c daemon/trunk/libs/USBDaemon_command_tux.c daemon/trunk/libs/USBDaemon_command_tux.h daemon/trunk/libs/USBDaemon_globals.h daemon/trunk/libs/USBDaemon_status_table.c daemon/trunk/libs/USBDaemon_status_table.h 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_enum.h daemon/trunk/libs/USBDaemon_usb_readWrite.c Log: ADD : Mutexes for stability. Client disconnecting bug corrected. Tabs to 4 spaces for indentation. Modified: daemon/trunk/README =================================================================== --- daemon/trunk/README 2007-02-22 00:21:22 UTC (rev 79) +++ daemon/trunk/README 2007-02-26 13:45:05 UTC (rev 80) @@ -2,6 +2,14 @@ TUX Daemon is a daemon to control the tuxdroid robot. +usage : tuxdaemon [options] +options: + -d start in daemon mode + -v view in shell ( for daemon mode ) + -st show the structure of the usb trames + -sr show all raw statutes + -si show only invalid raw statutes + -h show this usage list For all information about tuxdroid, please visit: Modified: daemon/trunk/USBDaemon.mdsp =================================================================== --- daemon/trunk/USBDaemon.mdsp 2007-02-22 00:21:22 UTC (rev 79) +++ daemon/trunk/USBDaemon.mdsp 2007-02-26 13:45:05 UTC (rev 80) @@ -98,19 +98,16 @@ [Resource] [Other] [History] -libs|USBDaemon_tcp_server.h,0 +libs|USBDaemon_tcp_server.h,1596 libs|USBDaemon_usb_readWrite.h,0 -libs|USBDaemon_usb_enum.h,0 -libs|USBDaemon_command_tux.h,273 -libs|USBDaemon_status_table.h,78 -libs|USBDaemon_tcp_server.c,1254 -libs|commands.h,2602 -libs|USBDaemon_status_table.c,17847 +libs|USBDaemon_usb_enum.h,1112 +libs|USBDaemon_command_tux.h,225 +libs|USBDaemon_status_table.h,2555 tuxdefs|commands.h,5471 -libs|USBDaemon_daemon_inf.c,501 -libs|USBDaemon_usb_enum.c,1806 -libs|USBDaemon_usb_readWrite.c,2716 -libs|USBDaemon_globals.h,841 -libs|USBDaemon_daemon_inf.h,0 -libs|USBDaemon_command_tux.c,7045 -USBDaemon_main.c,1789 +libs|USBDaemon_usb_enum.c,2733 +libs|USBDaemon_globals.h,1769 +libs|USBDaemon_status_table.c,2868 +libs|USBDaemon_usb_readWrite.c,4163 +libs|USBDaemon_command_tux.c,7790 +libs|USBDaemon_tcp_server.c,4562 +USBDaemon_main.c,4736 Modified: daemon/trunk/USBDaemon_main.c =================================================================== --- daemon/trunk/USBDaemon_main.c 2007-02-22 00:21:22 UTC (rev 79) +++ daemon/trunk/USBDaemon_main.c 2007-02-26 13:45:05 UTC (rev 80) @@ -36,164 +36,164 @@ #include "libs/USBDaemon_status_table.h" /*_____________________ F U N C T I O N S __________________________________*/ - // *********************************************************************** - // Print_info_daemon - // *********************************************************************** - void - print_info_daemon() - { - printf("-----------------------------------\n"); - printf("Tux USB Daemon V%d.%d.%d\n",VERSION_MAJOR,VERSION_MINOR,VERSION_RELEASE); - printf("Kysoh 2007.\n"); - printf("-----------------------------------\n"); - } + // *********************************************************************** + // Print_info_daemon + // *********************************************************************** + void + print_info_daemon() + { + printf("-----------------------------------\n"); + printf("Tux USB Daemon V%d.%d.%d\n",VERSION_MAJOR,VERSION_MINOR,VERSION_RELEASE); + printf("Kysoh 2007.\n"); + printf("-----------------------------------\n"); + } - // *********************************************************************** - // On_close_daemon - // *********************************************************************** - void - on_close_daemon() - { - send_daemon_disconnected(); - printf("Daemon closed\n"); - exit(0); - } - - // *********************************************************************** - // Daemonizer - // *********************************************************************** - void - daemonize(unsigned char shell_view) - { - pid_t pid,sid; - - pid=fork(); - switch(pid){ - case 0: - break; - case -1: //erreur - exit(1); - break; - default : - exit(0); - } - umask(0); - sid=setsid(); - if(sid<0){ - perror("sid"); - exit(1); - } - if(chdir("/")<0){ - perror("chdir"); - exit(1); - } - DAEMON_PID=(unsigned short)getpid(); - printf("Daemon started : pid=%d\n",(int)getpid()); - // No shell - if(!shell_view) - { - close(STDIN_FILENO); - close(STDOUT_FILENO); - close(STDERR_FILENO); - } - } - - // *********************************************************************** - // Show usages of tux daemon - // *********************************************************************** - void - usage() - { - printf("usage : tuxdaemon [options]\n"); - printf("options:\n"); - printf(" -d start in daemon mode\n"); - printf(" -v view in shell ( for daemon mode )\n"); - printf(" -st show the structure of the usb trames\n"); - printf(" -sr show all raw statutes\n"); - printf(" -si show only invalid raw statutes\n"); - printf(" -h show this usage list\n"); - } + // *********************************************************************** + // On_close_daemon + // *********************************************************************** + void + on_close_daemon() + { + send_daemon_disconnected(); + printf("Daemon closed\n"); + exit(0); + } + + // *********************************************************************** + // Daemonizer + // *********************************************************************** + void + daemonize(unsigned char shell_view) + { + pid_t pid,sid; + + pid=fork(); + switch(pid){ + case 0: + break; + case -1: //erreur + exit(1); + break; + default : + exit(0); + } + umask(0); + sid=setsid(); + if(sid<0){ + perror("sid"); + exit(1); + } + if(chdir("/")<0){ + perror("chdir"); + exit(1); + } + DAEMON_PID=(unsigned short)getpid(); + printf("Daemon started : pid=%d\n",(int)getpid()); + // No shell + if(!shell_view) + { + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + } + } + + // *********************************************************************** + // Show usages of tux daemon + // *********************************************************************** + void + usage() + { + printf("usage : tuxdaemon [options]\n"); + printf("options:\n"); + printf(" -d start in daemon mode\n"); + printf(" -v view in shell ( for daemon mode )\n"); + printf(" -st show the structure of the usb trames\n"); + printf(" -sr show all raw statutes\n"); + printf(" -si show only invalid raw statutes\n"); + printf(" -h show this usage list\n"); + } - // *********************************************************************** - // USBDaemon main function - // *********************************************************************** - int - main( - int argc, - char *argv[] - ) - { - GMainLoop *loop; - GThread *UsbThread; - GThread *TcpThread; - GError *error=NULL; - unsigned char i; - unsigned char shell_view; - unsigned char daemonized; - - // Print daemon informations - print_info_daemon(); - // Program arguments - daemonized=0; - shell_view=0; - SHOW_TRAMES=0; - SHOW_RAW_STATUS=0; - SHOW_INVALID_RAW=0; - if(argc>1){ - 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_TRAMES=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) - daemonize(shell_view); - // On exiting - signal(SIGINT, on_close_daemon); - signal(SIGKILL, on_close_daemon); - // Gestion Multithread - if (!g_thread_supported()) { - g_thread_init(NULL); - }else{ - printf("g_thread NOT supported\n"); - return 1; - } - - TUX_USB_STATUS=0; - TUX_TCP_STATUS=0; - CLOSE_DAEMON=0; - last_remote_key=0xFF; - last_toggle_key=0xFF; - sound_flash_count=0; - - // Start USB task thread - if ((UsbThread = g_thread_create((GThreadFunc)usb_start_task,NULL,TRUE,&error))== 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 ) { - printf("Thread creation failed: %s \n",error->message); - return 2; - } - loop = g_main_loop_new(NULL,FALSE); - g_main_loop_run(loop); - return 0; - } + // *********************************************************************** + // USBDaemon main function + // *********************************************************************** + int + main( + int argc, + char *argv[] + ) + { + GMainLoop *loop; + GThread *UsbThread; + GThread *TcpThread; + GError *error=NULL; + unsigned char i; + unsigned char shell_view; + unsigned char daemonized; + + // Print daemon informations + print_info_daemon(); + // Program arguments + daemonized=0; + shell_view=0; + SHOW_TRAMES=0; + SHOW_RAW_STATUS=0; + SHOW_INVALID_RAW=0; + if(argc>1){ + 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_TRAMES=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) + daemonize(shell_view); + // On exiting + signal(SIGINT, on_close_daemon); + signal(SIGKILL, on_close_daemon); + // Gestion Multithread + if (!g_thread_supported()) { + g_thread_init(NULL); + }else{ + printf("g_thread NOT supported\n"); + return 1; + } + + TUX_USB_STATUS=0; + TUX_TCP_STATUS=0; + CLOSE_DAEMON=0; + last_remote_key=0xFF; + last_toggle_key=0xFF; + sound_flash_count=0; + + // Start USB task thread + if ((UsbThread = g_thread_create((GThreadFunc)usb_start_task,NULL,TRUE,&error))== 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 ) { + printf("Thread creation failed: %s \n",error->message); + return 2; + } + loop = g_main_loop_new(NULL,FALSE); + g_main_loop_run(loop); + return 0; + } - + Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-02-22 00:21:22 UTC (rev 79) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-02-26 13:45:05 UTC (rev 80) @@ -32,566 +32,621 @@ // *************************************************************************** // COMMANDS FROM CLIENTS DISPATCHER // *************************************************************************** - void - commands_dispatcher( - unsigned char client_id, // Client source - unsigned char src_trame[16] // Source trame - ) - { - unsigned char ACK_DP; // daemon processing ack - unsigned char data[12]; // data part of source trame - unsigned char result[12]; // result data to return - unsigned char tcp_trame[16];// tcp trame to send - unsigned char ack_dp_trame[16]; - unsigned char i; - + void + commands_dispatcher( + unsigned char client_id, // Client source + unsigned char src_trame[16] // Source trame + ) + { + unsigned char ACK_DP; // daemon processing ack + unsigned char data[12]; // data part of source trame + unsigned char result[12]; // result data to return + unsigned char tcp_trame[16];// tcp trame to send + unsigned char ack_dp_trame[16]; + unsigned char i; + unsigned char no_ack; + - // Cut data part of source trame - for(i=0;i<12;i++){ - result[i]=0; - data[i]=src_trame[i+4]; - } - // Make source header - tcp_trame[0]=src_trame[0]; // return source - tcp_trame[1]=src_trame[1]; // return sub source - - // -------------------- Data disencapsulation ----------------------// - ACK_DP=ACK_DP_OK; // Init ACK daemon processing - // B1 ---- : Destination - switch(src_trame[0]){ - // To Master Daemon ---------------------------------------------- - case DEST_MASTER_DAEMON: - // Not implemented - ACK_DP=ACK_DP_NI; - break; - // To Sub Daemon ------------------------------------------------- - case DEST_SUB_DAEMON: - // B3 ---- Data Type - switch(src_trame[2]){ - // Data type command - case DATA_TP_CMD: - // B4 ---- Command type - tcp_trame[2]=DATA_TP_ACK_CMD; - tcp_trame[3]=src_trame[3]; - switch(src_trame[3]){ - // Command type raw - case SUBDATA_TP_RAW: - // Not implemented - ACK_DP=ACK_DP_NI; - break; - // Command type structured - case SUBDATA_TP_STRUCT: - sub_daemon_cmd_struct(data,result,client_id); - break; - // Unknowed command type - default: - ACK_DP=ACK_DP_UKN_SUBDATA_TP; - break; - } - break; - // Data type request - case DATA_TP_REQ: - tcp_trame[2]=DATA_TP_RSP; - tcp_trame[3]=src_trame[3]; - // B4 ---- Request type - switch(src_trame[3]){ - // Request type status - case SUBDATA_TP_STATUS: - // Not implemented - ACK_DP=ACK_DP_NI; - break; - // Request type information - case SUBDATA_TP_INFO: - sub_daemon_req_info(data,result,client_id); - break; - // Unknowed request type - default: - ACK_DP=ACK_DP_UKN_SUBDATA_TP; - break; - } - break; - // Unknowed data type - default: - ACK_DP=ACK_DP_UKN_DATA_TP; - break; - } - break; - // To Tux -------------------------------------------------------- - case DEST_TUX: - // TODO sub destinations - // B3 ---- Data Type - switch(src_trame[2]){ - // Data type command - case DATA_TP_CMD: - tcp_trame[2]=DATA_TP_ACK_CMD; - tcp_trame[3]=src_trame[3]; - // B4 ---- Command type - switch(src_trame[3]){ - // Command type raw - case SUBDATA_TP_RAW: - tux_cmd_raw(data,result); - break; - // Command type structured - case SUBDATA_TP_STRUCT: - tux_cmd_struct(data,result); - break; - // Unknowed command type - default: - ACK_DP=ACK_DP_UKN_SUBDATA_TP; - break; - } - break; - // Data type request - case DATA_TP_REQ: - tcp_trame[2]=DATA_TP_RSP; - tcp_trame[3]=src_trame[3]; - // B4 ---- Request type - switch(src_trame[3]){ - // Request type status - case SUBDATA_TP_STATUS: - tux_req_status(data,result); - break; - // Request type information - case SUBDATA_TP_INFO: - tux_req_info(data,result); - break; - // Unknowed request type - default: - ACK_DP=ACK_DP_UKN_SUBDATA_TP; - break; - } - break; - // Unknowed data type - default: - ACK_DP=ACK_DP_UKN_DATA_TP; - break; - } - break; - // To Resource --------------------------------------------------- - case DEST_RESOURCE: - // Not implemented - ACK_DP=ACK_DP_NI; - break; - // To Client ----------------------------------------------------- - case DEST_CLIENT: - // Not implemented - ACK_DP=ACK_DP_NI; - break; - // Unknowed destination ------------------------------------------ - default: - ACK_DP=ACK_DP_UKN_DEST; - break; - } - - // Paste result treatement into tcp trame - for(i=0;i<12;i++) - tcp_trame[i+4]=result[i]; - // Send daemon processing ack to client - for(i=0;i<16;i++)ack_dp_trame[i]=0; - ack_dp_trame[0]=src_trame[0]; - ack_dp_trame[1]=src_trame[1]; - ack_dp_trame[2]=DATA_TP_ACK_DP; - ack_dp_trame[3]=src_trame[3]; - ack_dp_trame[4]=ACK_DP; - tcp_server_send_raw_to_client(client_id,ack_dp_trame, 16); - // Send tcp trame to client - if(ACK_DP==ACK_DP_OK){ - tcp_server_send_raw_to_client(client_id,tcp_trame, 16); - } - } - + no_ack=0; + // Cut data part of source trame + for(i=0;i<12;i++){ + result[i]=0; + data[i]=src_trame[i+4]; + } + // Make source header + tcp_trame[0]=src_trame[0]; // return source + tcp_trame[1]=src_trame[1]; // return sub source + + // -------------------- Data disencapsulation ----------------------// + ACK_DP=ACK_DP_OK; // Init ACK daemon processing + // B1 ---- : Destination + switch(src_trame[0]){ + // To Master Daemon ---------------------------------------------- + case DEST_MASTER_DAEMON: + // Not implemented + ACK_DP=ACK_DP_NI; + break; + // To Sub Daemon ------------------------------------------------- + case DEST_SUB_DAEMON: + // B3 ---- Data Type + switch(src_trame[2]){ + // Data type command + case DATA_TP_CMD: + // B4 ---- Command type + tcp_trame[2]=DATA_TP_ACK_CMD; + tcp_trame[3]=src_trame[3]; + switch(src_trame[3]){ + // Command type raw + case SUBDATA_TP_RAW: + // Not implemented + ACK_DP=ACK_DP_NI; + break; + // Command type structured + case SUBDATA_TP_STRUCT: + sub_daemon_cmd_struct(data,result,client_id); + if(result[0]==ACK_CMD_NO_ACK) no_ack=1; + break; + // Unknowed command type + default: + ACK_DP=ACK_DP_UKN_SUBDATA_TP; + break; + } + break; + // Data type request + case DATA_TP_REQ: + tcp_trame[2]=DATA_TP_RSP; + tcp_trame[3]=src_trame[3]; + // B4 ---- Request type + switch(src_trame[3]){ + // Request type status + case SUBDATA_TP_STATUS: + // Not implemented + ACK_DP=ACK_DP_NI; + break; + // Request type information + case SUBDATA_TP_INFO: + sub_daemon_req_info(data,result,client_id); + break; + // Unknowed request type + default: + ACK_DP=ACK_DP_UKN_SUBDATA_TP; + break; + } + break; + // Unknowed data type + default: + ACK_DP=ACK_DP_UKN_DATA_TP; + break; + } + break; + // To Tux -------------------------------------------------------- + case DEST_TUX: + // TODO sub destinations + // B3 ---- Data Type + switch(src_trame[2]){ + // Data type command + case DATA_TP_CMD: + tcp_trame[2]=DATA_TP_ACK_CMD; + tcp_trame[3]=src_trame[3]; + // B4 ---- Command type + switch(src_trame[3]){ + // Command type raw + case SUBDATA_TP_RAW: + tux_cmd_raw(data,result); + break; + // Command type structured + case SUBDATA_TP_STRUCT: + tux_cmd_struct(data,result); + break; + // Unknowed command type + default: + ACK_DP=ACK_DP_UKN_SUBDATA_TP; + break; + } + break; + // Data type request + case DATA_TP_REQ: + tcp_trame[2]=DATA_TP_RSP; + tcp_trame[3]=src_trame[3]; + // B4 ---- Request type + switch(src_trame[3]){ + // Request type status + case SUBDATA_TP_STATUS: + tux_req_status(data,result); + break; + // Request type information + case SUBDATA_TP_INFO: + tux_req_info(data,result); + break; + // Unknowed request type + default: + ACK_DP=ACK_DP_UKN_SUBDATA_TP; + break; + } + break; + // Unknowed data type + default: + ACK_DP=ACK_DP_UKN_DATA_TP; + break; + } + break; + // To Resource --------------------------------------------------- + case DEST_RESOURCE: + // Not implemented + ACK_DP=ACK_DP_NI; + break; + // To Client ----------------------------------------------------- + case DEST_CLIENT: + // Not implemented + ACK_DP=ACK_DP_NI; + break; + // Unknowed destination ------------------------------------------ + default: + ACK_DP=ACK_DP_UKN_DEST; + break; + } + + // Paste result treatement into tcp trame + for(i=0;i<12;i++) + tcp_trame[i+4]=result[i]; + // Send daemon processing ack to client + for(i=0;i<16;i++)ack_dp_trame[i]=0; + ack_dp_trame[0]=src_trame[0]; + ack_dp_trame[1]=src_trame[1]; + ack_dp_trame[2]=DATA_TP_ACK_DP; + ack_dp_trame[3]=src_trame[3]; + ack_dp_trame[4]=ACK_DP; + if(!no_ack){ + tcp_server_send_raw_to_client(client_id,ack_dp_trame, 16); + // Send tcp trame to client + if(ACK_DP==ACK_DP_OK){ + tcp_server_send_raw_to_client(client_id,tcp_trame, 16); + } + } + } + // *********************************************************************** // FOR Sub daemon // *********************************************************************** - - // ******************************************************************* - // sub_daemon_cmd_struct() - // ******************************************************************* - void - sub_daemon_cmd_struct( - unsigned char data[], - unsigned char result[], - int id_client - ) - { - unsigned char i; - - switch(data[0]){ - case SUB_D_CMD_STRUC_DISCONNECT_CLIENT: - // Byte 2 equal id client to disconnect - if (tcp_clients_handle[data[1]]!=0){ - tcp_clients_handle[data[1]]=0; - tcp_clients_count--; - printf("TCP socket : Client %d is disconnected\n",data[1]); - result[0]=ACK_CMD_OK; - }else{ // Bad id client - result[0]=ACK_CMD_KO; - } - break; - case SUB_D_CMD_STRUC_KILL_DAEMON: - send_daemon_disconnected(); - result[0]=ACK_CMD_OK; - 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]); - break; - } - } - - // *********************************************************************** - // sub_daemon_req_info() - // *********************************************************************** - void - sub_daemon_req_info( - unsigned char data[], - unsigned char result[], - int id_client - ) - { - unsigned char i; - - result[0]=data[0]; - switch(data[0]){ - case SUB_D_REQ_INFO_VERSION: - result[1]=VERSION_MAJOR; - result[2]=VERSION_MINOR; - result[3]=VERSION_RELEASE; - break; - case SUB_D_REQ_INFO_CLIENT_COUNT: - result[1]=tcp_clients_count; - break; - case SUB_D_REQ_INFO_CLIENT_NAME: - for(i=0;i<11;i++) - result[i+1]=tcp_clients_name[data[1]][i]; - break; - case SUB_D_REQ_INFO_MY_CLIENT_ID: - result[1]=id_client; - break; - case SUB_D_REQ_INFO_PID: - result[1]=(DAEMON_PID && 0xFF00)>>8; - result[2]=(DAEMON_PID && 0x00FF); - break; - } - } - + + // ******************************************************************* + // sub_daemon_cmd_struct() + // ******************************************************************* + 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){ + tcp_clients_handle[data[1]]=0; + tcp_clients_count--; + printf("TCP socket : Client %d is disconnected\n",data[1]); + result[0]=ACK_CMD_OK; + }else{ // Bad id client + result[0]=ACK_CMD_KO; + } + pthread_mutex_unlock(&tcp_mutex); + 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; + 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; + case SUB_D_CMD_STRUC_KILL_DAEMON: + printf("WARNING : daemon killed by user\n"); + send_daemon_disconnected(); + result[0]=ACK_CMD_OK; + 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]); + break; + } + } + + // *********************************************************************** + // sub_daemon_req_info() + // *********************************************************************** + void + sub_daemon_req_info( + unsigned char data[], + unsigned char result[], + int id_client + ) + { + unsigned char i; + + result[0]=data[0]; + switch(data[0]){ + case SUB_D_REQ_INFO_VERSION: + result[1]=VERSION_MAJOR; + result[2]=VERSION_MINOR; + result[3]=VERSION_RELEASE; + break; + case SUB_D_REQ_INFO_CLIENT_COUNT: + result[1]=tcp_clients_count; + break; + case SUB_D_REQ_INFO_CLIENT_NAME: + for(i=0;i<11;i++) + result[i+1]=tcp_clients_name[data[1]][i]; + break; + case SUB_D_REQ_INFO_MY_CLIENT_ID: + result[1]=id_client; + break; + case SUB_D_REQ_INFO_PID: + result[1]=(DAEMON_PID && 0xFF00)>>8; + result[2]=(DAEMON_PID && 0x00FF); + break; + } + } + // *************************************************************************** // FOR Tux droid // *************************************************************************** - - // *********************************************************************** - // tux_cmd_raw() - // *********************************************************************** - void - tux_cmd_raw( - unsigned char data[], - unsigned char result[] - ) - { - unsigned char usb_send[5]; - unsigned char i; - - usb_send[0]=0; - for(i=1;i<5;i++) - usb_send[i]=data[i-1]; - result[0]=usb_write_TuxDroid(usb_send); - } - - // *********************************************************************** - // tux_cmd_struct() - // *********************************************************************** - void - tux_cmd_struct( - unsigned char data[], - unsigned char result[] - ) - { - unsigned char ACK; - - // Command type - switch(data[0]){ - case TUX_CMD_STRUCT_EYES: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_ON: - ACK=send_usb_tux_cmd(BLINK_EYES_CMD,data[2],0,0); - break; - case TUX_CMD_STRUCT_SUB_OFF: - ACK=send_usb_tux_cmd(STOP_EYES_CMD,0,0,0); - break; - } - break; - case TUX_CMD_STRUCT_MOUTH: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_ON: - ACK=send_usb_tux_cmd(MOVE_MOUTH_CMD,data[2],0,0); - break; - case TUX_CMD_STRUCT_SUB_OFF: - ACK=send_usb_tux_cmd(STOP_MOUTH_CMD,0,0,0); - break; - } - break; - case TUX_CMD_STRUCT_WINGS: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_ON: - ACK=send_usb_tux_cmd(WAVE_WINGS_CMD,data[2],data[3],0); - break; - case TUX_CMD_STRUCT_SUB_OFF: - ACK=send_usb_tux_cmd(STOP_WINGS_CMD,0,0,0); - break; - } - break; - case TUX_CMD_STRUCT_SPINL: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_ON: - ACK=send_usb_tux_cmd(SPIN_LEFT_CMD,data[2],data[3],0); - break; - case TUX_CMD_STRUCT_SUB_OFF: - ACK=send_usb_tux_cmd(STOP_SPIN_CMD,0,0,0); - break; - } - break; - case TUX_CMD_STRUCT_SPINR: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_ON: - ACK=send_usb_tux_cmd(SPIN_RIGHT_CMD,data[2],data[3],0); - break; - case TUX_CMD_STRUCT_SUB_OFF: - ACK=send_usb_tux_cmd(STOP_SPIN_CMD,0,0,0); - break; - } - break; - case TUX_CMD_STRUCT_IR: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_ON: - ACK=send_usb_tux_cmd(TURN_IR_ON_CMD,0,0,0); - break; - case TUX_CMD_STRUCT_SUB_OFF: - ACK=send_usb_tux_cmd(TURN_IR_OFF_CMD,0,0,0); - break; - case TUX_CMD_STRUCT_SUB_SEND: - ACK=send_usb_tux_cmd(IR_SEND_RC5_CMD,data[2],data[3],0); - break; - } - break; - case TUX_CMD_STRUCT_LEDS: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_ON: - ACK=send_usb_tux_cmd(LED_ON_CMD,0,0,0); - break; - case TUX_CMD_STRUCT_SUB_OFF: - ACK=send_usb_tux_cmd(LED_OFF_CMD,0,0,0); - break; - case TUX_CMD_STRUCT_SUB_BLINK: - ACK=send_usb_tux_cmd(LED_BLINK_CMD,data[2],data[3],0); - break; - } - break; - case TUX_CMD_STRUCT_LEDL: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_ON: - ACK=send_usb_tux_cmd(LED_L_ON_CMD,0,0,0); - break; - case TUX_CMD_STRUCT_SUB_OFF: - ACK=send_usb_tux_cmd(LED_L_OFF_CMD,0,0,0); - break; - } - break; - case TUX_CMD_STRUCT_LEDR: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_ON: - ACK=send_usb_tux_cmd(LED_R_ON_CMD,0,0,0); - break; - case TUX_CMD_STRUCT_SUB_OFF: - ACK=send_usb_tux_cmd(LED_R_OFF_CMD,0,0,0); - break; - } - break; - case TUX_CMD_STRUCT_SOUND: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_PLAY: - ACK=send_usb_tux_cmd(PLAY_SOUND_CMD,data[2],data[3],0); - break; - case TUX_CMD_STRUCT_SUB_STORING: - ACK=send_usb_tux_cmd(STORE_SOUND_CMD,data[2],0,0); - break; - case TUX_CMD_STRUCT_SUB_STORE_INDEX: - ACK=send_usb_tux_cmd(STORE_INDEX_CMD,data[2],data[3],data[4]); - break; - case TUX_CMD_STRUCT_SUB_TEST: - ACK=send_usb_tux_cmd(TEST_SOUND_CMD,0,0,0); - break; - } - break; - case TUX_CMD_STRUCT_PING: - pong_received=0; - ACK=send_usb_tux_cmd(PING_CMD,data[2],0,0); - break; - case TUX_CMD_STRUCT_SLEEP: - switch(data[1]){ - case TUX_CMD_STRUCT_SUB_ON: - ACK=send_usb_tux_cmd(0x20,0,0,0); - break; - case TUX_CMD_STRUCT_SUB_OFF: - ACK=send_usb_tux_cmd(0x21,0,0,0); - break; - } - break; - } - result[0]=ACK; - } - - // *********************************************************************** - // tux_req_status() - // *********************************************************************** - void - tux_req_status( - unsigned char data[], - unsigned char result[] - ) - { - result[0]=data[0]; - switch(data[0]){ - case DATA_STATUS_WINGS_MOTOR_BACKWARD: - if (portb.bits.PB0){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_SPIN_MOTOR_BACKWARD: - if (portb.bits.PB1){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_SPIN_MOTOR_FORWARD: - if (portb.bits.PB2){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_MOUTH_OPEN_POSITION: - if (portb.bits.PB3){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_MOUTH_CLOSED_POSITION: - if (portb.bits.PB4){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_HEAD_PUSH_POSITION: - if (portb.bits.PB5){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_CHARGER_INHIBIT_SIGNAL: - result[0]=DATA_STATUS_CHARGER_INHIBIT_SIGNAL; - if (portb.bits.PB6){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_WINGS_POSITION_SWITCH: - if (portc.bits.PB0){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_MOTOR_FOR_WINGS: - if (portc.bits.PB1){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_LEFT_BLUE_LED: - if (portc.bits.PB2){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_HEAD_MOTOR_FOR_MOUTH: - if (portd.bits.PB1){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_HEAD_MOTOR_FOR_EYES: - result[0]=DATA_STATUS_HEAD_MOTOR_FOR_EYES; - if (portd.bits.PB0){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_SPIN_POSITION_SWITCH: - if (portd.bits.PB3){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_WINGS_MOTOR_FORWARD: - result[0]=DATA_STATUS_WINGS_MOTOR_FORWARD; - if (portd.bits.PB4){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_IR_LED: - if (portd.bits.PB5){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_EYES_OPEN_POSITION_SWITCH: - if (portd.bits.PB6){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_EYES_CLOSED_POSITION_SWITCH: - if (portd.bits.PB7){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_LEFT_WING_PUSH: - if (sensors1.bits.PB0){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_RIGHT_WING_PUSH: - if (sensors1.bits.PB1){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_POWER_PLUG_SWITCH: - if (sensors1.bits.PB2){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_HEAD_PUSH_SWITCH: - if (sensors1.bits.PB3){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_CHARGER_LED_STATUS: - if (sensors1.bits.PB4){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_MUTE_STATUS: - if (sensors1.bits.PB7){result[1]=1;}else{result[1]=0;} - break; - case DATA_STATUS_LIGHT_LEVEL: - result[1]=sensors2.level_light_high.Byte; - result[2]=sensors2.level_light_low.Byte; - result[3]=sensors2.light_mode.Byte; - break; - case DATA_STATUS_EYES_POSITION_COUNTER: - result[1]=position1.eyes_position.Byte; - break; - case DATA_STATUS_MOUTH_POSITION_COUNTER: - result[1]=position1.mouth_position.Byte; - break; - case DATA_STATUS_WINGS_POSITION_COUNTER: - result[1]=position1.wings_position.Byte; - break; - case DATA_STATUS_SPIN_POSITION_COUNTER: - result[1]=position2.Byte; - break; - case DATA_STATUS_RF_CONNECTED: - result[1]=RF_status; - break; - case DATA_STATUS_SOUND_COUNT: - result[1]=sound_flash_count; - break; - } - } - - // *********************************************************************** - // tux_req_info() - // *********************************************************************** - void - tux_req_info( - unsigned char data[], - unsigned char result[] - ) - { - result[0]=data[0]; - switch(data[0]){ - case TUX_REQ_INFO_VERSION: - result[1]=hw_version[data[1]].ver_major; - result[2]=hw_version[data[1]].ver_minor; - result[3]=hw_version[data[1]].ver_update; - result[4]=(unsigned char)((hw_revision[data[1]].revision)&0xFF00)>>8; - result[5]=(unsigned char)(hw_revision[data[1]].revision)&0x00FF; - result[6]=(unsigned char)((hw_author[data[1]].author_id)&0xFF00)>>8; - result[7]=(unsigned char)(hw_author[data[1]].author_id)&0x00FF; - break; - } - } + + // *********************************************************************** + // tux_cmd_raw() + // *********************************************************************** + void + tux_cmd_raw( + unsigned char data[], + unsigned char result[] + ) + { + unsigned char usb_send[5]; + unsigned char i; + + usb_send[0]=0; + for(i=1;i<5;i++) + usb_send[i]=data[i-1]; + result[0]=usb_write_TuxDroid(usb_send); + } + + // *********************************************************************** + // tux_cmd_struct() + // *********************************************************************** + void + tux_cmd_struct( + unsigned char data[], + unsigned char result[] + ) + { + unsigned char ACK; + + // Command type + switch(data[0]){ + case TUX_CMD_STRUCT_EYES: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_ON: + ACK=send_usb_tux_cmd(BLINK_EYES_CMD,data[2],0,0); + break; + case TUX_CMD_STRUCT_SUB_OFF: + ACK=send_usb_tux_cmd(STOP_EYES_CMD,0,0,0); + break; + } + break; + case TUX_CMD_STRUCT_MOUTH: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_ON: + ACK=send_usb_tux_cmd(MOVE_MOUTH_CMD,data[2],0,0); + break; + case TUX_CMD_STRUCT_SUB_OFF: + ACK=send_usb_tux_cmd(STOP_MOUTH_CMD,0,0,0); + break; + } + break; + case TUX_CMD_STRUCT_WINGS: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_ON: + ACK=send_usb_tux_cmd(WAVE_WINGS_CMD,data[2],data[3],0); + break; + case TUX_CMD_STRUCT_SUB_OFF: + ACK=send_usb_tux_cmd(STOP_WINGS_CMD,0,0,0); + break; + } + break; + case TUX_CMD_STRUCT_SPINL: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_ON: + ACK=send_usb_tux_cmd(SPIN_LEFT_CMD,data[2],data[3],0); + break; + case TUX_CMD_STRUCT_SUB_OFF: + ACK=send_usb_tux_cmd(STOP_SPIN_CMD,0,0,0); + break; + } + break; + case TUX_CMD_STRUCT_SPINR: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_ON: + ACK=send_usb_tux_cmd(SPIN_RIGHT_CMD,data[2],data[3],0); + break; + case TUX_CMD_STRUCT_SUB_OFF: + ACK=send_usb_tux_cmd(STOP_SPIN_CMD,0,0,0); + break; + } + break; + case TUX_CMD_STRUCT_IR: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_ON: + ACK=send_usb_tux_cmd(TURN_IR_ON_CMD,0,0,0); + break; + case TUX_CMD_STRUCT_SUB_OFF: + ACK=send_usb_tux_cmd(TURN_IR_OFF_CMD,0,0,0); + break; + case TUX_CMD_STRUCT_SUB_SEND: + ACK=send_usb_tux_cmd(IR_SEND_RC5_CMD,data[2],data[3],0); + break; + } + break; + case TUX_CMD_STRUCT_LEDS: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_ON: + ACK=send_usb_tux_cmd(LED_ON_CMD,0,0,0); + break; + case TUX_CMD_STRUCT_SUB_OFF: + ACK=send_usb_tux_cmd(LED_OFF_CMD,0,0,0); + break; + case TUX_CMD_STRUCT_SUB_BLINK: + ACK=send_usb_tux_cmd(LED_BLINK_CMD,data[2],data[3],0); + break; + } + break; + case TUX_CMD_STRUCT_LEDL: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_ON: + ACK=send_usb_tux_cmd(LED_L_ON_CMD,0,0,0); + break; + case TUX_CMD_STRUCT_SUB_OFF: + ACK=send_usb_tux_cmd(LED_L_OFF_CMD,0,0,0); + break; + } + break; + case TUX_CMD_STRUCT_LEDR: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_ON: + ACK=send_usb_tux_cmd(LED_R_ON_CMD,0,0,0); + break; + case TUX_CMD_STRUCT_SUB_OFF: + ACK=send_usb_tux_cmd(LED_R_OFF_CMD,0,0,0); + break; + } + break; + case TUX_CMD_STRUCT_SOUND: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_PLAY: + ACK=send_usb_tux_cmd(PLAY_SOUND_CMD,data[2],data[3],0); + break; + case TUX_CMD_STRUCT_SUB_STORING: + ACK=send_usb_tux_cmd(STORE_SOUND_CMD,data[2],0,0); + break; + case TUX_CMD_STRUCT_SUB_STORE_INDEX: + ACK=send_usb_tux_cmd(STORE_INDEX_CMD,data[2],data[3],data[4]); + break; + case TUX_CMD_STRUCT_SUB_TEST: + ACK=send_usb_tux_cmd(TEST_SOUND_CMD,0,0,0); + break; + } + break; + case TUX_CMD_STRUCT_PING: + pong_received=0; + ACK=send_usb_tux_cmd(PING_CMD,data[2],0,0); + break; + case TUX_CMD_STRUCT_SLEEP: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_ON: + ACK=send_usb_tux_cmd(0x20,0,0,0); + break; + case TUX_CMD_STRUCT_SUB_OFF: + ACK=send_usb_tux_cmd(0x21,0,0,0); + break; + } + break; + case TUX_CMD_STRUCT_AUDIO_CHANNEL: + switch(data[1]){ + case TUX_CMD_STRUCT_SUB_CH_GENERAL: + if(current_audio_channel!=0){ + ACK=send_usb_dongle_cmd(0x02,0,0,0); + current_audio_channel=0; + }else + ACK=ACK_CMD_OK; + break; + case TUX_CMD_STRUCT_SUB_CH_TTS: + if(current_audio_channel!=1){ + ACK=send_usb_dongle_cmd(0x02,1,0,0); + current_audio_channel=1; + }else + ACK=ACK_CMD_OK; + break; + } + break; + } + result[0]=ACK; + } + + // *********************************************************************** + // tux_req_status() + // *********************************************************************** + void + tux_req_status( + unsigned char data[], + unsigned char result[] + ) + { + result[0]=data[0]; + switch(data[0]){ + case DATA_STATUS_WINGS_MOTOR_BACKWARD: + if (portb.bits.PB0){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_SPIN_MOTOR_BACKWARD: + if (portb.bits.PB1){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_SPIN_MOTOR_FORWARD: + if (portb.bits.PB2){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_MOUTH_OPEN_POSITION: + if (portb.bits.PB3){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_MOUTH_CLOSED_POSITION: + if (portb.bits.PB4){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_HEAD_PUSH_POSITION: + if (portb.bits.PB5){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_CHARGER_INHIBIT_SIGNAL: + result[0]=DATA_STATUS_CHARGER_INHIBIT_SIGNAL; + if (portb.bits.PB6){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_WINGS_POSITION_SWITCH: + if (portc.bits.PB0){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_MOTOR_FOR_WINGS: + if (portc.bits.PB1){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_LEFT_BLUE_LED: + if (portc.bits.PB2){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_HEAD_MOTOR_FOR_MOUTH: + if (portd.bits.PB1){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_HEAD_MOTOR_FOR_EYES: + result[0]=DATA_STATUS_HEAD_MOTOR_FOR_EYES; + if (portd.bits.PB0){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_SPIN_POSITION_SWITCH: + if (portd.bits.PB3){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_WINGS_MOTOR_FORWARD: + result[0]=DATA_STATUS_WINGS_MOTOR_FORWARD; + if (portd.bits.PB4){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_IR_LED: + if (portd.bits.PB5){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_EYES_OPEN_POSITION_SWITCH: + if (portd.bits.PB6){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_EYES_CLOSED_POSITION_SWITCH: + if (portd.bits.PB7){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_LEFT_WING_PUSH: + if (sensors1.bits.PB0){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_RIGHT_WING_PUSH: + if (sensors1.bits.PB1){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_POWER_PLUG_SWITCH: + if (sensors1.bits.PB2){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_HEAD_PUSH_SWITCH: + if (sensors1.bits.PB3){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_CHARGER_LED_STATUS: + if (sensors1.bits.PB4){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_MUTE_STATUS: + if (sensors1.bits.PB7){result[1]=1;}else{result[1]=0;} + break; + case DATA_STATUS_LIGHT_LEVEL: + result[1]=sensors2.level_light_high.Byte; + result[2]=sensors2.level_light_low.Byte; + result[3]=sensors2.light_mode.Byte; + break; + case DATA_STATUS_EYES_POSITION_COUNTER: + result[1]=position1.eyes_position.Byte; + break; + case DATA_STATUS_MOUTH_POSITION_COUNTER: + result[1]=position1.mouth_position.Byte; + break; + case DATA_STATUS_WINGS_POSITION_COUNTER: + result[1]=position1.wings_position.Byte; + break; + case DATA_STATUS_SPIN_POSITION_COUNTER: + result[1]=position2.Byte; + break; + case DATA_STATUS_RF_CONNECTED: + result[1]=RF_status; + break; + case DATA_STATUS_SOUND_COUNT: + result[1]=sound_flash_count; + break; + } + } + + // *********************************************************************** + // tux_req_info() + // *********************************************************************** + void + tux_req_info( + unsigned char data[], + unsigned char result[] + ) + { + result[0]=data[0]; + switch(data[0]){ + case TUX_REQ_INFO_VERSION: + result[1]=hw_version[data[1]].ver_major; + result[2]=hw_version[data[1]].ver_minor; + result[3]=hw_version[data[1]].ver_update; + result[4]=(unsigned char)((hw_revision[data[1]].revision)&0xFF00)>>8; + result[5]=(unsigned char)(hw_revision[data[1]].revision)&0x00FF; + result[6]=(unsigned char)((hw_author[data[1]].author_id)&0xFF00)>>8; + result[7]=(unsigned char)(hw_author[data[1]].author_id)&0x00FF; + break; + } + } // *************************************************************************** // TUX USB // *************************************************************************** - // *********************************************************************** - // send_usb_tuxcmd() - // *********************************************************************** - unsigned char send_usb_tux_cmd( - unsigned char cmd, - unsigned char param1, - unsigned char param2, - unsigned char param3 - ) - { - unsigned char usb_trame[TUX_SEND_LENGTH]; - - usb_trame[0]=0; - usb_trame[1]=cmd; - usb_trame[2]=param1; usb_trame[3]=param2; usb_trame[4]=param3; - return usb_write_TuxDroid(usb_trame); - } + // *********************************************************************** + // send_usb_tuxcmd() + // *********************************************************************** + unsigned char send_usb_tux_cmd( + unsigned char cmd, + unsigned char param1, + unsigned char param2, + unsigned char param3 + ) + { + unsigned char usb_trame[TUX_SEND_LENGTH]; + + usb_trame[0]=0; + usb_trame[1]=cmd; + usb_trame[2]=param1; usb_trame[3]=param2; usb_trame[4]=param3; + return usb_write_TuxDroid(usb_trame); + } + + // *********************************************************************** + // send_usb_donglecmd() + // *********************************************************************** + unsigned char send_usb_dongle_cmd( + unsigned char cmd, + unsigned char param1, + unsigned char param2, + unsigned char param3 + ) + { + unsigned char usb_trame[TUX_SEND_LENGTH]; + + usb_trame[0]=1; + usb_trame[1]=cmd; + usb_trame[2]=param1; usb_trame[3]=param2; usb_trame[4]=param3; + return usb_write_TuxDroid(usb_trame); + } Modified: daemon/trunk/libs/USBDaemon_command_tux.h =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.h 2007-02-22 00:21:22 UTC (rev 79) +++ daemon/trunk/libs/USBDaemon_command_tux.h 2007-02-26 13:45:05 UTC (rev 80) @@ -31,6 +31,7 @@ void tux_req_info(unsigned char data[],unsigned char result[]); // TUX PHYSICAL CHANGES unsigned char send_usb_tux_cmd(unsigned char cmd, unsigned char param1,unsigned char param2,unsigned char param3); +unsigned char send_usb_dongle_cmd(unsigned char cmd, unsigned char param1,unsigned char param2,unsigned char param3); unsigned char send_wave_wings(unsigned char count, unsigned char speed); unsigned char send_stop_wings(); unsigned char send_blink_eyes(unsigned char count); Modified: daemon/trunk/libs/USBDaemon_globals.h =================================================================== --- daemon/trunk/libs/USBDaemon_globals.h 2007-02-22 00:21:22 UTC (rev 79) +++ daemon/trunk/libs/USBDaemon_globals.h 2007-02-26 13:45:05 UTC (rev 80) @@ -20,20 +20,21 @@ /* $Id$ */ /*_____________________ I N C L U D E S____________________________________ */ #include <usb.h> +#include <pthread.h> /*_____________________ D E F I N E S ______________________________________*/ -#define VERSION_MAJOR 0 -#define VERSION_MINOR 1 -#define VERSION_RELEASE 5 -#define TUX_PID 0xFF07 // Product ID -#define TUX_VID 0x03EB // Vendor ID -#define TUX_INTERFACE 0x03 -#define TUX_INTERFACECONFIG 0x01 -#define TUX_RECV_LENGTH 0x05 -#define TUX_SEND_LENGTH 0x05 -#define TUX_WRITE_EP 0x05 -#define TUX_READ_EP 0x84 -#define TUX_WRITE_TIMEOUT 1000 -#define TUX_READ_TIMEOUT 1000 +#define VERSION_MAJOR 0 +#define VERSION_MINOR 1 +#define VERSION_RELEASE 7 +#define TUX_PID 0xFF07 // Product ID +#define TUX_VID 0x03EB // Vendor ID +#define TUX_INTERFACE 0x03 +#define TUX_INTERFACECONFIG 0x01 +#define TUX_RECV_LENGTH 0x05 +#define TUX_SEND_LENGTH 0x05 +#define TUX_WRITE_EP 0x05 +#define TUX_READ_EP 0x84 +#define TUX_WRITE_TIMEOUT 1000 +#define TUX_READ_TIMEOUT 1000 /*_____________________ G L O B A L S _ V A R I A B L E S _______________________*/ usb_dev_handle *handle; struct usb_device* device; Modified: daemon/trunk/libs/USBDaemon_status_table.c =================================================================== --- daemon/trunk/libs/USBDaemon_status_table.c 2007-02-22 00:21:22 UTC (rev 79) +++ daemon/trunk/libs/USBDaemon_status_table.c 2007-02-26 13:45:05 UTC (rev 80) @@ -28,677 +28,678 @@ unsigned char pong_received; /*_____________________ F U N C T I O N S __________________________________*/ - // *********************************************************************** - // update_raw_status_table() - // *********************************************************************** - void - update_raw_status_table( - unsigned char new_status[TUX_RECV_LENGTH] - ) - { - switch(new_status[0]){ - case STATUS_PORTS_CMD: - if(portb.Byte!=new_status[1]) portb_changed(new_status[1]); - if(portc.Byte!=new_status[2]) portc_changed(new_status[2]); - if(portd.Byte!=new_status[3]) portd_changed(new_status[3]); - break; - case STATUS_SENSORS1_CMD: - if(sensors1.Byte!=new_status[1]) sensors1_changed(new_status[1]); - break; - case STATUS_LIGHT_CMD: - if((sensors2.level_light_high.Byte!=new_status[1]) || (sensors2.level_light_low.Byte!=new_status[2]) ) sensors2_changed(new_status[1],new_status[2],new_status[3]); - break; - case STATUS_POSITION1_CMD: - if((position1.eyes_position.Byte!=new_status[1])||(position1.mouth_position.Byte!=new_status[2])||(position1.wings_position.Byte!=new_status[3])) position1_changed(new_status[1], new_status[2], new_status[3]); - break; - case STATUS_POSITION2_CMD: - if(position2.Byte!=new_status[1]) position2_changed(new_status[1]); - break; - case PONG_CMD: - pong_received++; - pong_event(new_status[1],pong_received); - break; - case VERSION_CMD: - update_version_table(new_status); - break; - case REVISION_CMD: - update_revision_table(new_status); - break; - case AUTHOR_CMD: - update_author_table(new_status); - break; - case SOUND_VAR_CMD: - update_sound_flash_count(new_status); - break; - case STATUS_IR_CMD: - update_ir(new_status); - break; - default: - if(SHOW_INVALID_RAW) - printf("%.2x %.2x %.2x %.2x\n", new_status[0],new_status[1],new_status[2],new_status[3]); - break; - } - } - - // *********************************************************************** - // update_system_status_table() - // *********************************************************************** - void - update_system_status_table( - unsigned char new_status[4] - ) - { - unsigned char tcp_trame[16]; - unsigned char i; - - for(i=0;i<16;i++)tcp_trame[i]=0; - tcp_trame[0]=SOURCE_TUX; - tcp_trame[1]=SS_DEFAULT; - tcp_trame[2]=DATA_TP_RSP; - tcp_trame[3]=SUBDATA_TP_STATUS; - - DONGLE_status=new_status[0]; - //RF status change - if(RF_status!=new_status[1]){ - RF_status=new_status[1]; - tcp_trame[4]=DATA_STATUS_RF_CONNECTED; - tcp_trame[5]=RF_status; - tcp_server_send_raw(tcp_trame, 16); - } - // Command status change - if(CMD_status!=new_status[2]){ - CMD_status=new_status[2]; - if((CMD_status==2)||(CMD_status==3)) - CMD_STATUS_FLAG=0; - } - NUMBER_trames=new_status[3]; - } - - // *********************************************************************** - // update_version_table() - // *********************************************************************** - void - update_version_table( - unsigned char new_status[4] - ) - { - unsigned long tmp; - version_t *hw_ver; - - tmp=(new_status[3] << 24)+(new_status[2] << 16)+ - (new_status[1] << 8)+(new_status[0]); - hw_ver=(version_t *)&tmp; - last_cpu_ver=hw_ver->cpu_nbr; - hw_version[last_cpu_ver]=*hw_ver; - } - - // *********************************************************************** - // update_revision_table() - // *********************************************************************** - void - update_revision_table( - unsigned char new_status[4] - ) - { - unsigned long tmp; - revision_t *hw_rev; - - tmp=(new_sta... [truncated message content] |