Added KlikAanKlikUit protocol
This commit is contained in:
parent
66021b3750
commit
5e2c61d8ec
1 changed files with 703 additions and 578 deletions
223
src/rtl_433.c
223
src/rtl_433.c
|
@ -135,7 +135,6 @@ static int override_long = 0;
|
|||
#define OOK_PWM_D 1 /* Pulses are of the same length, the distance varies */
|
||||
#define OOK_PWM_P 2 /* The length of the pulses varies */
|
||||
|
||||
|
||||
typedef struct {
|
||||
unsigned int id;
|
||||
char name[256];
|
||||
|
@ -193,7 +192,121 @@ static int silvercrest_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bit
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
static int newkaku_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) {
|
||||
/* Two bits map to 2 states, 0 1 -> 0 and 1 1 -> 1 */
|
||||
/* Status bit can be 1 1 -> 1 which indicates DIM value. 4 extra bits are present with value */
|
||||
/*start pulse: 1T high, 10.44T low */
|
||||
/*- 26 bit: Address */
|
||||
/*- 1 bit: group bit*/
|
||||
/*- 1 bit: Status bit on/off/[dim]*/
|
||||
/*- 4 bit: unit*/
|
||||
/*- [4 bit: dim level. Present if [dim] is used, but might be present anyway...]*/
|
||||
/*- stop pulse: 1T high, 40T low */
|
||||
int i;
|
||||
uint8_t tmp = 0;
|
||||
uint8_t unit = 0;
|
||||
uint8_t packet = 0;
|
||||
uint8_t bitcount = 0;
|
||||
uint32_t kakuid = 0;
|
||||
|
||||
if (bb[0][0] == 0xac) {//allways starts with ac
|
||||
// first bit is from startbit sequence, not part of payload!
|
||||
// check protocol if value is 10 or 01, else stop processing as it is no vallid KAKU packet!
|
||||
//get id=24bits, remember 1st 1 bit = startbit, no payload!
|
||||
for (packet = 0; packet < 6; packet++) {//get first part kakuid
|
||||
tmp = bb[0][packet] << 1;
|
||||
if ((bb[0][packet + 1]&(1 << 7)) != 0) {// if set add bit to current
|
||||
tmp++;
|
||||
}
|
||||
|
||||
for (bitcount = 0; bitcount < 8; bitcount += 2) {//process bitstream, check protocol!
|
||||
|
||||
if (((tmp << bitcount & (0x80)) == 0x80)&((tmp << bitcount & (0x40)) == 0)) {
|
||||
//add 1
|
||||
kakuid = kakuid << 1;
|
||||
kakuid++;
|
||||
} else
|
||||
if (((tmp << bitcount & (0x80)) == 0)&((tmp << bitcount & (0x40)) == 0x40)) {
|
||||
kakuid = kakuid << 1;
|
||||
//add 0
|
||||
} else {
|
||||
return 0; //00 and 11 indicates packet error. Do exit, no valid packet
|
||||
}
|
||||
}
|
||||
}
|
||||
tmp = bb[0][6] << 1; //Get last part ID
|
||||
for (bitcount = 0; bitcount < 4; bitcount += 2) {
|
||||
if (((tmp << bitcount & (0x80)) == 0x80)&((tmp << bitcount & (0x40)) == 0)) {
|
||||
//add 1
|
||||
kakuid = kakuid << 1;
|
||||
kakuid++;
|
||||
} else
|
||||
if (((tmp << bitcount & (0x80)) == 0)&((tmp << bitcount & (0x40)) == 0x40)) {
|
||||
//= add bit on kakuid
|
||||
kakuid = kakuid << 1;
|
||||
//add 0
|
||||
} else {
|
||||
//fprintf(stderr, " Packet error, no newkaku!!\n", tmp << bitcount);
|
||||
return 0; //00 and 11 indicates packet error. no valid packet! do exit
|
||||
}
|
||||
}
|
||||
//Get unit ID
|
||||
tmp = bb[0][7] << 1;
|
||||
if ((bb[0][8]&(1 << 7)) != 0) {// if set add bit to current
|
||||
tmp++;
|
||||
}
|
||||
for (bitcount = 0; bitcount < 8; bitcount += 2) {//process bitstream, check protocol!
|
||||
if (((tmp << bitcount & (0x80)) == 0x80)&((tmp << bitcount & (0x40)) == 0)) {
|
||||
//add 1
|
||||
unit = unit << 1;
|
||||
unit++;
|
||||
} else
|
||||
if (((tmp << bitcount & (0x80)) == 0)&((tmp << bitcount & (0x40)) == 0x40)) {
|
||||
unit = unit << 1;
|
||||
//add 0
|
||||
} else {
|
||||
return 0; //00 and 11 indicates packet error. Do exit, no valid packet
|
||||
}
|
||||
}
|
||||
fprintf(stderr, "NewKaku event:\n");
|
||||
fprintf(stderr, "Model = NewKaKu on/off/dimmer switch\n");
|
||||
fprintf(stderr, "KakuId = %d (H%.2X)\n", kakuid, kakuid);
|
||||
fprintf(stderr, "Unit = %d (H%.2X)\n", unit, unit);
|
||||
fprintf(stderr, "Group Call = %s\n", (((bb[0][6] & (0x04)) == 0x04)&((bb[0][6] & (0x02)) == 0)) ? "Yes" : "No");
|
||||
fprintf(stderr, "Command = %s\n", (((bb[0][6] & (0x01)) == 0x01)&((bb[0][7] & (0x80)) == 0)) ? "On" : "Off");
|
||||
if (((bb[0][6] & (0x01)) == 0x01)&((bb[0][7] & (0x80)) == 0x80)) {//11 indicates DIM command, 4 extra bits indicate DIM value
|
||||
fprintf(stderr, "Dim = Yes\n");
|
||||
tmp = bb[0][8] << 1; // get packet, loose first bit
|
||||
uint8_t dv = 0;
|
||||
if ((bb[0][9]&(1 << 7)) != 0) {// if bit is set Add to current packet
|
||||
tmp++;
|
||||
for (bitcount = 0; bitcount < 8; bitcount += 2) {//process last bit outside
|
||||
if (((tmp << bitcount & (0x80)) == 0x80)&((tmp << bitcount & (0x40)) == 0)) {
|
||||
//add 1
|
||||
dv = dv << 1;
|
||||
dv++;
|
||||
} else
|
||||
if (((tmp << bitcount & (0x80)) == 0)&((tmp << bitcount & (0x40)) == 0x40)) {
|
||||
dv = dv << 1;
|
||||
//add 0
|
||||
} else {
|
||||
return 0; //00 and 11 indicates packet error. Do exit, no valid packet
|
||||
}
|
||||
}
|
||||
}
|
||||
fprintf(stderr, "Dim Value = %d\n", dv);
|
||||
} else {
|
||||
fprintf(stderr, "Dim = No\n");
|
||||
fprintf(stderr, "Dim Value = 0\n");
|
||||
}
|
||||
fprintf(stderr, "%02x %02x %02x %02x %02x %02x% 02x %02x %02x\n",
|
||||
bb[0][0], bb[0][1], bb[0][2], bb[0][3], bb[0][4], bb[0][5], bb[0][6], bb[0][7], bb[0][8]);
|
||||
if (debug_output)
|
||||
debug_callback(bb);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
static int rubicson_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS], int16_t bits_per_row[BITBUF_ROWS]) {
|
||||
int temperature_before_dec;
|
||||
int temperature_after_dec;
|
||||
|
@ -326,7 +439,6 @@ static int steffen_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits_pe
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
uint16_t AD_POP(uint8_t bb[BITBUF_COLS], uint8_t bits, uint8_t bit) {
|
||||
uint16_t val = 0;
|
||||
uint8_t i, byte_no, bit_no;
|
||||
|
@ -359,8 +471,10 @@ static int em1000_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits_per
|
|||
|
||||
// read 9 bytes with stopbit ...
|
||||
for (i = 0; i < 9; i++) {
|
||||
dec[i] = AD_POP (bb_p, 8, bit); bit+=8;
|
||||
stopbit=AD_POP (bb_p, 1, bit); bit+=1;
|
||||
dec[i] = AD_POP(bb_p, 8, bit);
|
||||
bit += 8;
|
||||
stopbit = AD_POP(bb_p, 1, bit);
|
||||
bit += 1;
|
||||
if (!stopbit) {
|
||||
// fprintf(stderr, "!stopbit: %i\n", i);
|
||||
return 0;
|
||||
|
@ -370,7 +484,8 @@ static int em1000_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits_per
|
|||
}
|
||||
|
||||
// Read checksum
|
||||
checksum_received = AD_POP (bb_p, 8, bit); bit+=8;
|
||||
checksum_received = AD_POP(bb_p, 8, bit);
|
||||
bit += 8;
|
||||
if (checksum_received != checksum_calculated) {
|
||||
// fprintf(stderr, "checksum_received != checksum_calculated: %d %d\n", checksum_received, checksum_calculated);
|
||||
return 0;
|
||||
|
@ -402,8 +517,10 @@ static int ws2000_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits_per
|
|||
uint8_t stopbit;
|
||||
uint8_t sum_received;
|
||||
|
||||
dec[0] = AD_POP (bb[0], 4, bit); bit+=4;
|
||||
stopbit= AD_POP (bb[0], 1, bit); bit+=1;
|
||||
dec[0] = AD_POP(bb[0], 4, bit);
|
||||
bit += 4;
|
||||
stopbit = AD_POP(bb[0], 1, bit);
|
||||
bit += 1;
|
||||
if (!stopbit) {
|
||||
//fprintf(stderr, "!stopbit\n");
|
||||
return 0;
|
||||
|
@ -413,8 +530,10 @@ static int ws2000_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits_per
|
|||
|
||||
// read nibbles with stopbit ...
|
||||
for (i = 1; i <= (dec[0] == 4 ? 12 : 8); i++) {
|
||||
dec[i] = AD_POP (bb[0], 4, bit); bit+=4;
|
||||
stopbit= AD_POP (bb[0], 1, bit); bit+=1;
|
||||
dec[i] = AD_POP(bb[0], 4, bit);
|
||||
bit += 4;
|
||||
stopbit = AD_POP(bb[0], 1, bit);
|
||||
bit += 1;
|
||||
if (!stopbit) {
|
||||
//fprintf(stderr, "!stopbit %i\n", i);
|
||||
return 0;
|
||||
|
@ -430,7 +549,8 @@ static int ws2000_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits_per
|
|||
}
|
||||
|
||||
// Read sum
|
||||
sum_received = AD_POP (bb[0], 4, bit); bit+=4;
|
||||
sum_received = AD_POP(bb[0], 4, bit);
|
||||
bit += 4;
|
||||
sum_calculated += 5;
|
||||
sum_calculated &= 0xF;
|
||||
if (sum_received != sum_calculated) {
|
||||
|
@ -455,8 +575,7 @@ static int ws2000_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits_per
|
|||
|
||||
// ** Acurite 5n1 functions **
|
||||
|
||||
const float acurite_winddirections[] =
|
||||
{ 337.5, 315.0, 292.5, 270.0, 247.5, 225.0, 202.5, 180,
|
||||
const float acurite_winddirections[] ={337.5, 315.0, 292.5, 270.0, 247.5, 225.0, 202.5, 180,
|
||||
157.5, 135.0, 112.5, 90.0, 67.5, 45.0, 22.5, 0.0};
|
||||
|
||||
static int acurite_raincounter = 0;
|
||||
|
@ -553,6 +672,7 @@ static int acurite5n1_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits
|
|||
int raincounter = acurite_getRainfallCounter(buf[5], buf[6]);
|
||||
if (acurite_raincounter > 0) {
|
||||
// track rainfall difference after first run
|
||||
raincounter = acurite_getRainfallCounter(buf[5], buf[6]);
|
||||
rainfall = (raincounter - acurite_raincounter) * 0.01;
|
||||
} else {
|
||||
// capture starting counter
|
||||
|
@ -571,7 +691,7 @@ static int acurite5n1_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits
|
|||
acurite_getWindSpeed(buf[3], buf[4]));
|
||||
fprintf(stderr, "temp: %2.1f° F, ",
|
||||
acurite_getTemp(buf[4], buf[5]));
|
||||
fprintf(stderr, "humidity: %d%% RH\n",
|
||||
fprintf(stderr, "humidity: %d% RH\n",
|
||||
acurite_getHumidity(buf[6]));
|
||||
}
|
||||
}
|
||||
|
@ -803,9 +923,11 @@ uint8_t reverse8(uint8_t x) {
|
|||
x = (x & 0xAA) >> 1 | (x & 0x55) << 1;
|
||||
return x;
|
||||
}
|
||||
|
||||
uint8_t bcd_decode8(uint8_t x) {
|
||||
return ((x & 0xF0) >> 4) * 10 + (x & 0x0F);
|
||||
}
|
||||
|
||||
static int alectov1_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS], int16_t bits_per_row[BITBUF_ROWS]) {
|
||||
int temperature_before_dec;
|
||||
int temperature_after_dec;
|
||||
|
@ -831,7 +953,8 @@ static int alectov1_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits_p
|
|||
/* Quit if checksup does not work out */
|
||||
if (csum != (bb[1][4] >> 4) || csum2 != (bb[5][4] >> 4)) {
|
||||
fprintf(stderr, "\nAlectoV1 CRC error");
|
||||
return 0; } //Invalid checksum
|
||||
return 0;
|
||||
} //Invalid checksum
|
||||
|
||||
|
||||
uint8_t wind = 0;
|
||||
|
@ -847,8 +970,11 @@ static int alectov1_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits_p
|
|||
if (wind) {
|
||||
int skip = -1;
|
||||
/* Untested code written according to the specification, may not decode correctly */
|
||||
if ((bb[1][1]&0xe) == 0x8 && bb[1][2] == 0) { skip = 0; }
|
||||
else if ((bb[1][1]&0xe) == 0xe) { skip = 4; } //According to supplied data!
|
||||
if ((bb[1][1]&0xe) == 0x8 && bb[1][2] == 0) {
|
||||
skip = 0;
|
||||
} else if ((bb[1][1]&0xe) == 0xe) {
|
||||
skip = 4;
|
||||
} //According to supplied data!
|
||||
if (skip >= 0) {
|
||||
double speed = reverse8(bb[1 + skip][3]) * 0.2;
|
||||
double gust = reverse8(bb[5 + skip][3]) * 0.2;
|
||||
|
@ -866,7 +992,9 @@ static int alectov1_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS],int16_t bits_p
|
|||
bb[5][0] == bb[6][0] && (bb[3][4] & 0xf) == 0 && (bb[5][4] & 0xf) == 0) {
|
||||
//static char * temp_states[4] = {"stable", "increasing", "decreasing", "invalid"};
|
||||
temp = (int16_t) ((uint16_t) (reverse8(bb[1][1]) >> 4) | (reverse8(bb[1][2]) << 4));
|
||||
if ((temp & 0x800) != 0) { temp |= 0xf000; }
|
||||
if ((temp & 0x800) != 0) {
|
||||
temp |= 0xf000;
|
||||
}
|
||||
temperature_before_dec = abs(temp / 10);
|
||||
temperature_after_dec = abs(temp % 10);
|
||||
humidity = bcd_decode8(reverse8(bb[1][3]));
|
||||
|
@ -1025,6 +1153,15 @@ r_device lacrossetx = {
|
|||
/* .json_callback = */ &lacrossetx_callback,
|
||||
};
|
||||
|
||||
r_device newkaku = {
|
||||
/* .id = */ 11,
|
||||
/* .name = */ "New KlikAanKlikUit protocol, on/off events ass well as DIM",
|
||||
/* .modulation = */ OOK_PWM_D,
|
||||
/* .short_limit = */ 200,
|
||||
/* .long_limit = */ 800,
|
||||
/* .reset_limit = */ 4000,
|
||||
/* .json_callback = */ &newkaku_callback,
|
||||
};
|
||||
struct protocol_state {
|
||||
int (*callback)(uint8_t bits_buffer[BITBUF_ROWS][BITBUF_COLS], int16_t bits_per_row[BITBUF_ROWS]);
|
||||
|
||||
|
@ -1056,7 +1193,6 @@ struct protocol_state {
|
|||
|
||||
};
|
||||
|
||||
|
||||
struct dm_state {
|
||||
FILE *file;
|
||||
int save_data;
|
||||
|
@ -1080,8 +1216,7 @@ struct dm_state {
|
|||
|
||||
};
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
void usage(void) {
|
||||
fprintf(stderr,
|
||||
"rtl_433, an ISM band generic data receiver for RTL2832 based DVB-T receivers\n\n"
|
||||
"Usage:\t[-d device_index (default: 0)]\n"
|
||||
|
@ -1104,9 +1239,9 @@ void usage(void)
|
|||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
BOOL WINAPI
|
||||
sighandler(int signum)
|
||||
{
|
||||
sighandler(int signum) {
|
||||
if (CTRL_C_EVENT == signum) {
|
||||
fprintf(stderr, "Signal caught, exiting!\n");
|
||||
do_exit = 1;
|
||||
|
@ -1116,13 +1251,9 @@ sighandler(int signum)
|
|||
return FALSE;
|
||||
}
|
||||
#else
|
||||
static void sighandler(int signum)
|
||||
{
|
||||
if (signum == SIGPIPE) {
|
||||
signal(SIGPIPE,SIG_IGN);
|
||||
} else {
|
||||
|
||||
static void sighandler(int signum) {
|
||||
fprintf(stderr, "Signal caught, exiting!\n");
|
||||
}
|
||||
do_exit = 1;
|
||||
rtlsdr_cancel_async(dev);
|
||||
}
|
||||
|
@ -1141,8 +1272,7 @@ static void calc_squares() {
|
|||
* @returns pointer to the input buffer
|
||||
*/
|
||||
|
||||
static void envelope_detect(unsigned char *buf, uint32_t len, int decimate)
|
||||
{
|
||||
static void envelope_detect(unsigned char *buf, uint32_t len, int decimate) {
|
||||
uint16_t* sample_buffer = (uint16_t*) buf;
|
||||
unsigned int i;
|
||||
unsigned op = 0;
|
||||
|
@ -1244,10 +1374,10 @@ static unsigned int pulse_end = 0;
|
|||
static unsigned int pulse_avg = 0;
|
||||
static unsigned int signal_start = 0;
|
||||
static unsigned int signal_end = 0;
|
||||
static unsigned int signal_pulse_data[4000][3] = {{0}};
|
||||
static unsigned int signal_pulse_data[4000][3] = {
|
||||
{0}};
|
||||
static unsigned int signal_pulse_counter = 0;
|
||||
|
||||
|
||||
static void classify_signal() {
|
||||
unsigned int i, k, max = 0, min = 1000000, t;
|
||||
unsigned int delta, count_min, count_max, min_new, max_new, p_limit;
|
||||
|
@ -1278,16 +1408,17 @@ static void classify_signal() {
|
|||
//TODO use Lloyd-Max quantizer instead
|
||||
k = 1;
|
||||
while ((k < 10) && (delta > 0)) {
|
||||
min_new = 0; count_min = 0;
|
||||
max_new = 0; count_max = 0;
|
||||
min_new = 0;
|
||||
count_min = 0;
|
||||
max_new = 0;
|
||||
count_max = 0;
|
||||
|
||||
for (i = 0; i < 1000; i++) {
|
||||
if (signal_pulse_data[i][0] > 0) {
|
||||
if (signal_pulse_data[i][2] < t) {
|
||||
min_new = min_new + signal_pulse_data[i][2];
|
||||
count_min++;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
max_new = max_new + signal_pulse_data[i][2];
|
||||
count_max++;
|
||||
}
|
||||
|
@ -1313,7 +1444,7 @@ static void classify_signal() {
|
|||
}
|
||||
}
|
||||
/* 50% decision limit */
|
||||
if (min != 0 && max/min > 1) {
|
||||
if (max / min > 1) {
|
||||
fprintf(stderr, "Pulse coding: Short pulse length %d - Long pulse length %d\n", min, max);
|
||||
signal_type = 2;
|
||||
} else {
|
||||
|
@ -1467,9 +1598,7 @@ static void classify_signal() {
|
|||
|
||||
};
|
||||
|
||||
|
||||
static void pwm_analyze(struct dm_state *demod, int16_t *buf, uint32_t len)
|
||||
{
|
||||
static void pwm_analyze(struct dm_state *demod, int16_t *buf, uint32_t len) {
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
|
@ -1632,7 +1761,6 @@ static void pwm_p_decode(struct dm_state *demod, struct protocol_state* p, int16
|
|||
if (!p->real_bits && p->start_bit && (buf[i] < demod->level_limit)) {
|
||||
/* end of startbit */
|
||||
p->real_bits = 1;
|
||||
p->sample_counter = 0;
|
||||
// fprintf(stderr, "start bit pulse end detected\n");
|
||||
}
|
||||
if (p->start_c) p->sample_counter++;
|
||||
|
@ -1650,7 +1778,7 @@ static void pwm_p_decode(struct dm_state *demod, struct protocol_state* p, int16
|
|||
|
||||
p->pulse_length = p->sample_counter - p->pulse_start;
|
||||
// fprintf(stderr, "real bit pulse end detected %d\n", p->pulse_length);
|
||||
// fprintf(stderr, "space duration %d\n", p->sample_counter - p->pulse_length);
|
||||
// fprintf(stderr, "space duration %d\n", p->sample_counter);
|
||||
|
||||
if (p->pulse_length <= p->short_limit) {
|
||||
demod_add_bit(p, 1);
|
||||
|
@ -1705,8 +1833,7 @@ static uint16_t lp_xmem[FILTER_ORDER] = {0};
|
|||
int a[FILTER_ORDER + 1] = {FIX(1.00000), FIX(0.96907)};
|
||||
int b[FILTER_ORDER + 1] = {FIX(0.015466), FIX(0.015466)};
|
||||
|
||||
static void low_pass_filter(uint16_t *x_buf, int16_t *y_buf, uint32_t len)
|
||||
{
|
||||
static void low_pass_filter(uint16_t *x_buf, int16_t *y_buf, uint32_t len) {
|
||||
unsigned int i;
|
||||
|
||||
/* Calculate first sample */
|
||||
|
@ -1721,9 +1848,7 @@ static void low_pass_filter(uint16_t *x_buf, int16_t *y_buf, uint32_t len)
|
|||
//fprintf(stderr, "%d\n", y_buf[0]);
|
||||
}
|
||||
|
||||
|
||||
static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx)
|
||||
{
|
||||
static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx) {
|
||||
struct dm_state *demod = ctx;
|
||||
uint16_t* sbuf = (uint16_t*) buf;
|
||||
int i;
|
||||
|
@ -1793,8 +1918,7 @@ static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx)
|
|||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
#ifndef _WIN32
|
||||
struct sigaction sigact;
|
||||
#endif
|
||||
|
@ -1898,6 +2022,7 @@ int main(int argc, char **argv)
|
|||
register_protocol(demod, &acurite5n1);
|
||||
register_protocol(demod, &lacrossetx);
|
||||
register_protocol(demod, &alectov1);
|
||||
register_protocol(demod, &newkaku);
|
||||
|
||||
if (argc <= optind - 1) {
|
||||
usage();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue