Applied patch for everflourish in rfcmd. This closes #141. Thanks to

egil
This commit is contained in:
egil 2011-12-30 17:13:07 +01:00 committed by Micke Prag
parent d3227ebdf8
commit dd3504ffb8

View file

@ -56,6 +56,19 @@
* Arg 5: Level (0=off, 1 = on) * Arg 5: Level (0=off, 1 = on)
******************************************************************************/ ******************************************************************************/
/*******************************************************************************
* Modifications from rfcmd.c ver 2.1.0 based on marvelous work by Snakehand
* See http://www.telldus.com/forum/viewtopic.php?t=97&start=63
* Added support for EVERFLOURISH
* Note:
* 1. Command line syntax:
* /usr/local/bin/rfcmd /dev/ttyUSB0 EVERFLOURISH 1 15
* Arg 1: device
* Arg 2: protocol
* Arg 3: device number (0..65535)
* Arg 4: Level (0=off, 15=on, 10=learn)
******************************************************************************/
/******************************************************************************* /*******************************************************************************
* Modifications from rfcmd ver 2.1.1 done by Johan Ström * Modifications from rfcmd ver 2.1.1 done by Johan Ström
* Default disabled semaphores for FreeBSD. * Default disabled semaphores for FreeBSD.
@ -98,7 +111,8 @@ int createIkeaString(const char * pSystemStr, const char * pChannelStr,
char * pStrReturn); char * pStrReturn);
int createRisingSunString(const char * pCodeStr, const char* pUnitStr, const char * pOn_offStr, int createRisingSunString(const char * pCodeStr, const char* pUnitStr, const char * pOn_offStr,
char * pTxStr); char * pTxStr);
int createEverFlourishString(const char* pUnitStr, const char * pLevelStr,
char * pTxStr);
void printUsage(void); void printUsage(void);
void printVersion(void); void printVersion(void);
@ -148,7 +162,14 @@ int main( int argc, char **argv )
printUsage(); printUsage();
exit(1); exit(1);
} }
/* else - a send cmd string was created */ /* else - a send cmd string was created */
} else if ( (argc == 5) && (strcmp(*(argv+2),"EVERFLOURISH")==0) ) {
// Unit, Level
if ( createEverFlourishString(*(argv+3), *(argv+4), txStr) == 0 ) {
printUsage();
exit(1);
}
/* else - a send cmd string was created */
} else if ( (argc >= 2) && (strcmp(*(argv+1),"--version")==0) ) { } else if ( (argc >= 2) && (strcmp(*(argv+1),"--version")==0) ) {
printVersion(); printVersion();
exit(1); exit(1);
@ -525,6 +546,78 @@ int createRisingSunString(const char * pCodeStr, const char * pUnitStr, const ch
return strlen(pTxStr); return strlen(pTxStr);
} }
unsigned int everflourish_find_code(unsigned int x) {
unsigned int bits[16] = { 0xf ,0xa ,0x7 ,0xe,
0xf ,0xd ,0x9 ,0x1,
0x1 ,0x2 ,0x4 ,0x8,
0x3 ,0x6 ,0xc ,0xb };
unsigned int bit = 1;
unsigned int res = 0x5;
int i;
unsigned int lo,hi;
if ((x&0x3)==3) {
lo = x & 0x00ff;
hi = x & 0xff00;
lo += 4;
if (lo>0x100) lo = 0x12;
x = lo | hi;
}
for(i=0;i<16;i++) {
if (x&bit) {
res = res ^ bits[i];
}
bit = bit << 1;
}
return res;
}
int createEverFlourishString(const char * pUnitStr, const char * pLevelStr,
char * pTxStr)
{
int len = 0;
int level;
int unit;
unsigned int check;
int i;
unit = atoi(pUnitStr);
level = atoi(pLevelStr); /* ON=15, OFF=0, LEARN=10 */
check = everflourish_find_code(unit);
#ifdef RFCMD_DEBUG
printf("unit: %d, level: %d\n", unit, level);
#endif
/* check converted parameters for validity */
if((unit < 0) || (unit > 0xffff) ||
(level < 0) || (level > 15)) {
} else {
const char ssss = 85;
const char sssl = 84; // 0
const char slss = 69; // 1
const char bits[2] = {sssl,slss};
int i;
char preamble[] = {'R', 5, 'T', 114,60,1,1,105,ssss,ssss};
memcpy(pTxStr, preamble, sizeof(preamble));
len += sizeof(preamble);
for(i=15;i>=0;i--) pTxStr[len++]=bits[(unit>>i)&0x01];
for(i=3;i>=0;i--) pTxStr[len++]=bits[(check>>i)&0x01];
for(i=3;i>=0;i--) pTxStr[len++]=bits[(level>>i)&0x01];
pTxStr[len++] = ssss;
pTxStr[len++] = '+';
}
pTxStr[len] = '\0';
return strlen(pTxStr);
}
void printUsage(void) void printUsage(void)
{ {
@ -535,7 +628,7 @@ void printUsage(void)
#else #else
printf("\t DEVICE: /dev/ttyUSB[0..n]\n" ); printf("\t DEVICE: /dev/ttyUSB[0..n]\n" );
#endif #endif
printf("\t PROTOCOLS: NEXA, SARTANO, WAVEMAN, IKEA, RISINGSUN\n" ); printf("\t PROTOCOLS: NEXA, SARTANO, WAVEMAN, IKEA, RISINGSUN, EVERFLOURISH\n" );
printf("\n"); printf("\n");
printf("\t PROTOCOL ARGUMENTS - NEXA, WAVEMAN:\n"); printf("\t PROTOCOL ARGUMENTS - NEXA, WAVEMAN:\n");
printf("\t\tHOUSE_CODE: A..P\n\t\tCHANNEL: 1..16\n\t\tOFF_ON: 0..1\n" ); printf("\t\tHOUSE_CODE: A..P\n\t\tCHANNEL: 1..16\n\t\tOFF_ON: 0..1\n" );
@ -551,6 +644,10 @@ void printUsage(void)
printf("\t\tCODE: 1..4\n\t\tDEVICE: 1..4\n"); printf("\t\tCODE: 1..4\n\t\tDEVICE: 1..4\n");
printf("\t\tOFF_ON: 0..1\n" ); printf("\t\tOFF_ON: 0..1\n" );
printf("\n"); printf("\n");
printf("\t PROTOCOL ARGUMENTS - EVERFLOURISH:\n");
printf("\t\tDEVICE: 0..65535\n");
printf("\t\tLEVEL: 0=off, 10=learn, 15=on\n" );
printf("\n");
printf("Report bugs to <info.tech@telldus.se>\n"); printf("Report bugs to <info.tech@telldus.se>\n");
} }