Applied patch for everflourish in rfcmd. This closes #141. Thanks to
egil
This commit is contained in:
parent
d3227ebdf8
commit
dd3504ffb8
1 changed files with 100 additions and 3 deletions
101
rfcmd/rfcmd.c
101
rfcmd/rfcmd.c
|
@ -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);
|
||||||
|
|
||||||
|
@ -149,6 +163,13 @@ int main( int argc, char **argv )
|
||||||
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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue