diff -Nru irserver-6.02.40/ascii.c irserver-6.03.08/ascii.c --- irserver-6.02.40/ascii.c 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/ascii.c 2010-11-01 20:54:02.000000000 +0000 @@ -84,20 +84,21 @@ #endif extern int protocol_version; -int AnalyzeUDPString (char *st,int *netcom,char *remote,char *command,char *ccf,int *netmask,int *bus,int *led,int *port); +extern int AnalyzeUDPString (char *st,int *netcom,char *remote,char *command,char *ccf,int *netmask,int *bus,int *led,int *port,int *wait); void CloseIRSocket (int client); int FlashHTML (byte *command,byte result[]); int GetHTMLFileList (byte *command,byte result[]); int IRTransLanFlash (DEVICEINFO *dev,IRDATA_LAN_FLASH *ird,int len,uint32_t ip); -int SendASCII (byte *command,byte result[]); +int SendASCII (byte *command,byte result[],int asciimode); int GetRemotelist (byte *data,byte result[]); int GetCommandlist (byte *data,byte result[]); +int GetDevicelist (byte *data,byte result[]); void SwapWordN (word *pnt); void SwapIntN (int32_t *pnt); -void DoExecuteASCIICommand (byte command[],SOCKET sockfd,int client) +void DoExecuteASCIICommand (byte command[],SOCKET sockfd,int client,int asciimode) { int len,errcnt,sz,res; char result[65536]; @@ -110,7 +111,7 @@ len = FlashHTML (command+10,result); } else if (!strncmp (command,"snd",3)) { - len = SendASCII (command,result); + len = SendASCII (command,result,asciimode); } else if (!strncmp (command,"getremotes",10)) { len = GetRemotelist (command,result); @@ -118,6 +119,9 @@ else if (!strncmp (command,"getcommands",11)) { len = GetCommandlist (command,result); } + else if (!strncmp (command,"getdevices",10)) { + len = GetDevicelist (command,result); + } else { sprintf (result,"Illegal ASCII Command: %s\n",command); @@ -198,35 +202,102 @@ return ((int)strlen (result)); } +int GetDevicelist (byte *data,byte result[]) +{ + int i,p; + char st[10]; + + sprintf (result,"**00000 DEVICELIST %d",device_cnt); + + for (i=0;i < device_cnt;i++) { + sprintf (st,",%d ",i); + strcat (result,st); + if (IRDevices[i].io.if_type == IF_RS232) strcat (result,"SER "); + else if (IRDevices[i].io.if_type == IF_USB) strcat (result,"USB "); + else if (IRDevices[i].io.if_type == IF_LAN) { + strcat (result,"LAN "); + strcat (result,IRDevices[i].usb_serno); + strcat (result," "); + strcat (result,IRDevices[i].device_node); + strcat (result," "); + } + p = 1; + if (IRDevices[i].fw_capabilities & FN_MULTISEND2) p = 2; + else if (IRDevices[i].fw_capabilities & FN_MULTISEND4) p = 4; + else if (IRDevices[i].fw_capabilities & FN_MULTISEND8) p = 8; + else if (IRDevices[i].fw_capabilities2 & FN2_MULTISEND16) p = 16; + + if (IRDevices[i].fw_capabilities3 & FN3_MULTISTREAM) sprintf (st,"%02d MULTI",p); + else sprintf (st,"%02d PORT",p); + strcat (result,st); + } + strcat (result,"\n"); + + return ((int)strlen (result)); +} + -int SendASCII (byte *data,byte result[]) +int SendASCII (byte *data,byte result[],int asciimode) { - int res; + int i,res; int cmd_num,adr; + word framelen; char err[256],txt[256]; - char remote[80],command[20],ccf[2048]; - int netcom,netmask,bus,led,port; + char remote[80],command[512],ccf[2048]; + int netcom,netmask,bus,led,port,wait; + unsigned int ledval; - res = AnalyzeUDPString (data,&netcom,remote,command,ccf,&netmask,&bus,&led,&port); + res = AnalyzeUDPString (data,&netcom,remote,command,ccf,&netmask,&bus,&led,&port,&wait); if (res) { log_print ("Illegal IRTrans ASCII Command\n", LOG_ERROR); strcpy (result,"**00000 RESULT FORMAT ERROR\n"); return ((int)strlen (result)); } - sprintf (txt,"IRTrans ASCII Command: %d %s,%s,%d,%d\n", netcom,remote,command,bus,led); + sprintf (txt,"IRTrans ASCII Command: %d %s,%s,%d,%d,%d,%d\n", netcom,remote,command,bus,led,netmask,port); log_print (txt,LOG_DEBUG); adr = 0; if (netmask) adr |= 0x10000 | netmask; - adr |= (led & 3) << 17; + + if (led > 3) { + led -= 4; + + ledval = ((led & 7) << 27) | 0x80000000; + if (led > 7) { + led = (led & 24) / 8; + ledval |= ((led & 3) << 17); + } + adr |= ledval; + + } + else adr |= (led & 3) << 17; + if (bus == 255) adr |= 0x40000000; else adr |= bus << 19; protocol_version = 210; - if (netcom == 1) { - res = DBFindRemoteCommand (remote,command,&cmd_num,NULL); + if (netcom == COMMAND_SEND || netcom == COMMAND_SENDMASK || netcom == COMMAND_SENDMACRO) { + if (netcom == COMMAND_SENDMACRO) { + int cmd_array[16]; + word pause_array[16]; + + if (!netmask) adr |= 0x10000 | 0xffff; + + for (i=0;i < 16;i++) pause_array[i] = wait; + + res = DBFindRemoteMacro (remote,command,cmd_array,pause_array); + + for (i=0;i < 16;i++) if (pause_array[i] > 2500) pause_array[i] = 2500; + if (!res) res = SendIRMacro (cmd_array,adr,pause_array,&framelen); + } + + if (netcom == COMMAND_SEND || netcom == COMMAND_SENDMASK) { + res = DBFindRemoteCommand (remote,command,&cmd_num,NULL); + if (!res) res = SendIR (cmd_num,adr,(byte)netcom,&framelen); + } + if (res) { GetError (res, txt); switch(res) { @@ -244,8 +315,12 @@ log_print (err, LOG_ERROR); return ((int)strlen (result)); } - SendIR (cmd_num,adr,COMMAND_SEND); - strcpy (result,"**00000 RESULT OK\n"); + if (asciimode == MODE_ASCII_TIME) { + sprintf (result,"**00000 RESULT OK: %d ms\n",framelen); + } + else { + strcpy (result,"**00000 RESULT OK\n"); + } } return ((int)strlen (result)); } diff -Nru irserver-6.02.40/dbstruct.h irserver-6.03.08/dbstruct.h --- irserver-6.02.40/dbstruct.h 2010-02-08 14:24:59.000000000 +0000 +++ irserver-6.03.08/dbstruct.h 2010-06-27 22:14:59.000000000 +0000 @@ -78,8 +78,11 @@ byte timecount_mode; } IRTIMING; + typedef struct { char name[20]; + int command_link; + int remote_link; int remote; int timing; int command_length; @@ -98,6 +101,8 @@ typedef struct { char name[20]; + int command_link; + int remote_link; int remote; int timing; int command_length; diff -Nru irserver-6.02.40/debian/changelog irserver-6.03.08/debian/changelog --- irserver-6.02.40/debian/changelog 2010-06-28 17:10:56.000000000 +0000 +++ irserver-6.03.08/debian/changelog 2011-02-24 13:48:39.000000000 +0000 @@ -1,3 +1,9 @@ +irserver (6.03.08-1yavdr1) lucid; urgency=low + + * new upstream version + + -- Gerald Dachs Thu, 24 Feb 2011 14:44:22 +0100 + irserver (6.02.40-2yavdr1) lucid; urgency=low * remotes database directory was missing diff -Nru irserver-6.02.40/errcode.h irserver-6.03.08/errcode.h --- irserver-6.02.40/errcode.h 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/errcode.h 2010-11-01 20:54:39.000000000 +0000 @@ -33,6 +33,7 @@ #define ERR_TIMEOUT 4 #define ERR_READVERSION 5 #define ERR_USBCOM 6 +#define ERR_NETIO 7 #define ERR_DBOPENINPUT 11 #define ERR_REMOTENOTFOUND 12 @@ -73,6 +74,11 @@ #define ERR_SEND_DISABLED 47 #define ERR_SEND_LED 48 #define ERR_IRDB_EMPTY 49 +#define ERR_OUTPUT_BUSY 50 +#define ERR_MACRO_LENGTH 51 +#define ERR_MACRO_COUNT 52 +#define ERR_NO_MACRO 53 +#define ERR_ANALOG 54 #define ERR_LEARN_LENGTH 95 diff -Nru irserver-6.02.40/errormessage.c irserver-6.03.08/errormessage.c --- irserver-6.02.40/errormessage.c 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/errormessage.c 2010-05-05 21:56:19.000000000 +0000 @@ -271,6 +271,18 @@ case ERR_SEND_LED: sprintf (st,"Selected IR Output does not exist\n"); break; + case ERR_OUTPUT_BUSY: + sprintf (st,"IR Output Busy\n"); + break; + case ERR_MACRO_LENGTH: + sprintf (st,"Resulting Macro data too long\n"); + break; + case ERR_MACRO_COUNT: + sprintf (st,"More than 10 commands in the Macro\n"); + break; + case ERR_NO_MACRO: + sprintf (st,"Selected IRTrans device does not support Macros\n"); + break; default: sprintf (st,"Error %d\n",res); break; diff -Nru irserver-6.02.40/fileio.c irserver-6.03.08/fileio.c --- irserver-6.02.40/fileio.c 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/fileio.c 2010-12-12 18:34:12.000000000 +0000 @@ -505,7 +505,7 @@ i++; } - i = 0; + j = i = 0; while (ccf[i]) { while (ccf[i] == ' ') i++; if (ccf[i]) st[j++] = ccf[i++]; @@ -527,6 +527,19 @@ return (0); } +int ASCIIStoreLink (int client,char name[],char link[]) +{ + if (ASCIIFindCommand (sockinfo[client].fp,name,sockinfo + client) == 0) sockinfo[client].learnstatus.num_commands++; + + fprintf (sockinfo[client].fp," [%s][LINK]%s\n",name,link); + last_adress = sockinfo[client].ird.address; + + sprintf (sockinfo[client].learnstatus.received,"Link to: %s",link); + + fflush (sockinfo[client].fp); + return (0); +} + int ASCIIStoreRS232 (int client,char name[],char rs232[]) { int i,j; @@ -937,6 +950,7 @@ int rem_cnt; IRCOMMAND *cmd_pnt; int cmd_cnt; +int link_cnt; int cal_cnt; IRTIMING *tim_pnt; int tim_cnt; @@ -1037,6 +1051,7 @@ cmd_pnt = 0; cmd_cnt = 0; cal_cnt = 0; + link_cnt = 0; if (tim_pnt) free (tim_pnt); tim_pnt = 0; tim_cnt = 0; @@ -1136,8 +1151,14 @@ while (i < cmd_cnt) { if (!cmd_pnt[i].mode && (rem_pnt[cmd_pnt[i].remote].source_mask & mask)) { - rlen = rem_pnt[cmd_pnt[i].remote].rcv_len; - rstart = rem_pnt[cmd_pnt[i].remote].rcv_start; + if (cmd_pnt[i].timing == LINK_IRCOMMAND) { + rlen = rem_pnt[cmd_pnt[i].remote_link].rcv_len; + rstart = rem_pnt[cmd_pnt[i].remote_link].rcv_start; + } + else { + rlen = rem_pnt[cmd_pnt[i].remote].rcv_len; + rstart = rem_pnt[cmd_pnt[i].remote].rcv_start; + } if ((rlen == 255 && len >= cmd_pnt[i].ir_length && !memcmp (command,cmd_pnt[i].data,cmd_pnt[i].ir_length)) || (rlen && len >= rlen && rstart < rlen && !memcmp (command+rstart,cmd_pnt[i].data+rstart,rlen-rstart)) || @@ -1207,10 +1228,53 @@ } +int DBFindRemoteMacro (char remote[],char command[],int cmd_array[],word pause_array[]) +{ + char sep; + int i,j,num; + int ncmd,nrem; + + char remcmp[100]; + char cmdcmp[250]; + char sndcmd[100]; + + memset (remcmp,0,100); + memset (cmdcmp,0,250); + + strcpy (remcmp,remote); + strcpy (cmdcmp,command); + ConvertLcase (remcmp,(int)strlen (remcmp)); + ConvertLcase (cmdcmp,(int)strlen (cmdcmp)); + + nrem = DBFindRemote (remcmp); + if (nrem == -1) return (ERR_REMOTENOTFOUND); + + i = 0; + num = 0; + while (cmdcmp[i]) { + if (num == 16) return (ERR_MACRO_COUNT); + j = i; + while (cmdcmp[i] && cmdcmp[i] != ';' && cmdcmp[i] != '~') i++; + sep = cmdcmp[i]; + cmdcmp[i++] = 0; + memset (sndcmd,0,100); + strcpy (sndcmd,cmdcmp + j); + ncmd = DBFindCommand (sndcmd,&nrem); + if (ncmd == -1) return (ERR_COMMANDNOTFOUND); + if (sep == '~') { + j = i; + while (cmdcmp[i] && cmdcmp[i] != ';') i++; + cmdcmp[i++] = 0; + pause_array[num] = atoi (cmdcmp + j); + } + cmd_array[num++] = ncmd; + } + if (num < 16) cmd_array[num] = -1; + return (0); +} int DBFindRemoteCommand (char remote[],char command[],int *cmd_num,int *rem_num) { - int ncmd,nrem; char remcmp[100]; @@ -1228,9 +1292,10 @@ nrem = DBFindRemote (remcmp); if (nrem == -1) return (ERR_REMOTENOTFOUND); if (rem_num) *rem_num = nrem; - ncmd = DBFindCommand (cmdcmp,nrem); + ncmd = DBFindCommand (cmdcmp,&nrem); if (ncmd == -1) return (ERR_COMMANDNOTFOUND); *cmd_num = ncmd; + if (rem_num) *rem_num = nrem; return (0); } @@ -1253,7 +1318,7 @@ memset (cmd,' ',20); memcpy (cmd,cmd_pnt[ncmd].name,20); cmd[strlen (cmd_pnt[ncmd].name)] = '@'; - nrep = DBFindCommand (cmd,nrem); + nrep = DBFindCommand (cmd,&nrem); if (nrep == -1) return (ERR_COMMANDNOTFOUND); return (DBGetIRCode (nrep,ir,0,&mac_len,&mac_pause,0,calflag,toggle)); @@ -1300,6 +1365,9 @@ ir->ir_repeat = tim->ir_repeat; ir->repeat_pause = tim->repeat_pause; } + if ((tim->timecount_mode & (TC_SEND_POWER_MASK | TC_ACTIVE)) == (TC_SEND_POWER_LOW | TC_ACTIVE)) ir->address = INTERNAL_LEDS; + if ((tim->timecount_mode & (TC_SEND_POWER_MASK | TC_ACTIVE)) == (TC_SEND_POWER_MED | TC_ACTIVE)) ir->address = EXTERNAL_LEDS; + if ((tim->timecount_mode & (TC_SEND_POWER_MASK | TC_ACTIVE)) == (TC_SEND_POWER_HI | TC_ACTIVE)) ir->address = EXTERNAL_LEDS | INTERNAL_LEDS; } @@ -1461,7 +1529,7 @@ nrem = DBFindRemote (remcmp); if (nrem == -1) return (ERR_REMOTENOTFOUND); - ncmd = DBFindCommand (cmdcmp,nrem); + ncmd = DBFindCommand (cmdcmp,&nrem); if (ncmd == -1) return (ERR_COMMANDNOTFOUND); if (cmd_pnt[ncmd].mode == MACRO_DATA) return (ERR_ISMACRO); @@ -1588,22 +1656,27 @@ -int DBFindCommand (char command[],int remote) +int DBFindCommand (char command[],int *remote) { int p,s; - int i = rem_pnt[remote].command_start; - while (i < rem_pnt[remote].command_end) { + int i = rem_pnt[*remote].command_start; + while (i < rem_pnt[*remote].command_end) { if (!memcmp (command,cmd_pnt[i].name,20)) { - if (rem_pnt[remote].toggle_pos) { - s = rem_pnt[remote].toggle_pos; + if (cmd_pnt[i].timing == LINK_ERROR) return (-1); + if (cmd_pnt[i].timing == LINK_IRCOMMAND) { + i = cmd_pnt[i].command_link; + *remote = cmd_pnt[i].remote; + } + if (rem_pnt[*remote].toggle_pos) { + s = rem_pnt[*remote].toggle_pos; p = i; - while ((cmd_pnt[p].toggle_seq != s || memcmp (command,cmd_pnt[p].name,20)) && p < rem_pnt[remote].command_end) p++; + while ((cmd_pnt[p].toggle_seq != s || memcmp (command,cmd_pnt[p].name,20)) && p < rem_pnt[*remote].command_end) p++; if (cmd_pnt[p].toggle_seq == s) { - rem_pnt[remote].toggle_pos++; + rem_pnt[*remote].toggle_pos++; return (p); } else { - rem_pnt[remote].toggle_pos = 2; + rem_pnt[*remote].toggle_pos = 2; return (i); } } @@ -1611,7 +1684,7 @@ else if (cmd_pnt[i].toggle_seq) { s = cmd_pnt[i].toggle_pos; p = i; - while ((cmd_pnt[p].toggle_seq != s || memcmp (command,cmd_pnt[p].name,20)) && p < rem_pnt[remote].command_end) p++; + while ((cmd_pnt[p].toggle_seq != s || memcmp (command,cmd_pnt[p].name,20)) && p < rem_pnt[*remote].command_end) p++; if (cmd_pnt[p].toggle_seq == s) { cmd_pnt[i].toggle_pos++; return (p); @@ -2073,6 +2146,39 @@ } +int DBReferenceLinks (void) +{ + char st[255]; + int i,nrem,ncmd; + for (i=0;i < cmd_cnt;i++) if (cmd_pnt[i].timing == LINK_IRCOMMAND) { + nrem = DBFindRemote (cmd_pnt[i].data); + if (nrem == -1) { + sprintf (st,"Link Error [%s.%s]: Remote %s not found\n",rem_pnt[cmd_pnt[i].remote].name,cmd_pnt[i].name,cmd_pnt[i].data); + log_print (st,LOG_ERROR); + cmd_pnt[i].timing = LINK_ERROR; + continue; + } + ncmd = DBFindCommand (cmd_pnt[i].data_cal,&nrem); + if (ncmd == -1) { + sprintf (st,"Link Error [%s.%s]: Command %s not found\n",rem_pnt[cmd_pnt[i].remote].name,cmd_pnt[i].name,cmd_pnt[i].data_cal); + log_print (st,LOG_ERROR); + cmd_pnt[i].timing = LINK_ERROR; + continue; + } + if (cmd_pnt[ncmd].timing == LINK_IRCOMMAND) { + sprintf (st,"Link Error [%s.%s]: Multistep links not allowed [%s]\n",rem_pnt[cmd_pnt[i].remote].name,cmd_pnt[i].name,cmd_pnt[i].data_cal); + log_print (st,LOG_ERROR); + cmd_pnt[i].timing = LINK_ERROR; + continue; + } + cmd_pnt[i].remote_link = nrem; + cmd_pnt[i].command_link = ncmd; + memcpy (cmd_pnt[i].data,cmd_pnt[ncmd].data,cmd_pnt[ncmd].ir_length); + cmd_pnt[i].ir_length = cmd_pnt[ncmd].ir_length; + } + + return (0); +} int DBStoreCommands (FILE *fp) { @@ -2217,6 +2323,26 @@ } else cmd_cnt += res; } + else if (!strncmp (data + i,"[LINK]",6) || !strncmp (data + i,"[link]",6)) { + link_cnt++; + cmd_pnt[cmd_cnt].timing = LINK_IRCOMMAND; + cmd_pnt[cmd_cnt].remote = rem_cnt; + i += 6; + j = i; + while (data[j] && data[j] != ',') j++; + if (!data[j] || (j - i) > 80) { + sprintf (st,"**** Link Error: %s [See below for Remote name]\n",cmd_pnt[cmd_cnt].name); + log_print (st,LOG_ERROR); + } + else { + data[j++] = 0; + strcpy (cmd_pnt[cmd_cnt].data,data + i); + strncpy (cmd_pnt[cmd_cnt].data_cal,data + j,20); + ConvertLcase (cmd_pnt[cmd_cnt].data,(int)strlen (cmd_pnt[cmd_cnt].data)); + ConvertLcase (cmd_pnt[cmd_cnt].data_cal,(int)strlen (cmd_pnt[cmd_cnt].data_cal)); + cmd_cnt++; + } + } else if (!memcmp (data + i,"[RS232]",7)) { cmd_pnt[cmd_cnt].command_length = cmd_length; cmd_pnt[cmd_cnt].timing = RS232_IRCOMMAND; @@ -2237,6 +2363,15 @@ data[i+3] = p; i += 2; } + else if ((data[i] == 'x' || data[i] == 'X') && + ((data[i+1] >= '0' && data[i+1] <= '9') || (data[i+1] >= 'A' && data[i+1] <= 'F') || (data[i+1] >= 'a' && data[i+1] <= 'f')) && + ((data[i+2] >= '0' && data[i+2] <= '9') || (data[i+2] >= 'A' && data[i+2] <= 'F') || (data[i+2] >= 'a' && data[i+2] <= 'f'))) { + p = data[i+3]; + data[i+3] = 0; + cmd_pnt[cmd_cnt].data[j++] = (byte)strtol (data + i + 1,NULL,16); + data[i+3] = p; + i += 2; + } } else cmd_pnt[cmd_cnt].data[j++] = data[i]; i++; @@ -2680,6 +2815,7 @@ memset (irp,0,sizeof (IRTIMING)); irp -> transmit_freq = 38; + irp -> timecount_mode = 0; while (data[i]) { if (data[i] == '[') { @@ -2696,8 +2832,12 @@ if (!strcmp (cm,"RECS80")) irp -> mode = RECS80; if (!strcmp (cm,"RCMM")) irp -> mode = RCMM; if (!strcmp (cm,"RCMM-TOGGLE")) irp -> mode = RCMM_TOGGLE_MODE; - if (!strcmp (cm,"DUTY_CYCLE_1:2")) irp -> timecount_mode = TC_DUTY_CYCLE_2 | TC_ACTIVE; - if (!strcmp (cm,"DUTY_CYCLE_1:4")) irp -> timecount_mode = TC_DUTY_CYCLE_4 | TC_ACTIVE; + if (!strcmp (cm,"DUTY_CYCLE_1:2")) irp -> timecount_mode |= TC_DUTY_CYCLE_2 | TC_ACTIVE; + if (!strcmp (cm,"DUTY_CYCLE_1:4")) irp -> timecount_mode |= TC_DUTY_CYCLE_4 | TC_ACTIVE; + if (!strcmp (cm,"DUTY_CYCLE_1:6")) irp -> timecount_mode |= TC_DUTY_CYCLE_6 | TC_ACTIVE; + if (!strcmp (cm,"SEND_POWER_LOW")) irp -> timecount_mode |= TC_SEND_POWER_LOW | TC_ACTIVE; + if (!strcmp (cm,"SEND_POWER_MED")) irp -> timecount_mode |= TC_SEND_POWER_MED | TC_ACTIVE; + if (!strcmp (cm,"SEND_POWER_HI")) irp -> timecount_mode |= TC_SEND_POWER_HI | TC_ACTIVE; if (!strcmp (cm,"RECS80")) irp -> mode = RECS80; if (!strcmp (cm,"N")) irp -> time_cnt |= atoi (par); diff -Nru irserver-6.02.40/fileio.h irserver-6.03.08/fileio.h --- irserver-6.02.40/fileio.h 2010-02-08 14:24:59.000000000 +0000 +++ irserver-6.03.08/fileio.h 2010-08-16 22:17:33.000000000 +0000 @@ -64,6 +64,7 @@ int ASCIIStoreCommand (FILE *fp,IRDATA *ird,char name[],int timing,int seq_number); int ASCIIStoreCCF (int client,char name[],char ccf[]); int ASCIIStoreRS232 (int client,char name[],char rs232[]); +int ASCIIStoreLink (int client,char name[],char link[]); int FormatCCF (char *ccf); int ASCIIFindToggleSeq (FILE *fp,IRDATA *ird,char name[]); int ASCIIStoreTiming (FILE *fp,IRDATA *ird,NETWORKLEARNSTAT *stat); @@ -80,13 +81,18 @@ void FillInTiming (IRDATA *ir,IRTIMING *tim); int DBFindCommandName (byte command[],char remote[],char name[],byte address,int *remote_num,int *command_num,word *command_num_rel,int start); int DBFindRemoteCommand (char remote[],char command[],int *cmd_num,int *rem_num); +int DBFindRemoteMacro (char remote[],char command[],int cmd_array[],word pause_array[]); int DBFindRemoteCommandEx(char remote[],char command[],IRDATA *ir,byte cal,byte toggle); int DBGetIRCode (int cmd_num,IRDATA *ir,int idx,int *mac_len,int *mac_pause,int *rpt_len,byte calflag,byte toggle); int DBGetRepeatCode (int cmd_num,IRDATA *ir,byte calflag,byte toggle); -int DBFindCommand (char command[],int remote); +int DBFindCommand (char command[],int32_t *remote); int DBFindRemote (char remote[]); void GetNumericCode (char command[],char numeric[],char rem[],char com[]); void GetRemoteDatabase (REMOTEBUFFER *buf,int offset); int GetCommandDatabase (COMMANDBUFFER *buf,char remote[],int offset); +int DBReferenceLinks (void); #define RS232_IRCOMMAND -10 +#define LINK_IRCOMMAND -20 +#define LINK_ERROR -21 + diff -Nru irserver-6.02.40/flash.h irserver-6.03.08/flash.h --- irserver-6.02.40/flash.h 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/flash.h 2010-08-16 22:17:36.000000000 +0000 @@ -186,10 +186,13 @@ byte high_commands[50]; } ADC_ENTRY; + typedef struct { word remote_cnt; word remote_adr; word remote_hash_adr; + +#ifndef NO_RECEIVE word command_cnt; word ircommand_adr; word ircommand_hash_adr; @@ -201,8 +204,11 @@ byte rs232_config[4]; word action_cnt; word action_adr; +#endif + } IRDB_TABLE_SHORT; + typedef struct { word remote_cnt; word remote_adr; @@ -288,8 +294,16 @@ } IRDB_HEADER_ONLY; typedef union { +#ifdef FLASHROM_TRANSLATOR FLASH_CONTENT_MEMORY translation_mem; +#else + byte dummy1; +#endif +#if defined (FLASHROM_IRDB) IRDB_TABLE_SHORT irdb_mem; +#else + byte dummy2; +#endif } FLASH_COMMON_HEADER_SHORT; //typedef union { @@ -552,7 +566,7 @@ byte irdb_findircommand (byte ircommand[],byte irlen,byte adr,byte *data); byte irdb_send_string (byte *str,byte len); byte IRDBSendBinary (byte *str,byte len); -byte irdb_send (byte remote[],byte command[],byte led,word mask,byte stat); +byte irdb_send (byte remote[],byte command[],byte led,word mask,byte stat,byte pause); void ADCReceive (IRDB_REMOTE_EX *rem,IRDB_COMMAND_COMPACT *com,IRRECEIVE *ir); byte irdb_receive (void); byte irdb_format_receive (byte ircommand[],byte len,byte start,byte cmp_len,word adr); diff -Nru irserver-6.02.40/flashrom.c irserver-6.03.08/flashrom.c --- irserver-6.02.40/flashrom.c 2010-02-08 14:24:59.000000000 +0000 +++ irserver-6.03.08/flashrom.c 2010-12-12 18:34:18.000000000 +0000 @@ -126,7 +126,7 @@ } db->remote_num = res; - if (db->type >= IRDB_TYPEACTION && db->type <= IRDB_TYPEACTION_7) db->command_num = DBFindCommand (cmdcmp,db->remote_num); + if (db->type >= IRDB_TYPEACTION && db->type <= IRDB_TYPEACTION_7) db->command_num = DBFindCommand (cmdcmp,&db->remote_num); } if (db->type == IRDB_TYPEHEADER) { @@ -180,7 +180,7 @@ } else { irdb[pnt].remote_num = res; - if (irdb[pnt].type >= IRDB_TYPEACTION && irdb[pnt].type <= IRDB_TYPEACTION_7) irdb[pnt].command_num = DBFindCommand (cmdcmp,irdb[pnt].remote_num); + if (irdb[pnt].type >= IRDB_TYPEACTION && irdb[pnt].type <= IRDB_TYPEACTION_7) irdb[pnt].command_num = DBFindCommand (cmdcmp,&irdb[pnt].remote_num); } } @@ -214,6 +214,7 @@ char st[255]; byte vers,calflag,rcv_start,rcv_len,cmp_len,cmp_start,toggleflag; int i,j,flashwordsize,len,lenf,ntim,act_cnt,size; + int k,timings[1000]; word adr,cmd_cnt,rem_cnt,com_adr,hash_cnt; IRDB_HEADER *pnt; IRDB_HEADER_V3 *pnt_v3; @@ -433,6 +434,7 @@ } } + for (i=0;i < tim_cnt;i++) tim_pnt[i].flash_adr = 0; for (i=0;i <= trans_num;i++) { if (irdb[i].type == IRDB_REM) { @@ -448,6 +450,32 @@ } } } + + + for (i=0;i < 1000;i++) timings[i] = -1; + + for (i=0;i <= trans_num;i++) { + if (irdb[i].type == IRDB_REM) { + j = rem_pnt[irdb[i].remote_num].command_start; + while (j < rem_pnt[irdb[i].remote_num].command_end) { + if (cmd_pnt[j].timing == LINK_IRCOMMAND && tim_pnt[cmd_pnt[cmd_pnt[j].command_link].timing].flash_adr == 0) { // Timing noch nicht da + k = 0; + while (timings[k] != cmd_pnt[cmd_pnt[j].command_link].timing && timings[k] != -1 && k < 999) k++; + if (timings[k] == -1) { + timings[k] = cmd_pnt[cmd_pnt[j].command_link].timing + rem_pnt[cmd_pnt[j].remote_link].timing_start; + } + } + j++; + } + } + } + + i = 0; + while (timings[i] != -1 && i < 999) { + tim_pnt[timings[i]].flash_adr = adr; + adr += CopyTimingIRDB ((IRDB_TIMING *)(flash_data + adr),timings[i],bus); + i++; + } pnt->table.command_cnt = cmd_cnt; com_adr = adr; @@ -461,6 +489,9 @@ com = (IRDB_COMMAND *)(flash_data + adr); comc = (IRDB_COMMAND_COMPACT *)(flash_data + adr); + if (cmd_pnt[j].timing == LINK_IRCOMMAND) k = cmd_pnt[j].command_link; + else k = j; + if (vers >= 2) { memset (comc,0,sizeof (IRDB_COMMAND_COMPACT)); comc->remote_adr = rem_adr_det[rem_cnt]; @@ -468,8 +499,8 @@ if (len > 20) len = 20; memcpy (comc->name,cmd_pnt[j].name,len); - ntim = rem_pnt[irdb[i].remote_num].timing_start + cmd_pnt[j].timing; - if (ntim < rem_pnt[irdb[i].remote_num].timing_end) comc->timing_adr = tim_pnt[ntim].flash_adr; + ntim = rem_pnt[cmd_pnt[k].remote].timing_start + cmd_pnt[k].timing; + comc->timing_adr = tim_pnt[ntim].flash_adr; remc = (IRDB_REMOTE_COMPACT *)(flash_data + comc->remote_adr); if (!cmd_cnt) remc->command_adr = adr; @@ -486,14 +517,14 @@ memset (com->name,' ',20); memcpy (com->name,cmd_pnt[j].name,len); - ntim = rem_pnt[irdb[i].remote_num].timing_start + cmd_pnt[j].timing; - if (ntim < rem_pnt[irdb[i].remote_num].timing_end) com->timing_adr = tim_pnt[ntim].flash_adr; + ntim = rem_pnt[cmd_pnt[k].remote].timing_start + cmd_pnt[k].timing; + com->timing_adr = tim_pnt[ntim].flash_adr; rem = (IRDB_REMOTE *)(flash_data + com->remote_adr); if (!cmd_cnt) rem->command_adr = adr; if (vers >= 1) { - com->toggle_seq = cmd_pnt[j].toggle_seq; + com->toggle_seq = cmd_pnt[k].toggle_seq; adr += IRDB_COMMAND_LEN; } else adr += IRDB_COMMAND_LEN_1; @@ -566,56 +597,59 @@ com = (IRDB_COMMAND *)(flash_data + chash->adr); comc = (IRDB_COMMAND_COMPACT *)(flash_data + chash->adr); - if (!(cmd_pnt[j].mode & RAW_DATA) && ((calflag && cmd_pnt[j].ir_length_cal > CODE_LEN) || cmd_pnt[j].ir_length > CODE_LEN)) { // Long Codes packen + if (cmd_pnt[j].timing == LINK_IRCOMMAND) k = cmd_pnt[j].command_link; + else k = j; + + if (!(cmd_pnt[k].mode & RAW_DATA) && ((calflag && cmd_pnt[k].ir_length_cal > CODE_LEN) || cmd_pnt[k].ir_length > CODE_LEN)) { // Long Codes packen int ii,pp; ii = pp = 0; if (calflag) { - while (pp < cmd_pnt[j].ir_length_cal) { - if (cmd_pnt[j].data_cal[pp] & 128) ircom->ir_data_ir[ii++] = cmd_pnt[j].data_cal[pp++]; + while (pp < cmd_pnt[k].ir_length_cal) { + if (cmd_pnt[k].data_cal[pp] & 128) ircom->ir_data_ir[ii++] = cmd_pnt[k].data_cal[pp++]; else { - ircom->ir_data_ir[ii] = (cmd_pnt[j].data_cal[pp++] & 7); - if (pp < cmd_pnt[j].ir_length_cal) ircom->ir_data_ir[ii] |= ((cmd_pnt[j].data_cal[pp] & 7) << 4); + ircom->ir_data_ir[ii] = (cmd_pnt[k].data_cal[pp++] & 7); + if (pp < cmd_pnt[k].ir_length_cal) ircom->ir_data_ir[ii] |= ((cmd_pnt[k].data_cal[pp] & 7) << 4); pp++; ii++; } } ircom->ir_data_ir[0] |= LONG_CODE_FLAG; - if (pp > cmd_pnt[j].ir_length_cal) ircom->ir_data_ir[0] |= LONG_CODE_LEN; + if (pp > cmd_pnt[k].ir_length_cal) ircom->ir_data_ir[0] |= LONG_CODE_LEN; ircom->ir_length = ii; } else { - while (pp < cmd_pnt[j].ir_length) { - if (cmd_pnt[j].data[pp] & 128) pp++; + while (pp < cmd_pnt[k].ir_length) { + if (cmd_pnt[k].data[pp] & 128) pp++; else { - ircom->ir_data_ir[ii] = (cmd_pnt[j].data[pp++] & 7); - if (pp < cmd_pnt[j].ir_length) ircom->ir_data_ir[ii] |= ((cmd_pnt[j].data[pp] & 7) << 4); + ircom->ir_data_ir[ii] = (cmd_pnt[k].data[pp++] & 7); + if (pp < cmd_pnt[k].ir_length) ircom->ir_data_ir[ii] |= ((cmd_pnt[k].data[pp] & 7) << 4); pp++; ii++; } } ircom->ir_data_ir[0] |= LONG_CODE_FLAG; - if (pp > cmd_pnt[j].ir_length) ircom->ir_data_ir[0] |= LONG_CODE_LEN; + if (pp > cmd_pnt[k].ir_length) ircom->ir_data_ir[0] |= LONG_CODE_LEN; ircom->ir_length = ii; } } else { - if (calflag && !(cmd_pnt[j].mode & RAW_DATA)) { + if (calflag && !(cmd_pnt[k].mode & RAW_DATA)) { if (!toggleflag) { - memcpy (ircom->ir_data_ir,cmd_pnt[j].data_cal,(byte)cmd_pnt[j].ir_length_cal); - ircom->ir_length = (byte)cmd_pnt[j].ir_length_cal; + memcpy (ircom->ir_data_ir,cmd_pnt[k].data_cal,(byte)cmd_pnt[k].ir_length_cal); + ircom->ir_length = (byte)cmd_pnt[k].ir_length_cal; } else { - memcpy (ircom->ir_data_ir,cmd_pnt[j].data_offset,(byte)cmd_pnt[j].ir_length_offset); - ircom->ir_length = (byte)cmd_pnt[j].ir_length_offset; + memcpy (ircom->ir_data_ir,cmd_pnt[k].data_offset,(byte)cmd_pnt[k].ir_length_offset); + ircom->ir_length = (byte)cmd_pnt[k].ir_length_offset; } } else { - memcpy (ircom->ir_data_ir,cmd_pnt[j].data,(byte)cmd_pnt[j].ir_length); - ircom->ir_length = (byte)cmd_pnt[j].ir_length; + memcpy (ircom->ir_data_ir,cmd_pnt[k].data,(byte)cmd_pnt[k].ir_length); + ircom->ir_length = (byte)cmd_pnt[k].ir_length; } } @@ -624,14 +658,14 @@ if (vers >= 2) comc->ird_adr = adr; else com->ird_adr = adr; - if (cmd_pnt[j].timing == RS232_IRCOMMAND) { - if (vers >= 2) comc->timing_adr = (word)cmd_pnt[j].pause; + if (cmd_pnt[k].timing == RS232_IRCOMMAND) { + if (vers >= 2) comc->timing_adr = (word)cmd_pnt[k].pause; ircom->command_adr = 1; } - else if (cmd_pnt[j].mode & RAW_DATA) { - if (vers >= 2) comc->timing_adr = (word)cmd_pnt[j].timing; - else com->timing_adr = (word)cmd_pnt[j].timing; + else if (cmd_pnt[k].mode & RAW_DATA) { + if (vers >= 2) comc->timing_adr = (word)cmd_pnt[k].timing; + else com->timing_adr = (word)cmd_pnt[k].timing; ircom->command_adr = 0; } else { @@ -1709,8 +1743,8 @@ } if ((IRDevices[bus].fw_capabilities2 & FN2_STATEIO_SBUS) || - (IRDevices[bus].fw_capabilities2 & FN2_STATEIO_2_ANALOG) || - (IRDevices[bus].fw_capabilities2 & FN2_STATEIO_4_ANALOG) || +// (IRDevices[bus].fw_capabilities2 & FN2_STATEIO_2_ANALOG) || +// (IRDevices[bus].fw_capabilities2 & FN2_STATEIO_4_ANALOG) || (IRDevices[bus].fw_capabilities2 & FN2_STATEIO_IRIN)) { if (trans[tra].io_input & 128) irpnt->checksumme = ((trans[tra].io_input & 15) + 1) * 16 | (trans[tra].io_value & 1); diff -Nru irserver-6.02.40/functioncodes.h irserver-6.03.08/functioncodes.h --- irserver-6.02.40/functioncodes.h 2010-02-08 14:24:59.000000000 +0000 +++ irserver-6.03.08/functioncodes.h 2010-08-16 22:17:37.000000000 +0000 @@ -46,8 +46,8 @@ #define FN2_SEND_ACK 4096 #define FN2_USB_WAKEUP 8192 #define FN2_STATEIO_SBUS 16384 -#define FN2_STATEIO_2_ANALOG 32768 -#define FN2_STATEIO_4_ANALOG 65536 +//#define FN2_STATEIO_2_ANALOG 32768 Frei +//#define FN2_STATEIO_4_ANALOG 65536 DOPPELT !!! #define FN2_RS232_IO_SBUS 0x10000 #define FN2_RS232_OUT_IR 0x20000 #define FN2_AUX_RS232 0x40000 @@ -85,6 +85,17 @@ #define FN3_DUAL_RCV_EXTERNAL 256 #define FN3_WLAN 512 +#define FN3_MULTISTREAM 1024 +#define FN3_VAR_SEND_POWER 2048 +#define FN3_NO_RECEIVE 4096 +#define FN3_SEND_MACRO 8192 +#define FN3_ONE_WIRE_IR1 16384 +#define FN3_ONE_WIRE_IR2 32768 +#define FN3_ONE_WIRE_ANALOG1 0x10000 +#define FN3_ONE_WIRE_ANALOG2 0x20000 +#define FN3_IRIN_ANALOG 0x40000 + #define FN_DISPMASK 0x38000 -#define FUNCTION_FLASH_MASK ~(FN_SBUS_UART | FN_CLOCK | FN_DEBOUNCE | FN_DUALPOWERON | FN_USBWAKEUP | FN_NOSCROLL | FN_TRANSL | FN_CALIBRATE | FN_POWERON) +#define FUNCTION_FLASH_MASK ~(FN_SBUS_UART | FN_CLOCK | FN_DEBOUNCE | FN_DUALPOWERON | FN_USBWAKEUP | FN_NOSCROLL | FN_TRANSL | FN_CALIBRATE | FN_POWERON) +#define FUNCTION_FLASH_MASK_2 (FN2_AUX_RS232 | FN2_MULTISEND16) diff -Nru irserver-6.02.40/global.h irserver-6.03.08/global.h --- irserver-6.02.40/global.h 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/global.h 2010-05-05 21:57:01.000000000 +0000 @@ -57,6 +57,8 @@ #define NO_INIT_LAN 0x8000000 #define DEBUG_TIMING 0x10000000 #define PARAMETER_FILE 0x20000000 +#define ETHERNET_TCP 0x40000000 +#define TCP_RECONNECT 0x80000000 @@ -86,6 +88,7 @@ #define SELECT_IRTLAN 10 #define SELECT_CLIENT 11 #define SELECT_RS232 12 +#define SELECT_LAN_TCP 13 #define COMMAND_SERVER 102 #define COMMAND_LIRC 103 diff -Nru irserver-6.02.40/lanio.c irserver-6.03.08/lanio.c --- irserver-6.02.40/lanio.c 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/lanio.c 2010-06-27 22:14:40.000000000 +0000 @@ -58,6 +58,7 @@ #include #include #include +#include typedef int DWORD; #define closesocket close @@ -80,6 +81,7 @@ #ifdef WIN32 WSAEVENT IrtLanEvent; +LARGE_INTEGER counterRes; #endif @@ -87,8 +89,6 @@ SOCKET irtlan_socket; -int rcv_status_timeout (int timeout,uint32_t ip); - int IRTransLanFlash (DEVICEINFO *dev,IRDATA_LAN_FLASH *ird,int len,uint32_t ip) { @@ -121,10 +121,20 @@ int IRTransLanSend (DEVICEINFO *dev,IRDATA *ird) { - int res; + int res,cnt,len; char st[255]; IRDATA_LAN_LARGE irdlan; struct sockaddr_in target; + unsigned long timediff; +#ifdef WIN32 + LARGE_INTEGER time_start; + LARGE_INTEGER time_ack; +#endif +#ifdef LINUX + struct timeb tb; + long long int time_start; + long long int time_ack; +#endif memset (&irdlan,0,sizeof (IRDATA_LAN_LARGE)); @@ -141,32 +151,182 @@ irdlan.netcommand = COMMAND_FLASH_DATA; } + else if (ird->len == 0) { + irdlan.netcommand = COMMAND_LAN_PING; + } else { irdlan.netcommand = COMMAND_LAN; } + + if (ird->command == HOST_SEND_MACRO) len = ((IRDATA_MACRO *)ird)->total_len; + else len = ird->len; + + memcpy (&(irdlan.ir_data),ird,len); + if (dev) { -// irtlan_outbound = irtlan_socket; // Änderung für WiFi + if (dev->io.socket != 0) { + cnt = 0; +retry_tcp: + res = send (dev->io.socket,(char *)&irdlan,len + sizeof (IRDATA_LAN) - sizeof (IRDATA),0); + if (res <= 0) { + cnt++; + sprintf (st,"IRTRans LAN Connection with %s-%s lost [%d]\n",inet_ntoa (dev->io.IPAddr[0].sin_addr),dev->device_node,dev->io.tcp_reconnect); + log_print (st,LOG_ERROR); + if (mode_flag & TCP_RECONNECT) { +#ifdef WIN32 + WSACloseEvent (dev->io.event); +#endif + closesocket (dev->io.socket); + if (cnt <= 1) { + if (!open_irtrans_tcp (dev)) { + dev->io.tcp_reconnect++; + goto retry_tcp; + } + } + } + return (ERR_NETIO); + } + dev->io.last_time = time (0); + + if (ird->command == HOST_SEND || ird->command == HOST_RESEND || ird->command == HOST_SEND_LEDMASK || ird->command == HOST_RESEND_LEDMASK || ird->command == HOST_SEND_MACRO) { + res = rcv_status_timeout_tcp (dev,2000); + + if (res < 0) { + res = send (dev->io.socket,(char *)&irdlan,1,0); + + if (res <= 0) { + cnt++; + sprintf (st,"IRTRans LAN Connection with %s-%s lost [%d]\n",inet_ntoa (dev->io.IPAddr[0].sin_addr),dev->device_node,dev->io.tcp_reconnect); + log_print (st,LOG_ERROR); + if (mode_flag & TCP_RECONNECT) { +#ifdef WIN32 + WSACloseEvent (dev->io.event); +#endif + closesocket (dev->io.socket); + if (cnt <= 1) { + if (!open_irtrans_tcp (dev)) { + dev->io.tcp_reconnect++; + goto retry_tcp; + } + } + } + return (ERR_NETIO); + } + } + + if (res != COMMAND_SEND_ACK) { + sprintf (st,"IRTRans LAN IRSend ACK: %d\n",res); + log_print (st,LOG_ERROR); + } + + if (res == -1) return (ERR_TIMEOUT); + if (res == COMMAND_SEND_ACK_BUSY) { + return (ERR_OUTPUT_BUSY); + } + } + else msSleep (30); + return (0); + } + memcpy (&target,&dev->io.IPAddr[0],sizeof (struct sockaddr_in)); if (dev && connect (irtlan_outbound,(struct sockaddr *)&target,sizeof (struct sockaddr_in)) < 0) return (ERR_BINDSOCKET); + } + if (dev && dev->lan_version[0] == 'L' && memcmp (dev->lan_version+1,"1.07.60",7) >= 0 && (ird->command == HOST_SEND || ird->command == HOST_RESEND || ird->command == HOST_SEND_LEDMASK || ird->command == HOST_RESEND_LEDMASK || ird->command == HOST_SEND_MACRO)) { + if (dev->io.io_seq_mode && dev->io.lan_io_sequence == 0) dev->io.lan_io_sequence++; + irdlan.mode = dev->io.lan_io_sequence++; + dev->io.io_seq_mode = 1; } - memcpy (&(irdlan.ir_data),ird,ird->len); + res = send (irtlan_outbound,(char *)&irdlan,len + sizeof (IRDATA_LAN) - sizeof (IRDATA),0); + + if (dev && dev->lan_version[0] == 'L' && memcmp (dev->lan_version+1,"1.07.60",7) >= 0 && (ird->command == HOST_SEND || ird->command == HOST_RESEND || ird->command == HOST_SEND_LEDMASK || ird->command == HOST_RESEND_LEDMASK || ird->command == HOST_SEND_MACRO)) { + +#ifdef WIN32 + QueryPerformanceCounter (&time_start); + + do { + res = rcv_status_timeout (50,target.sin_addr.S_un.S_addr); + if (res == COMMAND_SEND_ACK2) { + sprintf (st,"LAN STAT: %d\n",res); + log_print (st,LOG_ERROR); + } + } while (res == COMMAND_SEND_ACK2); + + QueryPerformanceCounter (&time_ack); + timediff = (unsigned long)((time_ack.QuadPart - time_start.QuadPart) / counterRes.QuadPart); +#else + ftime (&tb); + time_start = tb.time * 10000 + tb.millitm * 10; + do { + res = rcv_status_timeout (50,target.sin_addr.s_addr); + } while (res == COMMAND_SEND_ACK2); + + ftime (&tb); + time_ack = tb.time * 10000 + tb.millitm * 10; + timediff = time_ack - time_start; +#endif + + if (res == -1 && irdlan.mode) { // No ACK received + sprintf (st,"LAN SEND - RESEND [%f ms]\n",timediff / 10.0); + log_print (st,LOG_ERROR); + res = send (irtlan_outbound,(char *)&irdlan,len + sizeof (IRDATA_LAN) - sizeof (IRDATA),0); +#ifdef WIN32 + res = rcv_status_timeout (50,target.sin_addr.S_un.S_addr); + + QueryPerformanceCounter (&time_ack); + timediff = (unsigned long)((time_ack.QuadPart - time_start.QuadPart) / counterRes.QuadPart); +#else + res = rcv_status_timeout (50,target.sin_addr.s_addr); + + ftime (&tb); + time_ack = tb.time * 10000 + tb.millitm * 10; + timediff = time_ack - time_start; +#endif + if (res == -1) return (ERR_TIMEOUT); + } - res = send (irtlan_outbound,(char *)&irdlan,ird->len + sizeof (IRDATA_LAN) - sizeof (IRDATA),0); + if (res == COMMAND_SEND_ACK_WAIT) { + sprintf (st,"Time ACK Wait: %f ms[SEQ: %d]\n",timediff / 10.0,irdlan.mode); + log_print (st,LOG_ERROR); +#ifdef WIN32 + res = rcv_status_timeout (2000,target.sin_addr.S_un.S_addr); + QueryPerformanceCounter (&time_ack); + timediff = (unsigned long)((time_ack.QuadPart - time_start.QuadPart) / counterRes.QuadPart); +#else + res = rcv_status_timeout (2000,target.sin_addr.s_addr); + + ftime (&tb); + time_ack = tb.time * 10000 + tb.millitm * 10; + timediff = time_ack - time_start; +#endif + } + if (res == COMMAND_SEND_ACK_BUSY) { + return (ERR_OUTPUT_BUSY); + } + if (res != COMMAND_SEND_ACK && res != COMMAND_SEND_ACK2) { + sprintf (st,"ACK2 Error: %d!\n",res); + log_print (st,LOG_ERROR); + return (ERR_TIMEOUT); + } + sprintf (st,"Time ACK End : %f ms\n",timediff / 10.0); + log_print (st,LOG_ERROR); + return (0); + } if (dev && dev->fw_capabilities2 & FN2_SEND_ACK && (ird->command == HOST_SEND || - ((dev->lan_version[0] != 'L' || memcmp (dev->lan_version+1,"1.07.24",7) > 0) && (ird->command == HOST_RESEND || ird->command == HOST_SEND_LEDMASK || ird->command == HOST_RESEND_LEDMASK)))) { + ((dev->lan_version[0] != 'L' || memcmp (dev->lan_version+1,"1.07.24",7) > 0) && (ird->command == HOST_RESEND || ird->command == HOST_SEND_LEDMASK || ird->command == HOST_RESEND_LEDMASK || ird->command == HOST_SEND_MACRO)))) { #ifdef WIN32 res = rcv_status_timeout (2000,target.sin_addr.S_un.S_addr); #else res = rcv_status_timeout (2000,target.sin_addr.s_addr); #endif + if (res != COMMAND_SEND_ACK) { sprintf (st,"IRTRans LAN IRSend ACK: %d\n",res); log_print (st,LOG_ERROR); } - + if (res == -1) return (ERR_TIMEOUT); } else msSleep (30); @@ -174,9 +334,122 @@ return (0); } +int open_irtrans_tcp (DEVICEINFO *dev) +{ +#ifdef WIN32 + int res; + char msg[256]; + unsigned int adr; + struct sockaddr_in serv_addr; + struct hostent *he; + struct in_addr addr; + BOOL val; + + memset (&dev->io.IPAddr,0,sizeof (dev->io.IPAddr)); + dev->io.IPAddr[0].sin_family = AF_INET; + + adr = inet_addr (dev->device_node); + if (adr == INADDR_NONE) { + he = (struct hostent *)gethostbyname (dev->device_node); + if (he == NULL) return (ERR_OPEN); + memcpy(&addr, he->h_addr_list[0], sizeof(struct in_addr)); + adr = addr.s_addr; + } + + dev->io.socket = socket (PF_INET,SOCK_STREAM,0); + if (dev->io.socket < 0) return (ERR_OPEN); + + + memset (&serv_addr,0,sizeof (serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = adr; + serv_addr.sin_port = htons (TCP_PORT); + + if (connect (dev->io.socket,(struct sockaddr *)&serv_addr,sizeof (serv_addr)) < 0) { + sprintf (msg,"TCP Connect Error\n"); + log_print (msg,LOG_ERROR); + return (ERR_OPEN); + } + + val = TRUE; + res = setsockopt (dev->io.socket,IPPROTO_TCP, TCP_NODELAY,(char *)&val,sizeof (BOOL)); + res = setsockopt (dev->io.socket,SOL_SOCKET, SO_KEEPALIVE,(char *)&val,sizeof (BOOL)); + + if (send (dev->io.socket,"BINA",4,0) < 0) { + sprintf (msg,"TCP Send Error [Init]\n"); + log_print (msg,LOG_ERROR); + return (ERR_OPEN); + } + msSleep (500); + dev->io.event = WSACreateEvent (); + WSAEventSelect (dev->io.socket,dev->io.event,FD_READ); + dev->io.IPAddr[0].sin_addr.s_addr = adr; + dev->io.IPAddr[0].sin_port = htons ((word)IRTRANS_PORT); +#endif + return (0); +} + +int rcv_status_timeout_tcp (DEVICEINFO *dev,int timeout) +{ + char st[255]; + byte data[1000]; + int stat,sz,val; + int res = -1; + struct sockaddr_in from; + +#ifdef LINUX + fd_set events; + int maxfd,wait,flags; + struct timeval tv; + + flags = fcntl (irtlan_socket,F_GETFL); +#endif + +#ifdef WIN32 + stat = WaitForSingleObject (dev->io.event,timeout); + if (stat == WAIT_TIMEOUT) return (-1); +#endif + +#ifdef LINUX + FD_ZERO (&events); + + FD_SET (irtlan_socket,&events); + maxfd = irtlan_socket + 1; + + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; + + stat = select (maxfd,&events,NULL,NULL,&tv); + if (stat == 0) return (-1); + + fcntl (irtlan_socket,F_SETFL,flags | O_NONBLOCK); +#endif + + sz = sizeof (from); + val = recvfrom (dev->io.socket,data,1000,0,(struct sockaddr *)&from,&sz); + if (val <= 0) return (-2); + res = data[0]; + +#ifdef WIN32 + WSAResetEvent (dev->io.event); +#endif + +#ifdef LINUX + fcntl (irtlan_socket,F_SETFL,flags); +#endif + if (res == COMMAND_SEND_ACK_BUSY) { + sprintf (st,"IR Output Busy: 0x%x\n",*((word *)(data+1))); + log_print (st,LOG_ERROR); + } + + return (res); +} + + int rcv_status_timeout (int timeout,uint32_t ip) { + char st[256]; byte data[1000]; int stat,sz,val; int res = -1; @@ -213,9 +486,16 @@ do { sz = sizeof (from); + val = recvfrom (irtlan_socket,data,1000,0,(struct sockaddr *)&from,&sz); #ifdef WIN32 - if (val > 0 && (!ip || from.sin_addr.S_un.S_addr == ip)) res = data[0]; + if (val > 0) { + if (!ip || from.sin_addr.S_un.S_addr == ip) res = data[0]; + else { + sprintf (st,"RCV Stat IP Error: %x\n",from.sin_addr.S_un.S_addr); + log_print (st,LOG_ERROR); + } + } #else if (val > 0 && (!ip || from.sin_addr.s_addr == ip)) res = data[0]; #endif @@ -226,6 +506,11 @@ #endif if (res == -1) goto retry; + if (res == COMMAND_SEND_ACK_BUSY) { + sprintf (st,"IR Output Busy: 0x%x\n",*((word *)(data+1))); + log_print (st,LOG_ERROR); + } + #ifdef LINUX fcntl (irtlan_socket,F_SETFL,flags); #endif @@ -299,6 +584,11 @@ exit (-1); } +#ifdef WIN32 + QueryPerformanceFrequency (&counterRes); + counterRes.QuadPart /= 10000; // Resolution = 100µs +#endif + return (0); } diff -Nru irserver-6.02.40/lowlevel.c irserver-6.03.08/lowlevel.c --- irserver-6.02.40/lowlevel.c 2010-02-08 14:24:59.000000000 +0000 +++ irserver-6.03.08/lowlevel.c 2010-12-12 18:34:28.000000000 +0000 @@ -92,9 +92,13 @@ extern byte new_lcd_flag; extern int display_bus; extern SOCKET irtlan_socket; + int OpenIRTransLANSocket (); -int OpenIRTransBroadcastSockets (void); -void DecodeFunctions (DEVICEINFO *dev); +int OpenIRTransBroadcastSockets (void); +void DecodeFunctions (DEVICEINFO *dev); +int ReadLANDeviceData (DEVICEINFO *dev); + + extern SOCKET irtlan_outbound; extern int protocol_version; extern char pidfile[256]; @@ -203,6 +207,108 @@ return (0); } +word CalcFramelength (IRDATA *ird) +{ + byte i,rc,rp; + unsigned long total_len = 0; + unsigned long framelen = 0; + + if (ird->command == HOST_SEND_MACRO) { + byte *pnt = (byte *)ird; + IRDATA_MACRO *macro = (IRDATA_MACRO *)ird; + + total_len = 1250; + pnt += sizeof (IRDATA_MACRO); + for (i=0;i < macro->ir_command_cnt;i++) { + total_len += CalcFramelength ((IRDATA *)pnt) * 1000; + total_len += macro->macro_pause[i] * 10000; + pnt += ((IRDATA *)pnt)->len; + } + + } + else if (ird -> mode & RAW_DATA) { + IRRAW *irr = (IRRAW *)ird; + for (i=0;i < irr -> ir_length;i++) { + if (irr -> data[i]) framelen += irr -> data[i] * 8; + else { + i++; + framelen += (irr -> data[i] * 256 + irr ->data [i+1]) * 8; + i++; + } + } + if (ird -> mode & 0xf) total_len = framelen * (ird->mode & 0xf); + else total_len = framelen; + + total_len += irr->len * 50; + } + else { + if (ird -> mode == TIMECOUNT_18) { + byte c; + IRDATA_18 *ird18 = (IRDATA_18 *)ird; + + for (i=0;i < ird18 -> ir_length;i++) { + c = ird18 -> data[i]; + if (c >= 'A') c -= 55; + else c -= '0'; + framelen += ird18 -> pulse_len[c] * 8 + ird18 -> pause_len[c] * 8; + } + c = ird18 -> data[i]; + if (c >= 'A') c -= 55; + else c -= '0'; + framelen -= ird18 -> pause_len[c] * 8; + + rc = ird18 -> ir_repeat; + rp = ird18 -> repeat_pause; + } + + else if (ird->mode & RC6_DATA) { + // 3555µs Start Bit + // 1178µs Trailer (1 x) + // 888µs je Datenbit + + framelen = (ird->ir_length - 2) * 888 + 3555 + 1178; + rc = ird -> ir_repeat; + rp = ird -> repeat_pause; + } + else if (ird->mode & RC5_DATA) { + // 1778µs je Bit + + framelen = ird->ir_length * 1778; + rc = ird -> ir_repeat; + rp = ird -> repeat_pause; + } + else { + // Long Codes + if ((ird->mode & START_BIT) && ird->mode != RCMM) { + for (i=0;i < ird->ir_length;i++) { + if (ird->data[i] == 'S') framelen += ird->pulse_len[0] * 8 + ird->pause_len[0] * 8; + else framelen += ird->pulse_len[(ird->data[i] & 7) + 1] * 8 + ird->pause_len[(ird->data[i] & 7) + 1] * 8; + } + framelen -= ird->pulse_len[(ird->data[i-1] & 7) + 1] * 8; + } + else { + for (i=0;i < ird->ir_length;i++) framelen += ird->pulse_len[(ird->data[i] & 7)] * 8 + ird->pause_len[(ird->data[i] & 7)] * 8; + framelen -= ird->pause_len[(ird->data[i-1] & 7)] * 8; + } + rc = ird -> ir_repeat; + rp = ird -> repeat_pause; + } + if (rc & 128) { + total_len = ((rc & 127) - 1) * rp * 1000; + total_len += framelen; + } + else { + total_len = (rc - 1) * rp * 1000; + total_len += framelen * rc; + } + + total_len += ird->len * 50; + } + + return (word)(total_len / 1000); +} + + int StoreTimerEntry (int bus,TIMERCOMMAND *tim) { int res; @@ -453,7 +559,7 @@ unsigned int cap; if (bus > MAX_IR_DEVICES) bus = 0; // Fix für Kompatibilität mit Clients < V5.0 - if (iradr == IRDevices[bus].my_addr) cap = IRDevices[bus].fw_capabilities; + if (iradr == IRDevices[bus].my_addr || (iradr & 0xff) == ADRESS_ALL) cap = IRDevices[bus].fw_capabilities; else cap = remote_statusex[bus].stat[iradr].capabilities; if ((cap & FN_EEPROM) == 0) { @@ -482,11 +588,16 @@ while (res != COMMAND_FLASH_ACK && res != COMMAND_FLASH_ACK_1 && res != COMMAND_FLASH_ACK_2 && cnt < 10) { res = WriteTransceiverEx (IRDevices + bus,&md); if (res) return (res); + if (IRDevices[bus].io.socket) { + res = rcv_status_timeout_tcp (&IRDevices[bus],2000); + } + else { #ifdef WIN32 - res = rcv_status_timeout (500,IRDevices[bus].io.IPAddr[0].sin_addr.S_un.S_addr); + res = rcv_status_timeout (500,IRDevices[bus].io.IPAddr[0].sin_addr.S_un.S_addr); #else - res = rcv_status_timeout (500,IRDevices[bus].io.IPAddr[0].sin_addr.s_addr); + res = rcv_status_timeout (500,IRDevices[bus].io.IPAddr[0].sin_addr.s_addr); #endif + } cnt++; } if (cnt == 10) fprintf (stderr,"Flash Error !\n"); @@ -597,9 +708,12 @@ if (IRDevices[bus].io.if_type == IF_LAN) { #ifdef WIN32 - res = WaitForSingleObject (IrtLanEvent,2000); + if (IRDevices[bus].io.event) res = WaitForSingleObject (IRDevices[bus].io.event,2000); + else res = WaitForSingleObject (IrtLanEvent,2000); if (res == WAIT_TIMEOUT) return (ERR_TIMEOUT); - WSAResetEvent (IrtLanEvent); + + if (IRDevices[bus].io.event) WSAResetEvent (IRDevices[bus].io.event); + else WSAResetEvent (IrtLanEvent); #endif #ifdef LINUX @@ -615,13 +729,15 @@ if (!wait) return (ERR_TIMEOUT); #endif i = sizeof (send_adr); - res = recvfrom(irtlan_socket,(byte *)&ai,sizeof (GET_ANALOG_INPUTS),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (IRDevices[bus].io.socket) res = recvfrom(IRDevices[bus].io.socket,(byte *)&ai,sizeof (GET_ANALOG_INPUTS),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + else res = recvfrom(irtlan_socket,(byte *)&ai,sizeof (GET_ANALOG_INPUTS),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (res <= 0 || res != ai.ai.len + 1 || ai.netcommand != RESULT_ANALOG_INPUT) return (ERR_TIMEOUT); } else { - res = ReadIRStringEx (IRDevices,(byte *)&(ai.ai),sizeof (ANALOG_INPUTS),500); + res = ReadIRStringEx (IRDevices,(byte *)&(ai.ai),sizeof (ANALOG_INPUTS),2000); if (res != sizeof (ANALOG_INPUTS)) return (ERR_TIMEOUT); } @@ -630,13 +746,23 @@ return (0); } +// Analog Modes: +// 1 Analogeingänge lesen. Auswahl über Mask (Bitmaske) (0 = alte Methode ohne Ex) OK +// 8 Temperatur lesen (OneWire). Ein Sensor OK +// 9 Temperatur lesen (OneWire). Auswahl über Mask (Bitmaske) Lesen in Reihenfolge der Sortierung. OK +// 10 Temperatur lesen (OneWire). Auswahl über Device IDs (max. 8 Sensoren) Mask = Anzahl OK +// 16 ID Liste der OneWire Sensoren OK + +// 64/128 Resolution bei 18B20 + + +int ReadAnalogInputsEx (int bus,word mask,byte mode,byte id[],ANALOG_INPUTS_EX *inputs) -/* -int ReadAnalogInputs (int bus,byte mask,ANALOG_DATA *inputs) { - IRRAW md; + char st[255]; + ANALOG_REQUEST al; int res,i; - GET_ANALOG_DATA ad; + GET_ANALOG_INPUTS_EX ai; struct sockaddr_in send_adr; #ifdef LINUX @@ -645,33 +771,31 @@ struct timeval tv; #endif - md.command = READ_ANALOG_INPUTS; - md.address = mask; - - md.len = 18; - - md.address = 64; // Addresse / modus - md.ir_length = 1; // Modus One Wire Temp Read - - - ((byte *)md.data)[0] = 0x10; - ((byte *)md.data)[1] = 0x05; - ((byte *)md.data)[2] = 0xcc; - ((byte *)md.data)[3] = 0x71; - ((byte *)md.data)[4] = 0x01; - ((byte *)md.data)[5] = 0x08; - ((byte *)md.data)[6] = 0x00; - ((byte *)md.data)[7] = 0xe9; + al.command = READ_ANALOG_INPUTS; + al.mask = mask; + al.mode = mode; + + if ((mode & 63) == 10) { + if (mask > 8) mask = 8; + al.len = 7 + 8 * mask; // Auswahl von max. 8 Devices über IDs + memcpy (al.id,id,mask * 8); // IDs kopieren + } + else al.len = 7; // Standard Auswahl - res = WriteTransceiverEx (IRDevices + bus,(IRDATA *)&md); + res = WriteTransceiverEx (IRDevices + bus,(IRDATA *)&al); if (res) return (res); + memset (&ai,0,sizeof (GET_ANALOG_INPUTS_EX)); + memset (inputs,0,sizeof (ANALOG_INPUTS_EX)); if (IRDevices[bus].io.if_type == IF_LAN) { #ifdef WIN32 - res = WaitForSingleObject (IrtLanEvent,2000); + if (IRDevices[bus].io.event) res = WaitForSingleObject (IRDevices[bus].io.event,2000); + else res = WaitForSingleObject (IrtLanEvent,2000); if (res == WAIT_TIMEOUT) return (ERR_TIMEOUT); - WSAResetEvent (IrtLanEvent); + + if (IRDevices[bus].io.event) WSAResetEvent (IRDevices[bus].io.event); + else WSAResetEvent (IrtLanEvent); #endif #ifdef LINUX @@ -687,37 +811,30 @@ if (!wait) return (ERR_TIMEOUT); #endif i = sizeof (send_adr); - res = recvfrom(irtlan_socket,(byte *)&ad,sizeof (GET_ANALOG_DATA),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); - if (res <= 0 || res != ad.ad.a_input.len + 1 || ad.netcommand != RESULT_ANALOG_INPUT) return (ERR_TIMEOUT); + if (IRDevices[bus].io.socket) res = recvfrom(IRDevices[bus].io.socket,(byte *)&ai,sizeof (GET_ANALOG_INPUTS_EX),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + else res = recvfrom(irtlan_socket,(byte *)&ai,sizeof (GET_ANALOG_INPUTS_EX),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + + if (res <= 0 || res != ai.ai.len + 1 || ai.netcommand != RESULT_ANALOG_INPUT) return (ERR_TIMEOUT); - for (res=0;res <= 15;res++) { - if (ad.ad.a_info.mode[res] == 3) { - printf ("Mode[%d]: %d: ",res,ad.ad.a_info.mode[res]); - - crc = 0; - for (i=0;i <= 7;i++) { - crc_1wire (ad.ad.a_info.id[res][i]); - printf ("%02x.",ad.ad.a_info.id[res][i]); - } - printf ("%d\n",crc); - } - } - } else { -// res = ReadIRStringEx (IRDevices,(byte *)&(ai.ai),sizeof (ANALOG_INPUTS),500); -// if (res != sizeof (ANALOG_INPUTS)) return (ERR_TIMEOUT); + res = ReadIRStringEx (IRDevices,(byte *)&(ai.ai),sizeof (ANALOG_INPUTS_EX),2000); + if (res != ai.ai.len) return (ERR_TIMEOUT); } - memcpy (inputs,&(ad.ad.a_input),sizeof (ANALOG_DATA)); + sprintf (st,"Read Analog Len: %d\n",ai.ai.len); + log_print (st,LOG_DEBUG); + for (i=0;i < 16;i++) { + sprintf (st," %02d: Mode: %d VAL: %x %x %x %x %x %x %x %x\n",i,ai.ai.mode[i],ai.ai.data[i].id[0],ai.ai.data[i].id[1],ai.ai.data[i].id[2],ai.ai.data[i].id[3],ai.ai.data[i].id[4],ai.ai.data[i].id[5],ai.ai.data[i].id[6],ai.ai.data[i].id[7]); + log_print (st,LOG_DEBUG); + } + + memcpy (inputs,&(ai.ai),ai.ai.len); return (0); } -*/ - - int SetRelaisEx (int bus,byte val,byte rel) { IRDATA md; @@ -805,7 +922,7 @@ int GetBusInfoDetail (STATUS_BUFFER *sb,int bus) { - int i,res,j; + int i,res,j,flg; char st[255]; STATUS_LINE_LAN sl; STATUS_LINE_LAN_1 sl1; @@ -830,6 +947,60 @@ #endif if (IRDevices[bus].io.if_type == IF_LAN) { + if (IRDevices[bus].fw_capabilities3 & FN3_MULTISTREAM) { + ir.len = 4; + for (j=0;j <= 15;j++) { + ir.address = j; + res = WriteTransceiverEx (IRDevices + bus,&ir); + if (res) return (ERR_TIMEOUT); + flg = 1; +#ifdef WIN32 + while (flg) { + if (IRDevices[bus].io.event) res = WaitForSingleObject (IRDevices[bus].io.event,5000); + else res = WaitForSingleObject (IrtLanEvent,5000); + if (res == WAIT_TIMEOUT) return (ERR_TIMEOUT); + + if (IRDevices[bus].io.event) WSAResetEvent (IRDevices[bus].io.event); + else WSAResetEvent (IrtLanEvent); + + i = sizeof (send_adr); + memset (&sl,0,sizeof (sl)); + if (IRDevices[bus].io.socket) { + send_adr.sin_addr.S_un.S_addr = IRDevices[bus].io.IPAddr[0].sin_addr.S_un.S_addr; + res = recv (IRDevices[bus].io.socket,(byte *)&sl,sizeof (sl),MSG_NOSIGNAL); + i = 0; + send (IRDevices[bus].io.socket,(char *)&i,1,0); // Send byte to force TCP ACK + } + else res = recvfrom(irtlan_socket,(byte *)&sl,sizeof (sl),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + + if (res <= 0 || res != sl.stat.sbus_len + 1) return (ERR_TIMEOUT); + if (sl.netcommand == RESULT_DEVSTATUS && send_adr.sin_addr.S_un.S_addr == IRDevices[bus].io.IPAddr[0].sin_addr.S_un.S_addr) { + IRDevices[bus].my_addr = 0; + if (res == sizeof (STATUS_LINE_LAN_1) || res == (sizeof (STATUS_LINE_LAN_1) - 102)) { + memcpy (&sl1,&sl,sizeof (STATUS_LINE_LAN_1)); + memset (&sl,0,sizeof (STATUS_LINE_LAN)); + sl.stat.capabilities = sl1.stat.capabilities; + sl.stat.device_mode = sl1.stat.device_mode; + sl.stat.extended_mode = sl1.stat.extended_mode; + sl.stat.extended_mode2 = sl1.stat.extended_mode2; + sl.stat.extended_mode_ex[0] = sl1.stat.extended_mode_ex[0]; + sl.stat.extended_mode_ex[1] = sl1.stat.extended_mode_ex[1]; + sl.stat.send_mask = sl1.stat.send_mask; + memcpy (sl.stat.version ,sl1.stat.version,10); + memcpy (sl.stat.wake_mac,sl1.stat.wake_mac,6); + if (res == sizeof (STATUS_LINE_LAN_1)) { + memcpy (sl.stat.remote,sl1.stat.remote,81); + memcpy (sl.stat.command,sl1.stat.command,21); + } + } + memcpy (&sb->stat[j],&sl.stat,sizeof (STATUS_LINE)); + flg = 0; + } + } +#endif + } + return (0); + } res = WriteTransceiverEx (IRDevices + bus,&ir); if (res) return (ERR_TIMEOUT); @@ -838,14 +1009,23 @@ #ifdef WIN32 if (IRDevices[bus].fw_capabilities & FN_SBUS) for (j=0;j < 16;j++) while (1) { - res = WaitForSingleObject (IrtLanEvent,5000); - + if (IRDevices[bus].io.event) res = WaitForSingleObject (IRDevices[bus].io.event,5000); + else res = WaitForSingleObject (IrtLanEvent,5000); if (res == WAIT_TIMEOUT) return (ERR_TIMEOUT); - WSAResetEvent (IrtLanEvent); + if (IRDevices[bus].io.event) WSAResetEvent (IRDevices[bus].io.event); + else WSAResetEvent (IrtLanEvent); + i = sizeof (send_adr); memset (&sl,0,sizeof (sl)); - res = recvfrom(irtlan_socket,(byte *)&sl,sizeof (sl),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (IRDevices[bus].io.socket) { + send_adr.sin_addr.S_un.S_addr = IRDevices[bus].io.IPAddr[0].sin_addr.S_un.S_addr; + res = recv (IRDevices[bus].io.socket,(byte *)&sl,sizeof (sl),MSG_NOSIGNAL); + i = 0; + send (IRDevices[bus].io.socket,(char *)&i,1,0); // Send byte to force TCP ACK + } + else res = recvfrom(irtlan_socket,(byte *)&sl,sizeof (sl),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (res <= 0 || res != sl.stat.sbus_len + 1) return (ERR_TIMEOUT); if (sl.netcommand == RESULT_DEVSTATUS && send_adr.sin_addr.S_un.S_addr == IRDevices[bus].io.IPAddr[0].sin_addr.S_un.S_addr) { IRDevices[bus].my_addr = 0; @@ -872,13 +1052,23 @@ } } else while (1) { - res = WaitForSingleObject (IrtLanEvent,5000); + if (IRDevices[bus].io.event) res = WaitForSingleObject (IRDevices[bus].io.event,5000); + else res = WaitForSingleObject (IrtLanEvent,5000); if (res == WAIT_TIMEOUT) return (ERR_TIMEOUT); - WSAResetEvent (IrtLanEvent); + if (IRDevices[bus].io.event) WSAResetEvent (IRDevices[bus].io.event); + else WSAResetEvent (IrtLanEvent); + i = sizeof (send_adr); memset (&sl,0,sizeof (sl)); - res = recvfrom(irtlan_socket,(byte *)&sl,sizeof (sl),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (IRDevices[bus].io.socket) { + send_adr.sin_addr.S_un.S_addr = IRDevices[bus].io.IPAddr[0].sin_addr.S_un.S_addr; + res = recv (IRDevices[bus].io.socket,(byte *)&sl,sizeof (sl),MSG_NOSIGNAL); + i = 0; + send (IRDevices[bus].io.socket,(char *)&i,1,0); // Send byte to force TCP ACK + } + else res = recvfrom(irtlan_socket,(byte *)&sl,sizeof (sl),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (res <= 0 || res != sl.stat.sbus_len + 1) return (ERR_TIMEOUT); if (sl.netcommand == RESULT_DEVSTATUS && send_adr.sin_addr.S_un.S_addr == IRDevices[bus].io.IPAddr[0].sin_addr.S_un.S_addr) { IRDevices[bus].my_addr = 0; @@ -996,10 +1186,17 @@ log_print (st,LOG_DEBUG); if (res == sizeof (STATUS_BUFFER) || res == sizeof (STATUS_BUFFER_1) || res == sizeof (STATUS_BUFFER_2) || - res == sizeof (STATUS_BUFFER_3) || res == sizeof (STATUS_BUFFER_4) || res == sizeof (STATUS_BUFFER_5)) break; + res == sizeof (STATUS_BUFFER_3) || res == sizeof (STATUS_BUFFER_4) || res == sizeof (STATUS_BUFFER_5) || res == sizeof (STATUS_LINE_LAN)) break; } if (i == 3) return (ERR_TIMEOUT); + if (res == sizeof (STATUS_LINE_LAN)) { + memcpy (&sbc,sb,sizeof (STATUS_BUFFER)); + memset (sb,0,sizeof (STATUS_BUFFER)); + sb->my_adress = 0; + memcpy (&sb->stat[0],((byte *)&sbc) + 1,sizeof (STATUS_LINE)); + } + if (res == sizeof (STATUS_BUFFER)) { memcpy (&sbc,sb,sizeof (STATUS_BUFFER)); memset (sb,0,sizeof (STATUS_BUFFER)); @@ -1182,7 +1379,79 @@ } -int SendIR (int cmd_num,int address,byte netcommand) +int SendIRMacro (int cmd_num[],int address,word macro_pause[16],word *framelen) +{ + byte data[1200]; + int num,res,bus = 0,maxlen; + IRDATA_MACRO *macro; + IRDATA ird; + int mac_len,mac_pause,rpt_len; + + bus = (address >> 19) & (MAX_IR_DEVICES - 1); + + if ((IRDevices[bus].fw_capabilities3 & FN3_SEND_MACRO) == 0) return (ERR_NO_MACRO); + + if (IRDevices[bus].io.socket != 0) maxlen = 930 - 68; // TCP Send + else maxlen = 982 - 68; // UDP Send + +/* Später evtl. integrieren + if (cmd_pnt[cmd_num].timing == RS232_IRCOMMAND) { + if (bus == 0xffff) for (i=0;icommand = HOST_SEND_MACRO; + macro->target_mask = (word)address & 0xffff; + macro->total_len = macro->len = sizeof (IRDATA_MACRO); + + num = 0; + while (num < 16 && cmd_num[num] != -1) { + macro->macro_pause[num] = macro_pause[num] / 10; + res = DBGetIRCode (cmd_num[num++],&ird,0,&mac_len,&mac_pause,&rpt_len,1,1); + if (res) return (res); + if (ird.mode == TIMECOUNT_18) { + ird.len = (sizeof (IRDATA_18) - CODE_LEN_18) + ((IRDATA_18 *)&ird) -> ir_length; + } + else if ((ird.mode & SPECIAL_IR_MODE) == PULSE_200) { + ird.len = (sizeof (IRDATA_SINGLE) - CODE_LEN_SINGLE) + ird.ir_length; + } + else if (ird.mode & RAW_DATA) { + ird.len = (sizeof (IRDATA) - (CODE_LEN + (RAW_EXTRA))) + ird.ir_length; + } + else { + ird.len = (sizeof (IRDATA) - CODE_LEN) + ird.ir_length; + if (ird.mode & RC6_DATA) ird.len++; + } + + if ((IRDevices[bus].fw_capabilities3 & FN3_MULTISTREAM) == 0) ird.address = 0; // Kein Multistream -> kein LED Power select + + ird.target_mask = (word)address & 0xffff; + ird.checksumme = get_checksumme (&ird); + + macro->ir_command_cnt++; + if ((macro->total_len + ird.len) > maxlen) return (ERR_MACRO_LENGTH); + memcpy (data + macro->total_len,&ird,ird.len); + macro->total_len += ird.len; + } + + if (framelen) *framelen = CalcFramelength ((IRDATA *)macro); + + if (mode_flag & CODEDUMP) PrintPulseData ((IRDATA *)macro); + + // Swap IRData für Macros + res = WriteTransceiverEx (&IRDevices[bus],(IRDATA *)macro); + + return (res); +} + + + +int SendIR (int cmd_num,int address,byte netcommand,word *framelen) { byte cal = 0,tog = 0; int i,res,bus = 0,rpt; @@ -1219,13 +1488,21 @@ ird.target_mask = (word)address & 0xffff; } - ird.address = 0; + if (bus == 0xffff) { + if ((IRDevices[0].fw_capabilities3 & FN3_MULTISTREAM) == 0) ird.address = 0; // Kein Multistream -> kein LED Power select + } + else { + if ((IRDevices[bus].fw_capabilities3 & FN3_MULTISTREAM) == 0) ird.address = 0; + } + if (address & 0x80000000) { ird.address |= ((address >> 25) & 28) + 4; ird.address += ((address >> 17) & 3) * 32; } else if (address & 0x60000) ird.address = (byte)((address >> 17) & 3); + if (framelen) *framelen = CalcFramelength (&ird); + if (!rpt)res = DoSendIR (&ird,&ird_rpt,rpt_len,mac_pause,bus,netcommand); else res = DoSendIR (&ird,NULL,rpt_len,mac_pause,bus,netcommand); @@ -1239,7 +1516,13 @@ ird.target_mask = (word)address & 0xffff; } - ird.address = 0; + if (bus == 0xffff) { + if ((IRDevices[0].fw_capabilities3 & FN3_MULTISTREAM) == 0) ird.address = 0; // Kein Multistream -> kein LED Power select + } + else { + if ((IRDevices[bus].fw_capabilities3 & FN3_MULTISTREAM) == 0) ird.address = 0; + } + if (address & 0x80000000) { ird.address |= ((address >> 25) & 28) + 4; ird.address += ((address >> 17) & 3) * 32; @@ -1320,13 +1603,18 @@ unsigned int end_time; IRDATA snd; + cmd = HOST_SEND; + rcmd = HOST_RESEND; + if (netcommand == COMMAND_SENDMASK) { - cmd = HOST_SEND_LEDMASK; - rcmd = HOST_RESEND_LEDMASK; - } - else { - cmd = HOST_SEND; - rcmd = HOST_RESEND; + if (bus != 255 && (IRDevices[bus].fw_capabilities & FN_MULTISEND8)) { + cmd = HOST_SEND_LEDMASK; + rcmd = HOST_RESEND_LEDMASK; + } + else if (bus != 255 && !(IRDevices[bus].fw_capabilities3 & FN3_MULTISTREAM)) { + ir_data->address = 2; // External LED + ir_data->target_mask = 0xffff; // All Devices + } } ir_data -> command = cmd; @@ -1411,16 +1699,16 @@ if (ir_rep && GetMsTime () < end_time) { if (bus == 0xffff) for (i=0;iaddress,i)) return res; - if (TransferToTimelen18 (ir_data,&snd,i)) { - if (!IRDevices[i].io.ext_carrier) snd.transmit_freq = Convert2OldCarrier (ir_data->transmit_freq); + if (res = CheckLEDValid (ir_rep->address,i)) return res; + if (TransferToTimelen18 (ir_rep,&snd,i)) { + if (!IRDevices[i].io.ext_carrier) snd.transmit_freq = Convert2OldCarrier (ir_rep->transmit_freq); res = WriteTransceiverEx (&IRDevices[i],&snd); } } else { if (res = CheckLEDValid (ir_data->address,bus)) return res; - if (TransferToTimelen18 (ir_data,&snd,bus)) { - if (!IRDevices[bus].io.ext_carrier) snd.transmit_freq = Convert2OldCarrier (ir_data->transmit_freq); + if (TransferToTimelen18 (ir_rep,&snd,bus)) { + if (!IRDevices[bus].io.ext_carrier) snd.transmit_freq = Convert2OldCarrier (ir_rep->transmit_freq); res = WriteTransceiverEx (&IRDevices[bus],&snd); } } @@ -1429,7 +1717,7 @@ while (GetMsTime () < end_time) { ir_data -> command = rcmd; - ir_data -> len = 3; + ir_data -> len = 6; if (bus == 0xffff) for (i=0;iaddress,i)) return res; @@ -1668,13 +1956,16 @@ memset (buf,0,10); do { #ifdef WIN32 - res = WaitForSingleObject (IrtLanEvent,timeout); + if (dev->io.event) res = WaitForSingleObject (dev->io.event,timeout); + else res = WaitForSingleObject (IrtLanEvent,timeout); if (res == WAIT_TIMEOUT) { buf[0] = 5; IRTransLanSend (dev,(IRDATA *)buf); return (ERR_TIMEOUT); } - WSAResetEvent (IrtLanEvent); + + if (dev->io.event) WSAResetEvent (dev->io.event); + else WSAResetEvent (IrtLanEvent); #endif #ifdef LINUX @@ -1691,14 +1982,15 @@ #endif i = sizeof (send_adr); - res = recvfrom(irtlan_socket,buf,sizeof (IRDATA),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (dev->io.socket) res = recvfrom(dev->io.socket,buf,sizeof (IRDATA),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + else res = recvfrom(irtlan_socket,buf,sizeof (IRDATA),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); if (res <= 0 || res != buf[1] + 1) { sprintf (buf,"Learn Error: %d - %d\n",res,buf[1]); log_print (buf,LOG_ERROR); return (ERR_TIMEOUT); } - } while (buf[0] != RESULT_LEARN || send_adr.sin_addr.s_addr != dev->io.IPAddr[0].sin_addr.s_addr); + } while (buf[0] != RESULT_LEARN || (send_adr.sin_addr.s_addr != dev->io.IPAddr[0].sin_addr.s_addr && !(dev->io.socket))); memcpy (ird,buf+1,buf[1]); @@ -1718,6 +2010,8 @@ do { ir_data -> address = 0; + ir_data -> target_mask = 0; // NEU + ir_data -> ir_length = 0; // NEU if ((addr & 0x7f) <= 15) ir_data -> address |= addr; if ((addr & 0x7f) == 'L') ir_data -> address |= ADRESS_LOCAL; if ((addr & 0x7f) == '*') ir_data -> address |= ADRESS_ALL; @@ -1855,6 +2149,8 @@ do { ir_data -> address = 0; + ir_data -> target_mask = 0; // NEU + ir_data -> ir_length = 0; // NEU if ((addr & 0x7f) <= 15) ir_data -> address |= addr; if ((addr & 0x7f) == 'L') ir_data -> address |= ADRESS_LOCAL; if ((addr & 0x7f) == '*') ir_data -> address |= ADRESS_ALL; @@ -1952,6 +2248,8 @@ do { ir_data -> address = 0; + ir_data -> target_mask = 0; // NEU + ir_data -> ir_length = 0; // NEU if ((addr & 0x7f) <= 15) ir_data -> address |= addr; if ((addr & 0x7f) == 'L') ir_data -> address |= ADRESS_LOCAL; if ((addr & 0x7f) == '*') ir_data -> address |= ADRESS_ALL; @@ -2048,6 +2346,8 @@ do { ir_data -> address = 0; + ir_data -> target_mask = 0; // NEU + ir_data -> ir_length = 0; // NEU if ((addr & 0x7f) <= 15) ir_data -> address |= addr; if ((addr & 0x7f) == 'L') ir_data -> address |= ADRESS_LOCAL; if ((addr & 0x7f) == '*') ir_data -> address |= ADRESS_ALL; @@ -2134,6 +2434,8 @@ do { ir_data -> address = 0; + ir_data -> target_mask = 0; // NEU + ir_data -> ir_length = 0; // NEU if ((addr & 0x7f) <= 15) ir_data -> address |= addr; if ((addr & 0x7f) == 'L') ir_data -> address |= ADRESS_LOCAL; if ((addr & 0x7f) == '*') ir_data -> address |= ADRESS_ALL; @@ -2255,97 +2557,108 @@ void PrintPulseData (IRDATA *ir_data) { - int i,frq; + int i,frq,framelen; char msg[256]; - frq = ir_data->transmit_freq; - - if (frq == 255) frq = 1000; - else if (frq & 128) frq = (frq & 127) * 4; - - if (ir_data->mode == TIMECOUNT_18) { - sprintf (msg,"Timecount18 Mode\n"); - log_print (msg,LOG_INFO); - for (i=0;i < TIME_LEN_18;i++) { - sprintf (msg,"TIME: %2d %4d %4d\n",i,((IRDATA_18 *)ir_data)->pulse_len[i] * 8,((IRDATA_18 *)ir_data)->pause_len[i] * 8); - log_print (msg,LOG_INFO); - } - sprintf (msg,"T.REP : %4d\n",((IRDATA_18 *)ir_data)->repeat_pause); - log_print (msg,LOG_INFO); - sprintf (msg,"REP/MODE: %4d %d\n",((IRDATA_18 *)ir_data)->ir_repeat,ir_data -> mode); - log_print (msg,LOG_INFO); - sprintf (msg,"FREQ : %4d\n",frq); - log_print (msg,LOG_INFO); - sprintf (msg,"DATA : %s\n",((IRDATA_18 *)ir_data)->data); - log_print (msg,LOG_INFO); - sprintf (msg,"LEN : %4d\n",((IRDATA_18 *)ir_data)->ir_length); - log_print (msg,LOG_INFO); - sprintf (msg,"ADR : %d\n",((IRDATA_18 *)ir_data) -> address); - log_print (msg,LOG_INFO); - sprintf (msg,"MASK : %d\n",((IRDATA_18 *)ir_data) -> target_mask); - log_print (msg,LOG_INFO); - } - else if ((ir_data->mode & SPECIAL_IR_MODE) == PULSE_200) { - sprintf (msg,"PULSE: %4d\n",((IRDATA_SINGLE *)ir_data)->single_len * 8); - log_print (msg,LOG_INFO); - for (i=0;i < TIME_LEN_SINGLE;i++) { - sprintf (msg,"PAUSE: %2d %4d\n",i,((IRDATA_SINGLE *)ir_data)->multi_len[i] * 8); - log_print (msg,LOG_INFO); - } - sprintf (msg,"T.REP : %4d\n",((IRDATA_SINGLE *)ir_data)->repeat_pause); - log_print (msg,LOG_INFO); - sprintf (msg,"REP/MODE: %4d %d\n",((IRDATA_SINGLE *)ir_data)->ir_repeat,ir_data -> mode); - log_print (msg,LOG_INFO); - sprintf (msg,"FREQ : %4d\n",frq); - log_print (msg,LOG_INFO); - sprintf (msg,"DATA : %s\n",((IRDATA_SINGLE *)ir_data)->data); - log_print (msg,LOG_INFO); - sprintf (msg,"LEN : %4d\n",((IRDATA_SINGLE *)ir_data)->ir_length); - log_print (msg,LOG_INFO); - sprintf (msg,"ADR : %d\n",((IRDATA_SINGLE *)ir_data) -> address); - log_print (msg,LOG_INFO); - sprintf (msg,"MASK : %d\n",((IRDATA_SINGLE *)ir_data) -> target_mask); + if (ir_data->command == HOST_SEND_MACRO) { + IRDATA_MACRO *macro = (IRDATA_MACRO *)ir_data; + sprintf (msg,"IR Macro\nNr: %d\n",macro->ir_command_cnt); log_print (msg,LOG_INFO); } + else { - sprintf (msg,"TIME CNT: %d\n",ir_data->time_cnt); - log_print (msg,LOG_INFO); - for (i=0;i < TIME_LEN;i++) { - sprintf (msg,"TIME : %d %4d %4d\n",i,ir_data -> pulse_len[i] * 8,ir_data -> pause_len[i] * 8); + frq = ir_data->transmit_freq; + + if (frq == 255) frq = 1000; + else if (frq & 128) frq = (frq & 127) * 4; + + if (ir_data->mode == TIMECOUNT_18) { + sprintf (msg,"Timecount18 Mode\n"); + log_print (msg,LOG_INFO); + for (i=0;i < TIME_LEN_18;i++) { + sprintf (msg,"TIME: %2d %4d %4d\n",i,((IRDATA_18 *)ir_data)->pulse_len[i] * 8,((IRDATA_18 *)ir_data)->pause_len[i] * 8); + log_print (msg,LOG_INFO); + } + sprintf (msg,"T.REP : %4d\n",((IRDATA_18 *)ir_data)->repeat_pause); + log_print (msg,LOG_INFO); + sprintf (msg,"REP/MODE: %4d %d\n",((IRDATA_18 *)ir_data)->ir_repeat,ir_data -> mode); + log_print (msg,LOG_INFO); + sprintf (msg,"FREQ : %4d\n",frq); + log_print (msg,LOG_INFO); + sprintf (msg,"DATA : %s\n",((IRDATA_18 *)ir_data)->data); + log_print (msg,LOG_INFO); + sprintf (msg,"LEN : %4d\n",((IRDATA_18 *)ir_data)->ir_length); + log_print (msg,LOG_INFO); + sprintf (msg,"ADR : %d\n",((IRDATA_18 *)ir_data) -> address); + log_print (msg,LOG_INFO); + sprintf (msg,"MASK : %d\n",((IRDATA_18 *)ir_data) -> target_mask); log_print (msg,LOG_INFO); } - sprintf (msg,"T.REP : %4d\n",ir_data->repeat_pause); - log_print (msg,LOG_INFO); - sprintf (msg,"REP/MODE: %4d %d\n",ir_data->ir_repeat,ir_data -> mode); - log_print (msg,LOG_INFO); - sprintf (msg,"FREQ : %4d\n",frq); - log_print (msg,LOG_INFO); - if (ir_data->data[0] & 128) { - for (i=0;i < ir_data->ir_length;i++) { - sprintf (msg,"DATA [%03d]:%x - %x\n",i,ir_data->data[i] & 0x77,ir_data->data[i]); + else if ((ir_data->mode & SPECIAL_IR_MODE) == PULSE_200) { + sprintf (msg,"PULSE: %4d\n",((IRDATA_SINGLE *)ir_data)->single_len * 8); + log_print (msg,LOG_INFO); + for (i=0;i < TIME_LEN_SINGLE;i++) { + sprintf (msg,"PAUSE: %2d %4d\n",i,((IRDATA_SINGLE *)ir_data)->multi_len[i] * 8); log_print (msg,LOG_INFO); } + sprintf (msg,"T.REP : %4d\n",((IRDATA_SINGLE *)ir_data)->repeat_pause); + log_print (msg,LOG_INFO); + sprintf (msg,"REP/MODE: %4d %d\n",((IRDATA_SINGLE *)ir_data)->ir_repeat,ir_data -> mode); + log_print (msg,LOG_INFO); + sprintf (msg,"FREQ : %4d\n",frq); + log_print (msg,LOG_INFO); + sprintf (msg,"DATA : %s\n",((IRDATA_SINGLE *)ir_data)->data); + log_print (msg,LOG_INFO); + sprintf (msg,"LEN : %4d\n",((IRDATA_SINGLE *)ir_data)->ir_length); + log_print (msg,LOG_INFO); + sprintf (msg,"ADR : %d\n",((IRDATA_SINGLE *)ir_data) -> address); + log_print (msg,LOG_INFO); + sprintf (msg,"MASK : %d\n",((IRDATA_SINGLE *)ir_data) -> target_mask); + log_print (msg,LOG_INFO); } - else { - if (ir_data->data[0] < '0') { - for (i=0;i < ir_data->data[0];i++) { - sprintf (msg,"OFFSET : %d\n",ir_data->data[i]); + sprintf (msg,"TIME CNT: %d\n",ir_data->time_cnt); + log_print (msg,LOG_INFO); + for (i=0;i < TIME_LEN;i++) { + sprintf (msg,"TIME : %d %4d %4d\n",i,ir_data -> pulse_len[i] * 8,ir_data -> pause_len[i] * 8); + log_print (msg,LOG_INFO); + } + sprintf (msg,"T.REP : %4d\n",ir_data->repeat_pause); + log_print (msg,LOG_INFO); + sprintf (msg,"REP/MODE: %4d %d\n",ir_data->ir_repeat,ir_data -> mode); + log_print (msg,LOG_INFO); + sprintf (msg,"FREQ : %4d\n",frq); + log_print (msg,LOG_INFO); + if (ir_data->data[0] & 128) { + for (i=0;i < ir_data->ir_length;i++) { + sprintf (msg,"DATA [%03d]:%x - %x\n",i,ir_data->data[i] & 0x77,ir_data->data[i]); log_print (msg,LOG_INFO); } - sprintf (msg, "DATA : %s\n",ir_data->data + i); } - else sprintf (msg, "DATA : %s\n",ir_data->data); + + else { + if (ir_data->data[0] < '0') { + for (i=0;i < ir_data->data[0];i++) { + sprintf (msg,"OFFSET : %d\n",ir_data->data[i]); + log_print (msg,LOG_INFO); + } + sprintf (msg, "DATA : %s\n",ir_data->data + i); + } + else sprintf (msg, "DATA : %s\n",ir_data->data); + log_print (msg,LOG_INFO); + } + sprintf (msg,"LEN : %4d\n",ir_data->ir_length); + log_print (msg,LOG_INFO); + sprintf (msg,"ADR : %d\n",ir_data -> address); + log_print (msg,LOG_INFO); + sprintf (msg,"MASK : %d\n",ir_data -> target_mask); log_print (msg,LOG_INFO); } - sprintf (msg,"LEN : %4d\n",ir_data->ir_length); - log_print (msg,LOG_INFO); - sprintf (msg,"ADR : %d\n",ir_data -> address); - log_print (msg,LOG_INFO); - sprintf (msg,"MASK : %d\n",ir_data -> target_mask); - log_print (msg,LOG_INFO); } + framelen = CalcFramelength (ir_data); + sprintf (msg,"Total Code Len: %d ms\n",framelen); + log_print (msg,LOG_INFO); } @@ -2550,9 +2863,8 @@ unsigned int adr; int loop,res,i,p,q,autoflag = 0; char st[1024],msg[256]; - GETVERSION_LAN_EX2 ver; IRDATA_LAN irdlan; - struct sockaddr_in target,send_adr; + struct sockaddr_in target; #ifdef LINUX fd_set events; @@ -2685,13 +2997,13 @@ else if (!strncmp (st + q,"/dev/tty",8)) res = get_detail_deviceinfo ("",st+q,IF_RS232); else if (!strcmp (st + q,"dummy")) res = 0; #endif - else if (st[q] >= '1' && st[q] <= '9') { - + else if (st[q] >= '0' && st[q] <= '9') { dev = IRDevices + device_cnt; strcpy (dev->device_node,st+q); dev->io.if_type = IF_LAN; dev->usb_serno[0] = 0; + dev->io.socket = 0; #ifdef WIN32 dev->io.comport = INVALID_HANDLE_VALUE; dev->io.event = NULL; @@ -2702,24 +3014,76 @@ dev->io.event = 0; #endif - memset (&dev->io.IPAddr,0,sizeof (dev->io.IPAddr)); - dev->io.IPAddr[0].sin_family = AF_INET; + if (mode_flag & ETHERNET_TCP) { +#ifdef WIN32 + struct sockaddr_in serv_addr; + struct hostent *he; + struct in_addr addr; + BOOL val; + + memset (&dev->io.IPAddr,0,sizeof (dev->io.IPAddr)); + dev->io.IPAddr[0].sin_family = AF_INET; + adr = inet_addr (dev->device_node); + if (adr == INADDR_NONE) { + he = (struct hostent *)gethostbyname (dev->device_node); + if (he == NULL) return (ERR_OPEN); + memcpy(&addr, he->h_addr_list[0], sizeof(struct in_addr)); + adr = addr.s_addr; + } - adr = inet_addr(dev->device_node); - // Hier Erweiterung auf Devicenamen -/* - haddr = gethostbyaddr ((char *)&adr,4,AF_INET); - if (haddr == NULL) { - sprintf (msg,"\nCan not open device %s.\nAborting ...\n\n",st+q); - log_print (msg,LOG_FATAL); - exit (-1); + dev->io.socket = socket (PF_INET,SOCK_STREAM,0); + if (dev->io.socket < 0) return (ERR_OPEN); + + + memset (&serv_addr,0,sizeof (serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = adr; + serv_addr.sin_port = htons (TCP_PORT); + + if (connect (dev->io.socket,(struct sockaddr *)&serv_addr,sizeof (serv_addr)) < 0) { + sprintf (msg,"TCP Connect Error\n"); + log_print (msg,LOG_ERROR); + return (ERR_OPEN); + } + + val = TRUE; + res = setsockopt (dev->io.socket,IPPROTO_TCP, TCP_NODELAY,(char *)&val,sizeof (BOOL)); + res = setsockopt (dev->io.socket,SOL_SOCKET, SO_KEEPALIVE,(char *)&val,sizeof (BOOL)); + + if (send (dev->io.socket,"BINA",4,0) < 0) { + sprintf (msg,"TCP Send Error [Init]\n"); + log_print (msg,LOG_ERROR); + return (ERR_OPEN); + } + msSleep (500); + dev->io.event = WSACreateEvent (); + WSAEventSelect (dev->io.socket,dev->io.event,FD_READ); + dev->io.IPAddr[0].sin_addr.s_addr = adr; + dev->io.IPAddr[0].sin_port = htons ((word)IRTRANS_PORT); +#endif } + else { + memset (&dev->io.IPAddr,0,sizeof (dev->io.IPAddr)); + dev->io.IPAddr[0].sin_family = AF_INET; + adr = inet_addr(dev->device_node); + // Hier Erweiterung auf Devicenamen +/* + haddr = gethostbyaddr ((char *)&adr,4,AF_INET); + if (haddr == NULL) { + sprintf (msg,"\nCan not open device %s.\nAborting ...\n\n",st+q); + log_print (msg,LOG_FATAL); + exit (-1); + } */ - dev->io.IPAddr[0].sin_addr.s_addr = adr; - dev->io.IPAddr[0].sin_port = htons ((word)IRTRANS_PORT); - + dev->io.IPAddr[0].sin_addr.s_addr = adr; + dev->io.IPAddr[0].sin_port = htons ((word)IRTRANS_PORT); + } res = GetTransceiverVersionEx (dev); - if (res) return (ERR_OPEN); + if (res) { + sprintf (msg,"Getversion Error\n"); + log_print (msg,LOG_ERROR); + return (ERR_OPEN); + } else device_cnt++; } @@ -2743,7 +3107,7 @@ irdlan.ir_data.command = HOST_VERSION; irdlan.ir_data.len = 8; - irdlan.ir_data.address = VERSION_MAGIC_1; + irdlan.ir_data.address = VERSION_MAGIC_5; irdlan.ir_data.target_mask = VERSION_MAGIC_2; irdlan.ir_data.ir_length = VERSION_MAGIC_3; irdlan.ir_data.transmit_freq = VERSION_MAGIC_4; @@ -2800,6 +3164,10 @@ #ifdef WIN32 do { #endif + dev = IRDevices + device_cnt; + res = ReadLANDeviceData (dev); + if (!res) { +/* i = sizeof (send_adr); res = recvfrom(irtlan_socket,(byte *)&ver,sizeof (GETVERSION_LAN_EX2),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); @@ -2835,23 +3203,7 @@ dev->fw_capabilities3 = 0; dev->fw_capabilities4 = 0; } - -#ifdef WIN32 - dev->io.comport = INVALID_HANDLE_VALUE; - dev->io.event = NULL; -#endif - -#ifdef LINUX - dev->io.comport = 0; - dev->io.event = 0; -#endif - - memset (&dev->io.IPAddr,0,sizeof (dev->io.IPAddr)); - dev->io.IPAddr[0].sin_family = AF_INET; - - dev->io.IPAddr[0].sin_addr.s_addr = send_adr.sin_addr.s_addr; - dev->io.IPAddr[0].sin_port = htons ((word)IRTRANS_PORT); - +*/ DecodeFunctions (dev); device_cnt++; @@ -3044,6 +3396,7 @@ res = WriteTransceiverEx (IRDevices + bus,(IRDATA *)&sysps); if (res) return (res); + msSleep (800); return (0); } @@ -3075,7 +3428,8 @@ if (dev->io.if_type == IF_LAN) while (1) { res = WriteTransceiverEx (dev,&ir); #ifdef WIN32 - res = WaitForSingleObject (IrtLanEvent,2000); + if (dev->io.event) res = WaitForSingleObject (dev->io.event,2000); + else res = WaitForSingleObject (IrtLanEvent,2000); if (res == WAIT_TIMEOUT) { #endif @@ -3095,10 +3449,12 @@ } else { #ifdef WIN32 - WSAResetEvent (IrtLanEvent); + if (dev->io.event) WSAResetEvent (dev->io.event); + else WSAResetEvent (IrtLanEvent); #endif i = sizeof (send_adr); - res = recvfrom(irtlan_socket,data,sizeof (SYS_PARAMETER_GET) + 1,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (dev->io.socket) res = recvfrom(dev->io.socket,data,sizeof (SYS_PARAMETER_GET) + 1,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + else res = recvfrom(irtlan_socket,data,sizeof (SYS_PARAMETER_GET) + 1,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); if (res == data[1] + 1 && data[0] == RESULT_EEPROM) { off = 2; break; @@ -3111,7 +3467,8 @@ res = ReadIRStringEx (dev,data,sizeof (SYS_PARAMETER),1000); if (!res) return (ERR_READVERSION); - off = 0; + if (dev->fw_capabilities3 & FN3_WLAN) off = 0; + else off = 1; } buf->statustype = STATUS_SYSPARAMETER; @@ -3147,7 +3504,8 @@ if (dev->io.if_type == IF_LAN) while (1) { res = WriteTransceiverEx (dev,&ir); #ifdef WIN32 - res = WaitForSingleObject (IrtLanEvent,2000); + if (dev->io.event) res = WaitForSingleObject (dev->io.event,2000); + else res = WaitForSingleObject (IrtLanEvent,2000); if (res == WAIT_TIMEOUT) { #endif @@ -3167,10 +3525,13 @@ } else { #ifdef WIN32 - WSAResetEvent (IrtLanEvent); + if (dev->io.event) WSAResetEvent (dev->io.event); + else WSAResetEvent (IrtLanEvent); #endif i = sizeof (send_adr); - res = recvfrom(irtlan_socket,data,sizeof (WIFI_MODE) + 1,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (dev->io.socket) res = recvfrom(dev->io.socket,data,sizeof (WIFI_MODE) + 1,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + else res = recvfrom(irtlan_socket,data,sizeof (WIFI_MODE) + 1,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (res == data[1] + 1 && data[0] == RESULT_EEPROM) { off = 1; break; @@ -3220,7 +3581,8 @@ if (dev->io.if_type == IF_LAN) while (1) { res = WriteTransceiverEx (dev,&ir); #ifdef WIN32 - res = WaitForSingleObject (IrtLanEvent,2000); + if (dev->io.event) res = WaitForSingleObject (dev->io.event,2000); + else res = WaitForSingleObject (IrtLanEvent,2000); if (res == WAIT_TIMEOUT) { #endif @@ -3240,17 +3602,23 @@ } else { #ifdef WIN32 - WSAResetEvent (IrtLanEvent); + if (dev->io.event) WSAResetEvent (dev->io.event); + else WSAResetEvent (IrtLanEvent); #endif i = sizeof (send_adr); - res = recvfrom(irtlan_socket,data,sizeof (LAN_PARAMETER) + 1,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (dev->io.socket) res = recvfrom(dev->io.socket,data,sizeof (LAN_PARAMETER) + 1,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + else res = recvfrom(irtlan_socket,data,sizeof (LAN_PARAMETER) + 1,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); if (res == data[1] + 1 && data[0] == RESULT_EEPROM) { break; } } } - else return (ERR_READVERSION); + else { + res = WriteTransceiverEx (dev,&ir); + res = ReadIRStringEx (dev,data,sizeof (LAN_PARAMETER),1000); + if (res != data[0]) return (ERR_READVERSION); + } buf->statustype = STATUS_LANPARAMETER; buf->statuslen = sizeof (LANSTATUSBUFFER); @@ -3307,11 +3675,9 @@ int GetTransceiverVersionEx (DEVICEINFO *dev) { - int i,res; + int res; char data[100]; IRDATA ir; - GETVERSION_LAN_EX3 ver; - struct sockaddr_in send_adr; #ifdef LINUX fd_set events; @@ -3354,7 +3720,8 @@ dev->version[8] = 0; dev->usb_serno[0] = 0; #ifdef WIN32 - res = WaitForSingleObject (IrtLanEvent,2000); + if (dev->io.event) res = WaitForSingleObject (dev->io.event,4000); + else res = WaitForSingleObject (IrtLanEvent,2000); if (res == WAIT_TIMEOUT) { #endif @@ -3392,52 +3759,11 @@ break; } else { -#ifdef WIN32 - WSAResetEvent (IrtLanEvent); +#ifdef WIN32 + if (dev->io.event) WSAResetEvent (dev->io.event); + else WSAResetEvent (IrtLanEvent); #endif - i = sizeof (send_adr); - res = recvfrom(irtlan_socket,(byte *)&ver,sizeof (GETVERSION_LAN_EX3),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); - if (res == ver.len + 1 && ver.netcommand == RESULT_GETVERSION) { - dev = IRDevices + device_cnt; - - dev->io.if_type = IF_LAN; - strcpy (dev->name,"IRTrans Ethernet"); - memcpy (dev->version,ver.ir_version,8); - memcpy (dev->lan_version,ver.lan_version,8); - dev->fw_capabilities = ver.ir_capabilities; - dev->fw_serno = ver.ir_serno; - memcpy (dev->mac_adr,ver.mac_adr,6); - dev->cap_string[0] = 0; - swap_int (&dev->fw_serno); - swap_int (&dev->fw_capabilities); - - if (res == sizeof (GETVERSION_LAN_EX3)) { - memcpy (&dev->extended_mode_ex,&ver.extended_mode_ex,8); - memcpy (&dev->extended_mode_ex2,&ver.extended_mode_ex2,8); - memcpy (&dev->ext_rs232_setting,&ver.ext_rs232_setting,8); - } - - if (res >= sizeof (GETVERSION_LAN_EX2)) { - dev->extended_mode = ver.extended_mode; - dev->extended_mode2 = ver.extended_mode2; - memcpy (&dev->extended_mode_ex,&ver.extended_mode_ex,2); - } - - if (res >= sizeof (GETVERSION_LAN_EX)) { - dev->fw_capabilities2 = ver.ir_capabilities2; - dev->fw_capabilities3 = ver.ir_capabilities3; - dev->fw_capabilities4 = ver.ir_capabilities4; - swap_int (&dev->fw_capabilities2); - swap_int (&dev->fw_capabilities3); - swap_int (&dev->fw_capabilities4); - } - else { - dev->fw_capabilities2 = 0; - dev->fw_capabilities3 = 0; - dev->fw_capabilities4 = 0; - } - break; - } + if (ReadLANDeviceData (dev) == 0) break; } } @@ -3528,6 +3854,80 @@ return (0); } +int ReadLANDeviceData (DEVICEINFO *dev) +{ + int i,res; + GETVERSION_LAN_EX3 ver; + struct sockaddr_in send_adr; + + i = sizeof (send_adr); + if (dev->io.socket) { + res = recvfrom(dev->io.socket,(byte *)&ver,sizeof (GETVERSION_LAN_EX3),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + } + else { + res = recvfrom(irtlan_socket,(byte *)&ver,sizeof (GETVERSION_LAN_EX3),MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + } + + if (res == ver.len + 1 && ver.netcommand == RESULT_GETVERSION) { + dev->io.if_type = IF_LAN; + strcpy (dev->name,"IRTrans Ethernet"); + memcpy (dev->version,ver.ir_version,8); + memcpy (dev->lan_version,ver.lan_version,8); + dev->fw_capabilities = ver.ir_capabilities; + dev->fw_serno = ver.ir_serno; + memcpy (dev->mac_adr,ver.mac_adr,6); + dev->cap_string[0] = 0; + swap_int (&dev->fw_serno); + swap_int (&dev->fw_capabilities); + + if (res == sizeof (GETVERSION_LAN_EX3)) { + memcpy (&dev->extended_mode_ex,&ver.extended_mode_ex,8); + memcpy (&dev->extended_mode_ex2,&ver.extended_mode_ex2,8); + memcpy (&dev->ext_rs232_setting,&ver.ext_rs232_setting,8); + } + + if (res >= sizeof (GETVERSION_LAN_EX2)) { + dev->extended_mode = ver.extended_mode; + dev->extended_mode2 = ver.extended_mode2; + memcpy (&dev->extended_mode_ex,&ver.extended_mode_ex,2); + } + + if (res >= sizeof (GETVERSION_LAN_EX)) { + dev->fw_capabilities2 = ver.ir_capabilities2; + dev->fw_capabilities3 = ver.ir_capabilities3; + dev->fw_capabilities4 = ver.ir_capabilities4; + swap_int (&dev->fw_capabilities2); + swap_int (&dev->fw_capabilities3); + swap_int (&dev->fw_capabilities4); + } + else { + dev->fw_capabilities2 = 0; + dev->fw_capabilities3 = 0; + dev->fw_capabilities4 = 0; + } +#ifdef WIN32 + dev->io.comport = INVALID_HANDLE_VALUE; + dev->io.event = NULL; +#endif + +#ifdef LINUX + dev->io.comport = 0; + dev->io.event = 0; +#endif + + memset (&dev->io.IPAddr,0,sizeof (dev->io.IPAddr)); + dev->io.IPAddr[0].sin_family = AF_INET; + + dev->io.IPAddr[0].sin_addr.s_addr = send_adr.sin_addr.s_addr; + dev->io.IPAddr[0].sin_port = htons ((word)IRTRANS_PORT); + + return (0); + } + if (res == -1) return (-1); + return (1); +} + + void DecodeFunctions (DEVICEINFO *dev) { dev->io.raw_repeat = 0; @@ -3564,7 +3964,7 @@ strcpy (dev->name,"IRTrans Translator"); break; case 'U': - strcpy (dev->name,"IRTrans USB"); + strcpy (dev->name,"IRTrans USB "); break; case 'V': strcpy (dev->name,"IRTrans USB 455kHz"); @@ -3576,13 +3976,13 @@ strcpy (dev->name,"IRTrans RS232 455kHz"); break; case 'E': - strcpy (dev->name,"IRTrans LAN"); + strcpy (dev->name,"IRTrans LAN "); break; case 'G': strcpy (dev->name,"IRTrans LAN 455kHz"); break; case 'W': - strcpy (dev->name,"IRTrans WiFi"); + strcpy (dev->name,"IRTrans WiFi "); break; } dev->cap_string[0] = 0; @@ -3615,11 +4015,14 @@ void Hexdump_File (IRDATA *ird) { - int i; + int i,len; byte *pnt; + if (ird->command == HOST_SEND_MACRO) len = ((IRDATA_MACRO *)ird)->total_len; + else len = ird->len; + pnt = (byte *)ird; - for (i=0;i < ird->len;i++) { + for (i=0;i < len;i++) { fprintf (hexfp,"0x%02x ",pnt[i]); if (((i+1)%16) == 0) fprintf (hexfp,"\n"); } @@ -3630,13 +4033,17 @@ void Hexdump_IO (IRDATA *ird) { - int i,j; - char st[2048],nm[100]; + int i,j,len; + char st[4096],nm[100]; byte *pnt; + + if (ird->command == HOST_SEND_MACRO) len = ((IRDATA_MACRO *)ird)->total_len; + else len = ird->len; + strcpy (st,"IODUMP:\n000 "); pnt = (byte *)ird; - for (i=0;i < ird->len;i++) { + for (i=0;i < len;i++) { sprintf (nm,"%02x ",pnt[i]); strcat (st,nm); if ((i & 0xf) == 0xf) { @@ -3673,13 +4080,16 @@ void Hexdump_Medialon (IRDATA *ird) { - int i; - char st[2048],nm[100]; + int i,len; + char st[4096],nm[100]; byte *pnt; + if (ird->command == HOST_SEND_MACRO) len = ((IRDATA_MACRO *)ird)->total_len; + else len = ird->len; + st[0] = 0; pnt = (byte *)ird; - for (i=0;i < ird->len;i++) { + for (i=0;i < len;i++) { sprintf (nm,"!%02x",pnt[i]); strcat (st,nm); } @@ -3696,7 +4106,6 @@ int count = 0,max,timeo; IRDATA_LARGE send; byte buffer[1024],sbuffer[1024]; - dev->io.io_sequence++; if (dev->version[0] == 0 && src->command != HOST_VERSION) return (ERR_WRONGBUS); @@ -3830,17 +4239,23 @@ void swap_irdata (IRDATA *src,IRDATA *tar) { - int i; + int i,len; IRDATA *ir; if (tar) { - memcpy (tar,src,src->len); + if (src->command == HOST_SEND_MACRO) len = ((IRDATA_MACRO *)src)->total_len; + else len = src->len; + memcpy (tar,src,len); ir = tar; } else ir = src; if (!byteorder || ir ->command == HOST_SEND_RS232) return; + if (ir->command == HOST_SEND_MACRO) { + return; + } + swap_word (&ir->target_mask); if (ir->mode == TIMECOUNT_18) { @@ -4435,8 +4850,18 @@ ir.command = HOST_VERSION; ir.len = 8; - ir.address = VERSION_MAGIC_1; - ir.target_mask = VERSION_MAGIC_2; + + if (usbmode == 1) { + ir.address = VERSION_MAGIC_5; + ir.target_mask = VERSION_MAGIC_2; + ir.ir_length = VERSION_MAGIC_3; + ir.transmit_freq = VERSION_MAGIC_4; + } + + else { + ir.address = VERSION_MAGIC_1; + ir.target_mask = VERSION_MAGIC_2; + } ir.checksumme = get_checksumme (&ir); @@ -4508,7 +4933,31 @@ } if (res != 8) return (ERR_READVERSION); - if (strcmp (version+1,"5.10.01") >= 0) { + if (strcmp (version+1,"6.04.46") >= 0) { + res = ReadIRString (data,68,500,usbmode); + + if (res != 68) return (ERR_READVERSION); + + memcpy (cap,data,4); + swap_int (cap); + memcpy (cap2,data+4,4); + swap_int (cap2); + memcpy (cap3,data+8,4); + swap_int (cap3); + memcpy (cap4,data+12,4); + swap_int (cap4); + + memcpy (serno,data + 16,4); + swap_int ((int32_t *)serno); + if (*serno == 2802 || *serno == 0x11223344) *serno = 0; + + memcpy (mac_adr,data + 38,6); + + } + + + + else if (strcmp (version+1,"5.10.01") >= 0) { res = ReadIRString (data,20,500,usbmode); if (res != 20) return (ERR_READVERSION); memcpy (cap,data,4); diff -Nru irserver-6.02.40/lowlevel.h irserver-6.03.08/lowlevel.h --- irserver-6.02.40/lowlevel.h 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/lowlevel.h 2010-11-01 20:54:41.000000000 +0000 @@ -25,8 +25,31 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#ifdef WIN32 +#include +#include +#endif +#ifdef LINUX +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif +word CalcFramelength (IRDATA *ird); int ReadHTMLDirectory (void); int SetTransceiverIDEx (int bus,byte id); int GetBusInfo (STATUS_BUFFER *sb); @@ -36,7 +59,8 @@ int SetTransceiverModusEx2 (int bus,byte addr,char *hotcode,int hotlen); int TransferFlashdataEx (int bus,word data[],int adr,int len,byte active,int iradr); int ReadFlashdataEx (int bus,int adr); -int SendIR (int cmd_num,int address,byte netcommand); +int SendIR (int cmd_num,int address,byte netcommand,word *framelen); +int SendIRMacro (int cmd_num[],int address,word macro_pause[],word *framelen); int DoSendIR (IRDATA *ir_data,IRDATA *ir_rep,int rpt_len,int rpt_pause,int bus,byte netcommand); int SendIRDataEx (IRDATA *ir_data,int address); int SendLCD (IRRAW *ir_data,int address); @@ -48,6 +72,7 @@ int SetPowerLED (int bus,byte mode,byte val); int SetRelaisEx (int bus,byte val,byte rel); int ReadAnalogInputs (int bus,byte mask,ANALOG_INPUTS *inputs); +int ReadAnalogInputsEx (int bus,word mask,byte mode,byte id[],ANALOG_INPUTS_EX *inputs); //int ReadAnalogInputs (int bus,byte mask,ANALOG_DATA *inputs); int SendSerialBlock (int bus,byte data[],byte len,byte param); int StoreTimerEntry (int bus,TIMERCOMMAND *tim); @@ -83,7 +108,7 @@ void ConvertLCDCharset (byte *pnt); void LCDTimeCommand (byte mode); void SetSpecialChars (byte dat[]); -void SetLCDProcCharsV (byte dat[]); +void SetLCDProcCharsV (byte dat[]); void FlushUSB (void); void FlushCom (void); @@ -98,6 +123,7 @@ void swap_irdata (IRDATA *src,IRDATA *tar); void swap_word (word *pnt); void swap_int (int32_t *pnt); +void SwapWordN (word *pnt); int GetByteorder (void); void SwapStatusbuffer (STATUS_BUFFER *sb); unsigned int GetMsTime (void); @@ -105,7 +131,9 @@ int get_detail_deviceinfo (char serno[],char devnode[],byte if_type); void sort_ir_devices (char selstring[]); void CloseIRTransLANSocket (void); -void CloseServerSockets (SOCKET sock,SOCKET lirc, SOCKET udp,SOCKET web); +void CloseServerSockets (SOCKET sock,SOCKET lirc, SOCKET udp,SOCKET web); + + extern byte byteorder; @@ -145,12 +173,16 @@ byte advanced_lcd; byte io_seq_mode; byte io_sequence; + byte lan_io_sequence; char node[20]; FT_HANDLE usbport; HANDLE comport; HANDLE event; OVERLAPPED ov_read; OVERLAPPED ov_write; + SOCKET socket; + time_t last_time; + int tcp_reconnect; struct sockaddr_in IPAddr[16]; char receive_buffer[4][256]; int receive_cnt[4]; @@ -208,6 +240,10 @@ int OpenVirtualComport (char Pname[],HANDLE *port); int WritePort (DEVICEINFO *dev,byte pnt[],int len); int OpenComFiles (void); +int rcv_status_timeout (int timeout,uint32_t ip); +int rcv_status_timeout_tcp (DEVICEINFO *dev,int timeout); +int open_irtrans_tcp (DEVICEINFO *dev); + extern DEVICEINFO IRDevices[MAX_IR_DEVICES]; extern int device_cnt; diff -Nru irserver-6.02.40/network.h irserver-6.03.08/network.h --- irserver-6.02.40/network.h 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/network.h 2010-11-01 20:54:44.000000000 +0000 @@ -114,8 +114,15 @@ #define COMMAND_STOREWLAN 76 #define COMMAND_READ_SYSPARAM 77 #define COMMAND_WRITE_SYSPARAM 78 -#define COMMAND_LANPARAM 79 +#define COMMAND_LANPARAM 79 +#define COMMAND_LOGLEVEL 80 +#define COMMAND_LEARNLINK 81 +#define COMMAND_SENDMACRO 82 +#define COMMAND_READ_ANALOG_EX 83 +#define COMMAND_NORECEIVE 84 +#define COMMAND_LAN_ANALOG 'a' // 97 +#define COMMAND_LAN_PING 'p' // 112 #define COMMAND_SENDSTRING 's' // 115 @@ -149,6 +156,7 @@ #define STATUS_WLANPARAMETER 26 #define STATUS_SYSPARAMETER 27 #define STATUS_LANPARAMETER 28 +#define STATUS_ANALOGINPUT_EX 29 #define STATUS_ASCII 65 @@ -200,6 +208,15 @@ int8_t framebuffer[200]; } OLD_LCDCOMMAND; +typedef struct { + uint8_t netcommand; // 0 + uint8_t mode; // 1 + uint16_t pause; // 2 + int32_t adress; // 4 + int32_t protocol_version; // 8 + int8_t remote[80]; // 12 + int8_t command[416]; // 92 +} MACRO_NETCOMMAND; // 508 typedef struct { uint8_t netcommand; @@ -486,13 +503,19 @@ int16_t statuslen; int16_t statustype; ANALOG_INPUTS inputs; -// ANALOG_DATA inputs; } ANALOGBUFFER; typedef struct { uint32_t clientid; int16_t statuslen; int16_t statustype; + ANALOG_INPUTS_EX inputs; +} ANALOGBUFFER_EX; + +typedef struct { + uint32_t clientid; + int16_t statuslen; + int16_t statustype; int32_t serno; int32_t functions; int8_t version[8]; @@ -830,6 +853,8 @@ #define MODE_ASCII 1 +#define MODE_ASCII_TIME 5 +#define MODE_NO_RECEIVE 10 #define TCP_PORT 21000 diff -Nru irserver-6.02.40/pictures.h irserver-6.03.08/pictures.h --- irserver-6.02.40/pictures.h 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/pictures.h 2010-05-05 21:57:09.000000000 +0000 @@ -774,5 +774,6 @@ 0x20,0x20,0x20,0x20,0x20,0x54,0x48,0x49,0x53,0x20,0x4f,0x50,0x54,0x49,0x4f,0x4e, 0x20,0x57,0x49,0x4c,0x4c,0x20,0x4e,0x4f,0x54,0x20,0x53,0x54,0x41,0x52,0x54,0x20, 0x54,0x48,0x45,0x20,0x53,0x45,0x52,0x56,0x45,0x52,0x2e,0x20,0x49,0x54,0x20,0x4f, -0x4e,0x4c,0x59,0x20,0x53,0x45,0x54,0x53,0x20,0x54,0x48,0x45,0x20,0x49,0x44,0x21 +0x4e,0x4c,0x59,0x20,0x53,0x45,0x54,0x53,0x20,0x54,0x48,0x45,0x20,0x49,0x44,0x21, +0x00 }; diff -Nru irserver-6.02.40/remote.h irserver-6.03.08/remote.h --- irserver-6.02.40/remote.h 2010-02-08 14:24:59.000000000 +0000 +++ irserver-6.03.08/remote.h 2010-12-12 18:34:44.000000000 +0000 @@ -69,6 +69,7 @@ #endif #endif +#define MAX_1WIRE_ID 16 #ifdef AMEX #define VCC_THRESHOLD 180 @@ -167,10 +168,53 @@ byte data[CODE_LENRAW]; // 9 } IRRAW; +typedef struct { + byte len; // 0 + byte checksumme; // 1 + byte command; // 2 + byte address; // 3 + word target_mask; // 4 + + word total_len; // 6 + byte ir_command_cnt; // 8 + byte macro_pause[16]; // 9 +} IRDATA_MACRO; // 25 + + +typedef struct { + byte len; // 0 + byte checksumme; // 1 + byte command; // 2 + + byte address; // 3 + word mask; // 4 + + byte mode; // 6 + byte id[8][8]; // 7 +} ANALOG_REQUEST; // 73 + +typedef struct { + byte len; // 0 + byte checksumme; // 1 + byte command; // 2 + + byte address; // 3 + word mask; // 4 + + byte mode; // 6 + byte id[8][8]; // 7 + byte idlist[MAX_1WIRE_ID][8]; // 73 +} ANALOG_BUFFER; //201 + + + typedef union { - IRDATA irdata; - IRRAW irraw; - IRDATA_18 irdata18; + IRDATA irdata; + IRRAW irraw; + IRDATA_18 irdata18; + IRDATA_MACRO irmacro; + ANALOG_REQUEST analog; + ANALOG_BUFFER abuffer; } IRDATA_ALL; typedef struct { @@ -191,7 +235,7 @@ byte ir_repeat; // 42 byte repeat_pause; // 43 - byte data[220]; // 44 + byte data[1024]; // 44 } IRDATA_LARGE; typedef struct { @@ -214,6 +258,7 @@ byte data[250]; // 5 } RS232_RECEIVE; + #ifndef AVR typedef struct { @@ -262,11 +307,18 @@ #define COMMAND_FLASH_CRC 210 #define COMMAND_FLASH_IR 211 #define COMMAND_SEND_ACK 212 +#define COMMAND_SEND_ACK_WAIT 213 +#define COMMAND_SEND_ACK2 214 +#define COMMAND_SEND_ACK_BUSY 215 + +#define COMMAND_LAN_ANALOG 'a' #define COMMAND_LAN_SENDSTRING 's' #define COMMAND_LAN_PING 'p' #define COMMAND_LAN_SENDCCF 'c' -#define COMMAND_LAN_GETINFO 'g' +#define COMMAND_LAN_GETINFO 'g' +#define COMMAND_LAN_LEARN 'l' +#define COMMAND_LAN_VERSION 'v' @@ -322,7 +374,6 @@ #define ADR_TIMER (ADR_SYSPARM+LEN_SYSPARM) #define LEN_TIMER sizeof (TIMER_ENTRY_GET) // LEN = 117 -#define MAX_1WIRE_ID 16 #define WIFI_UPDATE_INTERFACE 255 #define WIFI_UPDATE_CRC 254 @@ -389,6 +440,20 @@ } IRCOMMAND_BUF; typedef struct { + uint8_t len; // 0 + uint8_t checksumme; // 1 + uint8_t command; // 2 + uint8_t ledselect; // 3 + uint16_t mask; // 4 + uint8_t ledmaskflag; // 6 + uint8_t remote_len; // 7 + uint8_t pause_len; // 8 + + uint8_t rem_cmd[208]; // 9 +} IRCOMMAND_BUF_COMPACT; + + +typedef struct { uint8_t len; uint8_t checksumme; uint8_t command; @@ -453,7 +518,7 @@ uint16_t timeout; uint32_t sendmask[SENDMASK_LEN]; IRDATA ir_data; - byte buffer[256]; + byte buffer[1024]; } IRDATA_LAN_LARGE; typedef struct { @@ -566,18 +631,18 @@ } UDP_FORMAT_STORE; typedef struct { - uint8_t len; - uint8_t dhcp_flag; - uint8_t fallback_flag; - uint8_t mac_adr[6]; - uint32_t ip_adr; - uint32_t ip_netmask; - uint32_t ip_gateway; - uint8_t eeprom_device_mode; - uint8_t eeprom_extended_mode; - uint8_t eeprom_extended_mode2; - uint8_t eeprom_extended_mode_ex[8]; -} LAN_PARAMETER; + uint8_t len; // 0 + uint8_t dhcp_flag; // 1 + uint8_t fallback_flag; // 2 + uint8_t mac_adr[6]; // 3 + uint32_t ip_adr; // 9 + uint32_t ip_netmask; // 13 + uint32_t ip_gateway; // 17 + uint8_t eeprom_device_mode; // 21 + uint8_t eeprom_extended_mode; // 22 + uint8_t eeprom_extended_mode2; // 23 + uint8_t eeprom_extended_mode_ex[8]; // 24 +} LAN_PARAMETER; // 32 typedef struct { uint8_t len; @@ -760,36 +825,35 @@ uint8_t value[8]; } ANALOG_INPUTS; -typedef struct { - uint8_t len; - uint8_t mode[MAX_1WIRE_ID]; - uint8_t id[MAX_1WIRE_ID][8]; -} ANALOG_INFO; - -typedef struct { - uint8_t len; - uint8_t mode[8]; - uint8_t dummy; - int16_t value[8]; -} ANALOG_HIRES_INPUTS; - - typedef union { - ANALOG_INPUTS a_input; - ANALOG_HIRES_INPUTS a_hires; - ANALOG_INFO a_info; + int16_t signed_val; + uint16_t unsigned_val; + uint8_t id[8]; } ANALOG_DATA; typedef struct { uint8_t netcommand; - ANALOG_DATA ad; -} GET_ANALOG_DATA; + ANALOG_INPUTS ai; +} GET_ANALOG_INPUTS; +typedef struct { + uint8_t len; + uint8_t mode[MAX_1WIRE_ID]; + ANALOG_DATA data[MAX_1WIRE_ID]; +} ANALOG_INPUTS_EX; typedef struct { uint8_t netcommand; - ANALOG_INPUTS ai; -} GET_ANALOG_INPUTS; + ANALOG_INPUTS_EX ai; +} GET_ANALOG_INPUTS_EX; + +typedef struct { + uint32_t clientid; + int16_t statuslen; + int16_t statustype; + ANALOG_INPUTS_EX inputs; +} ANALOGBUFFER_WIFI; + #define DEVMODE_WIFI 5 @@ -889,12 +953,12 @@ // EX[5] #define SBUS_SEND_MODE 1 #define USB_WAKEUP 2 -#define LONG_DEBOUNCE 4 +#define LONG_DEBOUNCE 4 // Frei !!! #define STATE_INPUT_IRIN_MASK 56 #define STATE_INPUT_IRIN 8 #define STATE_IRIN_PULLUP 16 #define STATE_IRIN_INVERT 24 -#define STATE_IRIN_INV_PULL 32 +#define STATE_IRIN_ANALOG 32 #define INTERNAL_LED_STATE 64 #define EXTERNAL_LED_STATE 128 @@ -922,6 +986,7 @@ #define EMULATE_ALL_EXTERNAL 8 #define RS232_EXTBAUDRATE 16 #define LEARN_LONG_IRCODE 32 +#define ONE_WIRE_MASK 192 #define AUX_PARAMETER_SET 1 #define AUX_BAUDRATE_MASK 24 @@ -1016,6 +1081,19 @@ #define SBUS_UART 128 // Set: SBUS läuft über UART #define DEVMODE_RAWFAST 64 +#define RCV_56 1 +#define RCV_38 2 +#define RCV_455 4 +#define RCV_455_PLASMA 5 +#define RCV_CARRIER 6 +#define RCV_EXTERNAL 8 + +#define RCV_MODE_56 0 +#define RCV_MODE_38 1 +#define RCV_MODE_455 2 +#define RCV_MODE_CARRIER 3 +#define RCV_MODE_EXTERNAL 4 + #define LONG_CODE_FLAG 128 @@ -1082,6 +1160,7 @@ #define HOST_RESEND 7 #define HOST_SEND_LEDMASK 8 #define HOST_RESEND_LEDMASK 9 +#define HOST_SEND_MACRO 10 #define LAN_REPEAT 32 #define PUT_SERIAL_DATA 33 @@ -1156,6 +1235,11 @@ #define TC_ACTIVE 32 #define TC_DUTY_CYCLE_2 1 #define TC_DUTY_CYCLE_4 2 +#define TC_DUTY_CYCLE_6 3 +#define TC_SEND_POWER_LOW 4 +#define TC_SEND_POWER_MED 8 +#define TC_SEND_POWER_HI 12 +#define TC_SEND_POWER_MASK 12 #define OFFSET_TYP_TOGGLE 1 #define OFFSET_TYP_STATE_0 2 @@ -1216,6 +1300,7 @@ #define EXT_LED_SELECT_14 56 #define EXT_LED_SELECT_15 60 #define EXT_LED_SELECT_16 64 +#define EXT_LED_SELECT_17 68 #define EXT_LED_SELECT_MASK 124 #define EXT_LED_SELECT_HI EXT_LED_SELECT_9 @@ -1226,16 +1311,6 @@ -typedef struct { - byte sbus_len; - byte sbus_checksumme; - byte sbus_command; - byte sbus_address; - byte mode; - word target_mask; - byte hotcode_len; - byte hotcode[CODE_LENRAW]; -} MODE_BUFFER; typedef struct { byte sbus_len; @@ -1268,6 +1343,7 @@ byte ip_gateway[4]; } IP_PARAM; + typedef struct { byte sbus_len; byte sbus_checksumme; @@ -1276,13 +1352,27 @@ byte mode; word target_mask; byte hotcode_len; - byte extmode1; - byte extmode2; - byte extmode_ex0; - byte extmode_ex1; - char remote[81]; - char command[21]; -} MODE_BUFFER_LAN; + byte hotcode[CODE_LENRAW]; +} MODE_BUFFER; + +typedef struct { + byte sbus_len; // 0 + byte sbus_checksumme; // 1 + byte sbus_command; // 2 + byte sbus_address; // 3 + byte device_mode; // 4 + word target_mask; // 5 + byte hotcode_len; // 7 + byte extended_mode; // 8 + byte extended_mode2; // 9 + byte extended_mode_ex[8]; // 10 + byte device_mask; // 18 + byte extended_mask; // 19 + byte extended_mask2; // 20 + byte extended_mask_ex[8]; // 21 + char remote[81]; // 29 + char command[21]; //110 +} MODE_BUFFER_LAN; //131 typedef struct { byte device_mode; // 0 @@ -1310,44 +1400,44 @@ } STATUS_MEMORY; typedef struct { - byte sbus_len; - byte sbus_checksumme; - byte sbus_command; - byte sbus_address; - byte device_mode; - word send_mask; - byte extended_mode; - byte extended_mode2; - byte extended_mode_ex[8]; - byte version[10]; - uint32_t capabilities; - uint32_t capabilities2; - uint32_t capabilities3; - uint32_t capabilities4; - byte wake_mac[6]; - char remote[81]; - char command[21]; -} STATUS_LINE_EX; + byte sbus_len; // 0 + byte sbus_checksumme; // 1 + byte sbus_command; // 2 + byte sbus_address; // 3 + byte device_mode; // 4 + word send_mask; // 5 + byte extended_mode; // 7 + byte extended_mode2; // 8 + byte extended_mode_ex[8]; // 9 + byte version[10]; // 17 + uint32_t capabilities; // 27 + uint32_t capabilities2; // 31 + uint32_t capabilities3; // 35 + uint32_t capabilities4; // 39 + byte wake_mac[6]; // 43 + char remote[81]; // 49 + char command[21]; // 130 +} STATUS_LINE_EX; // 151 typedef struct { - byte sbus_len; - byte sbus_checksumme; - byte sbus_command; - byte sbus_address; - byte device_mode; - word send_mask; - byte version[10]; - byte extended_mode; - uint32_t capabilities; - byte extended_mode2; - byte extended_mode_ex[2]; - byte wake_mac[6]; - char remote[81]; - char command[21]; -} STATUS_LINE_EX_1; + byte sbus_len; // 0 + byte sbus_checksumme; // 1 + byte sbus_command; // 2 + byte sbus_address; // 3 + byte device_mode; // 4 + word send_mask; // 5 + byte version[10]; // 7 + byte extended_mode; // 17 + uint32_t capabilities; // 21 + byte extended_mode2; // 25 + byte extended_mode_ex[2]; // 26 + byte wake_mac[6]; // 28 + char remote[81]; // 34 + char command[21]; //115 +} STATUS_LINE_EX_1; //136 typedef struct { - byte sbus_len; + byte sbus_len; byte sbus_checksumme; byte sbus_command; byte sbus_address; @@ -1447,8 +1537,8 @@ word send_mask; // 5 byte version[10]; // 7 byte extended_mode; // 17 - uint32_t capabilities; // 18 -} STATUS_LINE_3; // 22 + word capabilities; // 18 +} STATUS_LINE_3; // 20 typedef struct { byte sbus_len; // 0 diff -Nru irserver-6.02.40/server.c irserver-6.03.08/server.c --- irserver-6.02.40/server.c 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/server.c 2010-12-12 18:34:40.000000000 +0000 @@ -142,7 +142,7 @@ int OpenIRTransBroadcastSockets (void); void GetBusList (REMOTEBUFFER *buf,int offset); void SendUDPAck (char stat[],struct sockaddr_in *target,int port); -void DoExecuteASCIICommand (byte command[],SOCKET sockfd,int client); +void DoExecuteASCIICommand (byte command[],SOCKET sockfd,int client,int asciimode); void processArgs (int argc,char *argv[]); void SetLearnstatus (int client); @@ -152,7 +152,7 @@ int build_event_table (HANDLE events[],byte event_type[],byte event_num[],OVERLAPPED OvCom[],int *ser_event); int get_selected_event (int eventnum,HANDLE events[],byte event_type[],byte event_num[],SOCKET *sockfd); -int AnalyzeUDPString (char *st,int *netcom,char *remote,char *command,char *ccf,int *netmask,int *bus,int *led,int *port); +int AnalyzeUDPString (char *st,int *netcom,char *remote,char *command,char *ccf,int *netmask,int *bus,int *led,int *port,int *macro_wait); void IRTControlHandler (DWORD request); void IRTransService(int argc, char** argv); @@ -697,9 +697,78 @@ // 6.02.36 Overlapped Handling für Serio geändert MM 07.12.09 // 6.02.37 Neuer Getversion Modus MM 27.12.09 // 6.02.40 IRTrans WiFi Support MM 14.01.10 - -#define VERSION "6.02.40" - +// 6.02.41 WLAN Parameter per WLAN setzen MM 21.01.10 +// 6.02.42 COMMAND_LOGLEVEL MM 24.01.10 +// 6.02.43 WLAN Parameter per WLAN setzen (LINUX) MM 05.02.10 +// 6.02.44 ACK Handshake LAN Devices MM 15.02.10 +// 6.02.45 SizeOf LIRC Domain Socket MM 18.02.10 +// 6.02.46 TCP COM für LAN Devices MM 22.02.10 +// 6.02.50 TCP Reconnect für LAN Devices MM 23.02.10 +// 6.02.51 SO_KEEPALIVE für LAN Devices MM 25.02.10 +// 6.02.52 Active Keep Alive für LAN Devices MM 09.03.10 +// 6.02.53 dummy Device MM 20.03.10 +// 6.02.54 LINK Commands in .rem Files MM 20.03.10 +// 6.02.55 Receive linked Commands in .rem Files MM 21.03.10 +// 6.02.56 New Link via GUI MM 28.03.10 +// 6.02.57 Send Mask für USB Geräte MM 07.04.10 +// 6.02.58 Send Macro für LAN Geräte MM 24.04.10 +// 6.02.59 Fix für LEARN LONG ohne Parameter MM 04.05.10 +// 6.02.60 UDP Send fixed MM 22.05.10 +// 6.02.61 TCP ASCII Send LED Select MM 22.05.10 +// 6.02.62 TCP ASCII Send Error bei ACK Fehler MM 26.05.10 +// 6.02.63 TCP ASCII Agetdevices MM 27.05.10 +// 6.02.64 RS232 I/O für LAN I/O / XL MM 08.06.10 +// 6.02.65 TCP ASCII Command Asndmask MM 11.06.10 +// 6.02.66 OneWire + Analog I/O MM 15.06.10 +// 6.02.67 GetStatus ohne SBUS via TCP MM 15.06.10 +// 6.02.68 Fix für Send Macro commands MM 25.06.10 +// 6.02.69 UDP ASCII Sendmacro MM 28.06.10 +// 6.02.70 Statusport = source MM 30.06.10 +// 6.02.71 IPs für Geräte, die mit "0" beginnen (Oktal) MM 09.07.10 +// 6.02.72 Busauswahl für WLAN und IP Modes MM 10.07.10 +// 6.02.73 SendMask für Multistream fixed MM 24.07.10 +// 6.02.74 SendMask für Multistream fixed MM 24.07.10 +// 6.02.75 Devicestatus Multistream TCP MM 26.07.10 +// 6.02.76 Send Macro mit unterschiedlichen Pausen MM 28.07.10 +// 6.02.78 Deviceliste beim Serverstart neu formatiert MM 01.08.10 +// 6.02.79 Get Status für FW 3.03.00 MM 04.08.10 +// 6.02.80 TCP ASCII Sendmacro MM 04.08.10 +// 6.02.81 Send Power über .rem File MM 09.08.10 +// 6.02.82 Hex Zeichen in R232 Strings über \x.. MM 11.08.10 +// 6.02.83 Send ASCII Mode mit Framelength MM 26.08.10 +// 6.02.84 CCF Hexcodes NEC Mode MM 27.08.10 +// 6.02.85 Duty Cycle 1:6 in .rem File MM 14.09.10 +// 6.02.86 Access control for IP without Mask MM 24.09.10 +// 6.02.87 OneWire Temp mit Resolution MM 28.09.10 +// 6.02.88 MODE_NO_RECEIVE für GUI Client MM 23.10.10 +// 6.03.01 Find IR Devices mit allen Extended Modes MM 28.10.10 +// 6.03.02 Send Flash Status bei MODE_NO_RECEIVE MM 28.10.10 +// 6.03.03 [RL][RP] fixed MM 09.11.10 +// 6.03.04 Repeat IR Codes über [RL] auch mit Repeat Codes MM 09.11.10 +// 6.03.05 Fix für lange RCV Pakete MM 09.11.10 +// 6.03.06 Minor CCF Fix MM 09.11.10 +// 6.03.07 Fix bei fehlendem Mode NO_RCV (else fehlte) MM 14.11.10 +// 6.03.08 Fix für linked Commands in IRDB MM 05.11.10 + +#define VERSION "6.03.08" + + +// Autofind LAN Devices +// Sortierung LAN Devices nach MAC Adresse +// irclient upload IRDB Multistream OK +// IR Code Wiederholung mit Repeat Code OK +// [RC][RP]: Pause über IR Code Length kalibrieren +// [RC][RP]: Wahlweise [FL] +// CCF Code Eingeben (GUI Client): 0000 006D 0022 0002 0155 ... OK + + +// Links / Alternate names für .rem Dateien incl. IRDB +// Anzeige von Capabilities im GUI Client +// Auswahl B&O Codes in den Devicesettings LAN ausgegraut !!! +// remotes Ordner unter Windows in Application Data verschieben +// TCP ASCII / UDP ASCII: +// - Analog mit Optionen +// - RS232 mit Optionen // RS232 Erweiterung: // Translator State I/O über Checksumme / RS232 über Command OK @@ -932,6 +1001,14 @@ mode_flag |= NO_LIRC; continue; } + if (!strcmp (argv[1],"-tcp")) { + mode_flag |= ETHERNET_TCP; + continue; + } + if (!strcmp (argv[1],"-tcp_reconnect")) { + mode_flag |= ETHERNET_TCP | TCP_RECONNECT; + continue; + } if (!strcmp (argv[1],"-debug_code")) { mode_flag |= DEBUG_CODE; continue; @@ -1074,7 +1151,7 @@ for (i=0;i < res;i++) adr |= 1 << (31-i); netmask[netcount++] = adr; } - + else netmask[netcount++] = 0xffffffff; } continue; } @@ -1294,6 +1371,13 @@ } #endif +#if defined (WIN64) || defined (X64) + sprintf (msg,"IRServer64 Version %s\n",VERSION); +#else + sprintf (msg,"IRServer Version %s\n",VERSION); +#endif + log_print (msg,LOG_FATAL); + strcpy (init_message,msg); log_print ("Init Events done\n",LOG_DEBUG); // InitInput (); @@ -1303,7 +1387,7 @@ res = InitCommunicationEx (dev); log_print ("Init communication ...\n",LOG_DEBUG); if (res && device_wait) msSleep (2000); - } while ((res || !device_cnt) && device_wait && time (0) < ti); + } while ((res || !device_cnt) && device_wait && time (0) < ti && strcmp (dev,"dummy")); if (res) return (res); @@ -1338,13 +1422,6 @@ } #endif -#if defined (WIN64) || defined (X64) - sprintf (msg,"IRServer64 Version %s\n",VERSION); -#else - sprintf (msg,"IRServer Version %s\n",VERSION); -#endif - log_print (msg,LOG_FATAL); - strcpy (init_message,msg); if (!device_cnt && strcmp (dev,"dummy")) { sprintf (msg,"No IRTrans Devices found.\nAborting ...\n\n"); @@ -1352,7 +1429,9 @@ exit (-1); } for (i=0;i < device_cnt;i++) { - if (IRDevices[i].io.if_type == IF_LAN) sprintf (msg,"[%2d]: %-10s: IR VER: %-8s ETH VER: %-8s SN: %u\n MAC:%02x-%02x-%02x-%02x-%02x-%02x IP Addr: %s\n",i, + msg2[0] = 0; + if (IRDevices[i].io.socket != 0) strcpy (msg2,"[TCP]"); + if (IRDevices[i].io.if_type == IF_LAN) sprintf (msg,"[%2d]: %-10s: IR VER: %-8s ETH VER: %-8s SN: %u\n MAC:%02x-%02x-%02x-%02x-%02x-%02x IP Addr: %s %s\n",i, IRDevices[i].name,IRDevices[i].version,IRDevices[i].lan_version,IRDevices[i].fw_serno, IRDevices[i].mac_adr[0], IRDevices[i].mac_adr[1], @@ -1360,7 +1439,7 @@ IRDevices[i].mac_adr[3], IRDevices[i].mac_adr[4], IRDevices[i].mac_adr[5], - inet_ntoa (IRDevices[i].io.IPAddr[0].sin_addr)); + inet_ntoa (IRDevices[i].io.IPAddr[0].sin_addr),msg2); else if (IRDevices[i].fw_serno) sprintf (msg,"[%2d]: %-20s %-12s SN: %u\n",i,IRDevices[i].name,IRDevices[i].version,IRDevices[i].fw_serno); else sprintf (msg,"[%2d]: %-20s %-12s\n",i,IRDevices[i].name,IRDevices[i].version); if (IRDevices[i].io.if_type == IF_USB && !strcmp (IRDevices[i].name,"IRTrans WiFi")) { @@ -1539,8 +1618,15 @@ sprintf (ln,"Framelength: %d us / %d ms\n",framelen,framelen/1000); log_print (ln,LOG_FATAL); } + + framelen = CalcFramelength (ird); + sprintf (ln,"Total Code Len: %d ms\n",framelen); + log_print (ln,LOG_FATAL); } +#define LAN_TCP_IDLE 1800 + + int RunServer () { char err[300]; @@ -1605,7 +1691,7 @@ #ifdef WIN32 waittime = INFINITE; - for (i=0;i < device_cnt;i++) if ((!(mode_flag & NO_RECONNECT) && IRDevices[i].io.if_type == IF_USB) || mode_flag & XAP || (mode_flag & DAEMON_MODE)) waittime = 120000; + for (i=0;i < device_cnt;i++) if ((!(mode_flag & NO_RECONNECT) && IRDevices[i].io.if_type == IF_USB) || mode_flag & XAP || (mode_flag & DAEMON_MODE) || (IRDevices[i].io.if_type == IF_LAN && IRDevices[i].io.socket != 0)) waittime = 120000; if (!(mode_flag & DAEMON_MODE)) ServiceStatusIRT.dwCurrentState = SERVICE_RUNNING; @@ -1631,15 +1717,32 @@ if ((time (0) - xAP_last_hbeat) > XAP_HBEAT) xAP_SendHeartbeat (); - if (wait == WAIT_TIMEOUT) { + if (wait == WAIT_FAILED) { + sprintf (rdcom,"WAIT ERROR: %x\n",GetLastError ()); + log_print (rdcom,LOG_ERROR); + msSleep (500); + } + else if (wait == WAIT_TIMEOUT) { dummy = 1; - for (i=0;i < device_cnt;i++) if (IRDevices[i].io.if_type == IF_USB) WriteUSBStringEx (IRDevices + i,&dummy,1); + for (i=0;i < device_cnt;i++) { + if (IRDevices[i].io.if_type == IF_USB) WriteUSBStringEx (IRDevices + i,&dummy,1); + if (IRDevices[i].io.if_type == IF_LAN && IRDevices[i].io.socket != 0 && (time (0) - IRDevices[i].io.last_time) > LAN_TCP_IDLE) { + IRDATA ird; + memset (&ird,0,sizeof (IRDATA)); + IRTransLanSend (IRDevices + i,&ird); + } + } } else { evnt = get_selected_event (wait,events,event_type,event_num,&sockfd); switch (evnt) { case SELECT_TRANS: cnt = ReadInstantReceive (&IRDevices[event_num[wait]],rdcom,1000); + /* + printf ("CNT: %d\n",cnt); + for (i=0;i < cnt;i++) { + printf ("%d %x %c\n",i,rdcom[i],rdcom[i]); + }*/ /* showDebugTiming ((IRDATA *)rdcom); @@ -1692,12 +1795,14 @@ break; } case SELECT_IRTLAN: + case SELECT_LAN_TCP: ir = (IRDATA_LAN_SHORT *)rcvdata; i = sizeof (send_adr); - res = recvfrom(irtlan_socket,rcvdata,1024,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + if (evnt == SELECT_LAN_TCP) res = recvfrom(sockfd,rcvdata,1024,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); + else res = recvfrom(irtlan_socket,rcvdata,1024,MSG_NOSIGNAL,(struct sockaddr *)&send_adr,&i); if (res > 3 && (ir->netcommand == 's' || ir->netcommand == 'S' || ir->netcommand == 'l' || ir->netcommand == 'L' || ir->netcommand == 'p' || ir->netcommand == 'P')) { - process_udp_command ((char *)rdcom,res,&send_adr); + process_udp_command ((char *)rcvdata,res,&send_adr); break; } @@ -1707,6 +1812,7 @@ if (ir->netcommand != RESULT_RCV_RS232 && ir->ir_data.command != SBUS_REPEAT) break; for (i=0;i < device_cnt;i++) if (IRDevices[i].io.if_type == IF_LAN && IRDevices[i].io.IPAddr[0].sin_addr.s_addr == send_adr.sin_addr.s_addr) { + if (IRDevices[i].io.socket && evnt != SELECT_LAN_TCP) break; bus = i; goto ip_found; } @@ -1952,6 +2058,11 @@ event_num[num] = i; events[num++] = IRDevices[i].io.event; } + else if (IRDevices[i].io.socket) { // LAN Device mit TCP + event_type[num] = SELECT_LAN_TCP; + event_num[num] = i; + events[num++] = IRDevices[i].io.event; + } if (comioflag && IRDevices[i].virtual_comport != INVALID_HANDLE_VALUE) { memset (&OvCom[i + MAX_IR_DEVICES],0,sizeof (OVERLAPPED)); OvCom[i + MAX_IR_DEVICES].hEvent = IRDevices[i].com_event; @@ -2017,7 +2128,7 @@ else if (event_type[eventnum] == SELECT_WEB) *sockfd = web_socket; else if (event_type[eventnum] == SELECT_XAP) *sockfd = xAP_rcv; else if (event_type[eventnum] == SELECT_IRTLAN) *sockfd = irtlan_socket; - + else if (event_type[eventnum] == SELECT_LAN_TCP) *sockfd = IRDevices[event_num[eventnum]].io.socket; fds = event_type[eventnum]; @@ -2209,6 +2320,10 @@ asciimode = MODE_ASCII; clientid = 0; } + if (!memcmp ((char *)&clientid,"ASCT",4)) { + asciimode = MODE_ASCII_TIME; + clientid = 0; + } swap_int (&clientid); res = 0; if (clientid > 1) { @@ -2250,7 +2365,7 @@ if (mode == SELECT_LIRC) sprintf (rdcom,"LIRC TCP/IP Client %d accepted from %s\n",res,inet_ntoa (cli_addr.sin_addr)); if (mode == SELECT_LOCAL) sprintf (rdcom,"Local Client %d accepted on %d\n",res,call); if (mode == SELECT_SERVER) { - if (asciimode == MODE_ASCII) sprintf (rdcom,"IRTRANS TCP/IP Client %d [ASCII Mode] accepted from %s\n",res,inet_ntoa (cli_addr.sin_addr)); + if (asciimode >= MODE_ASCII) sprintf (rdcom,"IRTRANS TCP/IP Client %d [ASCII Mode] accepted from %s\n",res,inet_ntoa (cli_addr.sin_addr)); else sprintf (rdcom,"IRTRANS TCP/IP Client %d accepted from %s\n",res,inet_ntoa (cli_addr.sin_addr)); } if (mode == SELECT_REOPEN) sprintf (rdcom,"IRTRANS [R] TCP/IP Client %d accepted from %s\n",res,inet_ntoa (cli_addr.sin_addr)); @@ -2367,7 +2482,7 @@ lirc_send_error (fd,msg,err); continue; } - SendIR (num,0x40000000,COMMAND_SEND); + SendIR (num,0x40000000,COMMAND_SEND,NULL); } resend_flag = 0; lirc_send_success (fd,msg); @@ -2453,7 +2568,7 @@ sprintf (err,"LIRC LIST COMMAND DETAIL %s-%s received.\n",remote,command); log_print (err,LOG_DEBUG); - j = DBFindCommand (command,i); + j = DBFindCommand (command,&i); if (j == -1) { sprintf (st,"No Remote/Command %s/%s found",rem,key); lirc_send_error (fd,msg,st); @@ -2546,7 +2661,7 @@ for (i=0;i < CLIENT_COUNT;i++) if (i != client) { if (sockinfo[i].type == SELECT_SERVER || sockinfo[i].type == SELECT_REOPEN) { - if (sockinfo[i].mode == MODE_ASCII) { + if (sockinfo[i].mode >= MODE_ASCII) { sprintf (msg,"**00000 RCV_COM %s,%s,%d,%d\n",rem,name,0,0); sprintf (msg+2,"%05d",strlen (msg)); msg[7] = ' '; @@ -2632,7 +2747,12 @@ if (res <= 0) CloseIRSocket (i); } if (sockinfo[i].type == SELECT_SERVER || sockinfo[i].type == SELECT_REOPEN) { - if (sockinfo[i].mode == MODE_ASCII) { + res = 1; + if (sockinfo[i].mode == MODE_NO_RECEIVE && nr.data[0] == 'F') { + res = send (sockinfo[i].fd,(char *)&nr,sizeof (NETWORKRECV),MSG_NOSIGNAL); + if (res <= 0) CloseIRSocket (i); + } + else if (sockinfo[i].mode >= MODE_ASCII) { sprintf (msg,"**00000 RCV_COM %s,%s,%d,%d\n",rem,name,bus,*command & 15); sprintf (msg+2,"%05d",strlen (msg)); msg[7] = ' '; @@ -2681,7 +2801,12 @@ i = 0; while (i < CLIENT_COUNT) { if (sockinfo[i].type == SELECT_SERVER || sockinfo[i].type == SELECT_REOPEN) { - if (sockinfo[i].mode == MODE_ASCII) { + res = 1; + if (sockinfo[i].mode == MODE_NO_RECEIVE && nr.data[0] == 'F') { + res = send (sockinfo[i].fd,(char *)&nr,sizeof (NETWORKRECV),MSG_NOSIGNAL); + if (res <= 0) CloseIRSocket (i); + } + else if (sockinfo[i].mode >= MODE_ASCII) { sprintf (msg,"**00000 RCV_COD %s,%d,%d\n",command+1,bus,*command & 15); sprintf (msg+2,"%05d",strlen (msg)); msg[7] = ' '; @@ -2813,6 +2938,8 @@ pclose (fd); + res = DBReferenceLinks (); + DBShowStatus (); ReadAppConfig (); @@ -2903,6 +3030,8 @@ close (fd); + res = DBReferenceLinks (); + DBShowStatus (); ReadAppConfig (); @@ -2972,6 +3101,7 @@ _findclose( hFile ); } + res = DBReferenceLinks (); DBShowStatus (); ReadAppConfig (); @@ -3028,7 +3158,8 @@ else { res = recv (sockfd,buffer,1,MSG_NOSIGNAL); - if (res != 1 || *buffer < 1 || *buffer > COMMAND_LANPARAM) { + + if (res != 1 || *buffer < 1 || *buffer > COMMAND_NORECEIVE) { if (res < 0) { #ifdef WIN32 if (WSAGetLastError () == WSAEWOULDBLOCK) return; @@ -3036,6 +3167,7 @@ if (errno == EAGAIN) return; #endif } + if (res <= 0) CloseIRSocket (client); if (res == 0) { sprintf (err,"Client [%d] disconnect\n",client); @@ -3049,12 +3181,21 @@ return; } + if (sockinfo[client].mode >= MODE_ASCII) { + while (res == 1 && (*buffer == 13 || *buffer == 10)) res = recv (sockfd,buffer,1,MSG_NOSIGNAL); + if (res <= 0) return; + } + if (*buffer == COMMAND_ASCII) { len = 1; res = recv (sockfd,&c,1,MSG_NOSIGNAL); while (res == 1 && c != '\n') { buffer[len++] = c; res = recv (sockfd,&c,1,MSG_NOSIGNAL); + if (res != 1) { + msSleep (1); + res = recv (sockfd,&c,1,MSG_NOSIGNAL); + } } if (c == '\n') buffer[len++] = c; buffer[len] = 0; @@ -3072,7 +3213,7 @@ sprintf (err,"ASCII Command: %s\n",buffer+1); log_print (err,LOG_INFO); - DoExecuteASCIICommand ((byte *)buffer+1,sockfd,client); + DoExecuteASCIICommand ((byte *)buffer+1,sockfd,client,sockinfo[client].mode); return; } @@ -3088,9 +3229,10 @@ if (*buffer == COMMAND_SETSTATEX) sz = sizeof (MODUSCOMMAND) - 1; if (*buffer == COMMAND_SETSTATEX2) sz = sizeof (MODUSCOMMAND_EX) - 1; if (*buffer == COMMAND_STORETIMER) sz = sizeof (TIMERCOMMAND) - 1; - if (*buffer == COMMAND_LEARNCCF || *buffer == COMMAND_LEARNRS232) sz = sizeof (CCFLEARNCOMMAND) - 1; + if (*buffer == COMMAND_LEARNCCF || *buffer == COMMAND_LEARNRS232 || *buffer == COMMAND_LEARNLINK) sz = sizeof (CCFLEARNCOMMAND) - 1; if (*buffer == COMMAND_STOREWLAN) sz = sizeof (WLANCONFIGCOMMAND) - 1; if (*buffer == COMMAND_WRITE_SYSPARAM) sz = sizeof (SYSPARAMCOMMAND) - 1; + if (*buffer == COMMAND_SENDMACRO) sz = sizeof (MACRO_NETCOMMAND) - 1; res = recv (sockfd,buffer + 1,sz,MSG_NOSIGNAL); sprintf (err,"Netcommand Size: %d/%d\n",sz,res); @@ -3115,14 +3257,19 @@ } protocol_version = com->protocol_version; - if (res != sz) { - if (res <= 0) CloseIRSocket (client); - if (res) { + while (res != sz) { + msSleep (50); + len = recv (sockfd,buffer + 1 + res,sz - res,MSG_NOSIGNAL); + if (len <= 0) { + CloseIRSocket (client); +/* if (res) { memcpy (sockinfo[client].restdata,buffer,res + 1); sockinfo[client].restlen = res; sockinfo[client].restread = sz; + }*/ + return; } - return; + res += len; } SwapNetworkcommand (com); @@ -3173,6 +3320,7 @@ NETWORKLEARNSTAT *lstat; FUNCTIONBUFFER *fb; ANALOGBUFFER *ab; + ANALOGBUFFER_EX *abex; FUNCTIONBUFFEREX *fbex; NETWORKLCDSTAT *lcdb; IRDBCOMMAND *db; @@ -3183,6 +3331,7 @@ MODUSCOMMAND_EX *mcom; WLANCONFIGCOMMAND *wcom; SYSPARAMCOMMAND *sysparm; + MACRO_NETCOMMAND *macro; unsigned int end_time; static byte suspend; @@ -3196,6 +3345,9 @@ switch (com->netcommand) { + case COMMAND_NORECEIVE: + sockinfo[client].mode = MODE_NO_RECEIVE; + break; case COMMAND_EMPTY: break; case COMMAND_CLIENTLOG: @@ -3320,7 +3472,9 @@ } break; case COMMAND_FLASHIRDB: - res = SetIRDBEx ((byte)((com->adress) >> 8),(com->adress & 0xf),stat); + sprintf (st,"Flash IRDB ADR %x\n",com->adress); + log_print (st,LOG_DEBUG); + res = SetIRDBEx ((byte)((com->adress) >> 8),(com->adress & 0xff),stat); if (res) PutNetworkStatus (res,NULL,stat); break; case COMMAND_SAVETRANS: @@ -3350,7 +3504,7 @@ if (res) PutNetworkStatus (res,NULL,stat); break; case COMMAND_FLASHTRANS: - res = SetFlashdataEx ((byte)((com->adress) >> 8),(com->adress & 0xf)); + res = SetFlashdataEx ((byte)((com->adress) >> 8),(com->adress & 0xff)); if (res) { PutNetworkStatus (res,NULL,stat); ns = (NETWORKSTATUS *)stat; @@ -3362,8 +3516,7 @@ case COMMAND_WRITE_SYSPARAM: sysparm = (SYSPARAMCOMMAND *)com; - if (protocol_version >= 210) bus = (com->adress >> 19) & (MAX_IR_DEVICES - 1); - else bus = (com->adress >> 20) & (MAX_IR_DEVICES - 1); + bus = ((com->adress) >> 8) & 0xff; res = WriteSysparameter (bus,&sysparm->sysparm); if (res) PutNetworkStatus (res,NULL,stat); @@ -3372,9 +3525,8 @@ case COMMAND_STOREWLAN: wcom = (WLANCONFIGCOMMAND *)com; - if (protocol_version >= 210) bus = (com->adress >> 19) & (MAX_IR_DEVICES - 1); - else bus = (com->adress >> 20) & (MAX_IR_DEVICES - 1); - + bus = ((com->adress) >> 8) & 0xff; + res = SetWLANConfig (bus,&wcom->wlan); if (res) PutNetworkStatus (res,NULL,stat); break; @@ -3398,6 +3550,17 @@ ab->statuslen = sizeof (ANALOGBUFFER); ReadAnalogInputs (bus,com->trasmit_freq,&(ab->inputs)); break; + case COMMAND_READ_ANALOG_EX: + abex = (ANALOGBUFFER_EX *)stat; + + if (protocol_version >= 210) bus = (com->adress >> 19) & (MAX_IR_DEVICES - 1); + else bus = (com->adress >> 20) & (MAX_IR_DEVICES - 1); + + memset (abex,0,sizeof (ANALOGBUFFER_EX)); + abex->statustype = STATUS_ANALOGINPUT_EX; + abex->statuslen = sizeof (ANALOGBUFFER_EX); + ReadAnalogInputsEx (bus,com->timeout,com->trasmit_freq,(byte *)com->remote,&(abex->inputs)); + break; case COMMAND_FUNCTIONS: fb = (FUNCTIONBUFFER *)stat; memset (fb,0,sizeof (FUNCTIONBUFFER)); @@ -3622,6 +3785,48 @@ resend_flag = 0; break; + case COMMAND_SENDMACRO: + macro = (MACRO_NETCOMMAND *)com; + { + char lst[20]; + int cmd_array[16]; + word pause_array[16]; + + sprintf (lst,"Mask %x",macro->adress & 0xffff); + + sprintf (st,"Send Macro [%d] %s - %s [%x - B:%d LED: %s Pause: %d]\n",client,macro->remote,macro->command,macro->adress,(macro->adress >> 19) & (MAX_IR_DEVICES - 1),lst,macro->pause); + + log_print (st,LOG_DEBUG); + if (hexfp) { + fprintf (hexfp,"%s-%s\n",macro->remote,macro->command); + hexflag = 1; + } + + macro->adress |= 0x10000; + + for (i=0;i < 16;i++) pause_array[i] = macro->pause; + + res = DBFindRemoteMacro (macro->remote,macro->command,cmd_array,pause_array); + for (i=0;i < 16;i++) if (pause_array[i] > 2500) pause_array[i] = 2500; + + + if (!res) res = SendIRMacro (cmd_array,macro->adress,pause_array,NULL); + if (res) { + ns = (NETWORKSTATUS *)stat; + PutNetworkStatus (res,NULL,stat); + strcpy (err,ns->message); + if (res == ERR_REMOTENOTFOUND) sprintf (ns->message,err,macro->remote); + if (res == ERR_COMMANDNOTFOUND) sprintf (ns->message,err,macro->command); + if (res == ERR_WRONGBUS) { + if (macro->protocol_version >= 210) sprintf (ns->message,err,(macro->adress >> 19) & (MAX_IR_DEVICES - 1)); + else sprintf (ns->message,err,(macro->adress >> 20) & (MAX_IR_DEVICES - 1)); + } + log_print (ns->message,LOG_ERROR); + } + + resend_flag = 0; + break; + } case COMMAND_SEND: case COMMAND_SENDMASK: if (com->protocol_version >= 210) { @@ -3658,7 +3863,7 @@ res = DBFindRemoteCommand (com->remote,com->command,&cmd_num,NULL); if (!res) { if ((mode_flag & SEND_FORWARDALL) || (mode_flag & SEND_FORWARD)) send_forward (client,com->remote,com->command); - res = SendIR (cmd_num,com->adress,com->netcommand); + res = SendIR (cmd_num,com->adress,com->netcommand,NULL); } if (res) { if (mode_flag & SEND_FORWARDALL) send_forward (client,com->remote,com->command); @@ -3831,7 +4036,7 @@ if (!res) resend_flag = 2; if (res == ERR_ISMACRO) { res = DBFindRemoteCommand (com->remote,com->command,&cmd_num,NULL); - if (!res) res = SendIR (cmd_num,com->adress,COMMAND_SEND); + if (!res) res = SendIR (cmd_num,com->adress,COMMAND_SEND,NULL); resend_flag = 0; } @@ -3957,6 +4162,16 @@ else if (sockinfo[client].ird.command == 0xfe) sockinfo[client].learnstatus.learnok |= 4; } break; + case COMMAND_LEARNLINK: + ccfl = (CCFLEARNCOMMAND *)com; + if (sockinfo[client].fp == NULL) { + PutNetworkStatus (ERR_NOFILEOPEN,NULL,stat); + break; + } + + res = ASCIIStoreLink (client,ccfl->command,ccfl->ccf_data); + if (res) PutNetworkStatus (res,NULL,stat); + break; case COMMAND_LEARNRS232: ccfl = (CCFLEARNCOMMAND *)com; if (sockinfo[client].fp == NULL) { @@ -4108,6 +4323,9 @@ if (sockinfo[client].fp) fflush ((sockinfo[client].fp)); ReadIRDatabase (); break; + case COMMAND_LOGLEVEL: + mode_flag = (mode_flag & ~LOG_MASK) | (com->adress & LOG_MASK); + break; case COMMAND_LANPARAM: bus = (byte)com->adress; @@ -4296,12 +4514,16 @@ #endif break; case COMMAND_GETREMOTES: + sprintf (err,"Getremotes %d\n",com->adress); + log_print (err,LOG_DEBUG); GetRemoteDatabase ((REMOTEBUFFER *)stat,com->adress); break; case COMMAND_LISTBUS: GetBusList ((REMOTEBUFFER *)stat,com->adress); break; case COMMAND_GETCOMMANDS: + sprintf (err,"Getcommands: %s/%d\n",com->remote,com->adress); + log_print (err,LOG_DEBUG); res = GetCommandDatabase ((COMMANDBUFFER *)stat,com->remote,com->adress); if (res) { ns = (NETWORKSTATUS *)stat; @@ -4891,7 +5113,7 @@ serv_addr_un.sun_family = AF_UNIX; strcpy (serv_addr_un.sun_path,LIRCD); - if (bind (local_socket,(struct sockaddr *)&serv_addr_un,sizeof(serv_addr)) == -1) { + if (bind (local_socket,(struct sockaddr *)&serv_addr_un,sizeof(serv_addr_un)) == -1) { close(local_socket); return (ERR_OPENSOCKET); } @@ -5060,22 +5282,24 @@ void process_udp_command (char *data,int len,struct sockaddr_in *send_adr) { - int res; + int res,i; int cmd_num,adr; char err[256],txt[256]; - char remote[80],command[20],ccf[2048]; - int netcom,netmask,bus,led,port; + char remote[80],command[512],ccf[2048]; + int netcom,netmask,bus,led,port,wait; NETWORKCLIENT client; data[len] = 0; - res = AnalyzeUDPString (data,&netcom,remote,command,ccf,&netmask,&bus,&led,&port); + res = AnalyzeUDPString (data,&netcom,remote,command,ccf,&netmask,&bus,&led,&port,&wait); if (res) { log_print ("Illegal UDP Command\n", LOG_ERROR); return; } - sprintf (txt,"UDP Command: %d %s,%s,%d,%d [%x]\n", netcom,remote,command,bus,led,send_adr->sin_addr.s_addr); + if (port == 0) port = ntohs (send_adr->sin_port); // Port = Sourceport + + sprintf (txt,"UDP Command: %d %s,%s,%d,%d [%x.%d]\n", netcom,remote,command,bus,led,send_adr->sin_addr.s_addr,port); log_print (txt,LOG_DEBUG); adr = 0; @@ -5093,8 +5317,24 @@ else adr |= bus << 19; protocol_version = 210; - if (netcom == 1) { - res = DBFindRemoteCommand (remote,command,&cmd_num,NULL); + if (netcom == COMMAND_SEND || netcom == COMMAND_SENDMASK || netcom == COMMAND_SENDMACRO) { + if (netcom == COMMAND_SENDMACRO) { + int cmd_array[16]; + word pause_array[16]; + + if (!netmask) adr |= 0x10000 | 0xffff; + + for (i=0;i < 16;i++) pause_array[i] = wait; + + res = DBFindRemoteMacro (remote,command,cmd_array,pause_array); + + for (i=0;i < 16;i++) if (pause_array[i] > 2500) pause_array[i] = 2500; + if (!res) res = SendIRMacro (cmd_array,adr,pause_array,NULL); + } + if (netcom == COMMAND_SEND || netcom == COMMAND_SENDMASK) { + res = DBFindRemoteCommand (remote,command,&cmd_num,NULL); + if (!res) SendIR (cmd_num,adr,COMMAND_SEND,NULL); + } if (res) { GetError (res, txt); switch(res) { @@ -5112,8 +5352,8 @@ SendUDPAck ("ERR",send_adr,port); return; } - SendIR (cmd_num,adr,COMMAND_SEND); SendUDPAck ("OK",send_adr,port); + return; } if (netcom == 2) { @@ -5150,13 +5390,11 @@ target->sin_family = AF_INET; target->sin_port = htons ((word)port); - connect (irtlan_outbound,(struct sockaddr *)target,sizeof (struct sockaddr_in)); - - send (irtlan_outbound,stat,(int)strlen (stat),0); + sendto (irtlan_socket,stat,(int)strlen (stat),0,(struct sockaddr *)target,sizeof (struct sockaddr_in)); } -int AnalyzeUDPString (char *st,int *netcom,char *remote,char *command,char *ccf,int *netmask,int *bus,int *led,int *port) +int AnalyzeUDPString (char *st,int *netcom,char *remote,char *command,char *ccf,int *netmask,int *bus,int *led,int *port,int *macro_wait) { int i,p,v; @@ -5165,6 +5403,7 @@ *bus = *led = 0; *netmask = 0; *port = 21000; + *macro_wait = 500; i = 3; @@ -5176,7 +5415,15 @@ i = 6; *netcom = 4; } - else if (!strncmp (st,"snd",3) || !strncmp (st,"Snd",3) || !strncmp (st,"SND",3)) *netcom = 1; + else if (!strncmp (st,"sndmask",7) || !strncmp (st,"Sndmask",7) || !strncmp (st,"SNDMASK",7) || !strncmp (st,"SndMask",7)) { + i = 7; + *netcom = COMMAND_SENDMASK; + } + else if (!strncmp (st,"sndmacro",8) || !strncmp (st,"Sndmacro",8) || !strncmp (st,"SNDMACRO",8) || !strncmp (st,"SndMacro",8)) { + i = 8; + *netcom = COMMAND_SENDMACRO; + } + else if (!strncmp (st,"snd",3) || !strncmp (st,"Snd",3) || !strncmp (st,"SND",3)) *netcom = COMMAND_SEND; else if (!strncmp (st,"lrn",3) || !strncmp (st,"Lrn",3) || !strncmp (st,"LRN",3)) *netcom = 2; else if (!strncmp (st,"ping",4) || !strncmp (st,"Ping",4) || !strncmp (st,"PING",4)) { *netcom = 3; @@ -5215,6 +5462,7 @@ v = st[i]; st[i++] = 0; + if (*netcom == COMMAND_SENDMACRO) strncpy (command,st+p,512); strncpy (command,st+p,20); } @@ -5230,7 +5478,16 @@ if (st[p] == 'i' || st[p] == 'I') *led = 1; else if (st[p] == 'e' || st[p] == 'E') *led = 2; else if (st[p] == 'b' || st[p] == 'B') *led = 3; - else if (st[p] == '1') *led = 4; + else if (st[p] == '1') { + if (st[p+1] == '0') *led = 13; + else if (st[p+1] == '1') *led = 14; + else if (st[p+1] == '2') *led = 15; + else if (st[p+1] == '3') *led = 16; + else if (st[p+1] == '4') *led = 17; + else if (st[p+1] == '5') *led = 18; + else if (st[p+1] == '6') *led = 19; + else *led = 4; + } else if (st[p] == '2') *led = 5; else if (st[p] == '3') *led = 6; else if (st[p] == '4') *led = 7; @@ -5238,6 +5495,7 @@ else if (st[p] == '6') *led = 9; else if (st[p] == '7') *led = 10; else if (st[p] == '8') *led = 11; + else if (st[p] == '9') *led = 12; else return ERR_UDPFORMAT; } @@ -5257,6 +5515,11 @@ *port = atoi (st+p); } + else if (st[p] == 'w' || st[p] == 'W') { + p++; + *macro_wait = atoi (st+p); + } + else return ERR_UDPFORMAT; } diff -Nru irserver-6.02.40/webserver.c irserver-6.03.08/webserver.c --- irserver-6.02.40/webserver.c 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/webserver.c 2010-11-01 20:54:34.000000000 +0000 @@ -280,7 +280,7 @@ } else { if (mask) mask = ((word)mask & 0xffff) | 0x10000; - SendIR (cmd_num,mask,COMMAND_SEND); + SendIR (cmd_num,mask,COMMAND_SEND,NULL); } resend_flag = 0; return; Binary files /tmp/vbRtwrHyLQ/irserver-6.02.40/x64/ccf.o and /tmp/v0uUxwnL8F/irserver-6.03.08/x64/ccf.o differ Binary files /tmp/vbRtwrHyLQ/irserver-6.02.40/x86/ccf.o and /tmp/v0uUxwnL8F/irserver-6.03.08/x86/ccf.o differ diff -Nru irserver-6.02.40/xap.c irserver-6.03.08/xap.c --- irserver-6.02.40/xap.c 2010-02-08 14:25:00.000000000 +0000 +++ irserver-6.03.08/xap.c 2010-11-01 20:54:37.000000000 +0000 @@ -234,7 +234,7 @@ if (xAP_GetItem (data+pos,"signal=",command) <= 0) return; res = DBFindRemoteCommand (remote,command,&cmd_num,NULL); - if (!res) res = SendIR (cmd_num,adr,COMMAND_SEND); + if (!res) res = SendIR (cmd_num,adr,COMMAND_SEND,NULL); if (res) { GetError (res, txt); switch(res) {