Fix keeloq functionality

This commit is contained in:
Theo Arends 2020-02-28 16:35:19 +01:00
parent c0a490a54e
commit 94f5321db4
3 changed files with 39 additions and 23 deletions

View File

@ -530,7 +530,9 @@ void GetFeatures(void)
feature6 = 0x00000000; feature6 = 0x00000000;
// feature6 |= 0x00000001; #ifdef USE_KEELOQ
feature6 |= 0x00000001; // xdrv_36keeloq.ino
#endif
// feature6 |= 0x00000002; // feature6 |= 0x00000002;
// feature6 |= 0x00000004; // feature6 |= 0x00000004;
// feature6 |= 0x00000008; // feature6 |= 0x00000008;

View File

@ -1,5 +1,7 @@
/* /*
xdrv_36 xdrv_36_keeloq.ino - Jarolift Keeloq shutter support for Tasmota
Copyright (C) 2020 he-so
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -16,6 +18,14 @@
*/ */
#ifdef USE_KEELOQ #ifdef USE_KEELOQ
/*********************************************************************************************\
* Keeloq shutter support
*
* Uses hardware SPI and two user configurable GPIO's (CC1101 GDO0 and CC1101 GDO2)
*
* Considering the implementation these two user GPIO's are fake.
* Only CC1101 GDO0 is used and must always be GPIO05 dictated by the used CC1101 library.
\*********************************************************************************************/
#define XDRV_36 36 #define XDRV_36 36
@ -27,9 +37,6 @@
#define Lowpulse 400 #define Lowpulse 400
#define Highpulse 800 #define Highpulse 800
#define TX_PORT pin[GPIO_CC1101_GDO2] // Outputport for transmission
#define RX_PORT pin[GPIO_CC1101_GDO0] // Inputport for reception
const char kJaroliftCommands[] PROGMEM = "Keeloq|" // prefix const char kJaroliftCommands[] PROGMEM = "Keeloq|" // prefix
"SendRaw|SendButton|Set"; "SendRaw|SendButton|Set";
@ -47,6 +54,8 @@ struct JAROLIFT_DEVICE {
uint64_t pack = 0; // Contains data to send. uint64_t pack = 0; // Contains data to send.
int count = 0; int count = 0;
uint32_t serial = 0x0; uint32_t serial = 0x0;
uint8_t port_tx;
uint8_t port_rx;
} jaroliftDevice; } jaroliftDevice;
void CmdSet(void) void CmdSet(void)
@ -75,7 +84,7 @@ void CmdSet(void)
GenerateDeviceCryptKey(); GenerateDeviceCryptKey();
ResponseCmndDone(); ResponseCmndDone();
} else { } else {
DEBUG_DRIVER_LOG(LOG_LEVEL_DEBUG_MORE, PSTR("no payload")); DEBUG_DRIVER_LOG(LOG_LEVEL_DEBUG_MORE, PSTR("no payload"));
} }
} else { } else {
DEBUG_DRIVER_LOG(LOG_LEVEL_DEBUG_MORE, PSTR("no param")); DEBUG_DRIVER_LOG(LOG_LEVEL_DEBUG_MORE, PSTR("no param"));
@ -114,7 +123,7 @@ void CmdSendButton(void)
for(int repeat = 0; repeat <= 1; repeat++) for(int repeat = 0; repeat <= 1; repeat++)
{ {
uint64_t bitsToSend = jaroliftDevice.pack; uint64_t bitsToSend = jaroliftDevice.pack;
digitalWrite(TX_PORT, LOW); digitalWrite(jaroliftDevice.port_tx, LOW);
delayMicroseconds(1150); delayMicroseconds(1150);
SendSyncPreamble(13); SendSyncPreamble(13);
delayMicroseconds(3500); delayMicroseconds(3500);
@ -140,16 +149,16 @@ void SendBit(byte bitToSend)
{ {
if (bitToSend==1) if (bitToSend==1)
{ {
digitalWrite(TX_PORT, LOW); // Simple encoding of bit state 1 digitalWrite(jaroliftDevice.port_tx, LOW); // Simple encoding of bit state 1
delayMicroseconds(Lowpulse); delayMicroseconds(Lowpulse);
digitalWrite(TX_PORT, HIGH); digitalWrite(jaroliftDevice.port_tx, HIGH);
delayMicroseconds(Highpulse); delayMicroseconds(Highpulse);
} }
else else
{ {
digitalWrite(TX_PORT, LOW); // Simple encoding of bit state 0 digitalWrite(jaroliftDevice.port_tx, LOW); // Simple encoding of bit state 0
delayMicroseconds(Highpulse); delayMicroseconds(Highpulse);
digitalWrite(TX_PORT, HIGH); digitalWrite(jaroliftDevice.port_tx, HIGH);
delayMicroseconds(Lowpulse); delayMicroseconds(Lowpulse);
} }
} }
@ -163,7 +172,7 @@ void CmndSendRaw(void)
{ {
if (XdrvMailbox.data_len > 0) if (XdrvMailbox.data_len > 0)
{ {
digitalWrite(TX_PORT, LOW); digitalWrite(jaroliftDevice.port_tx, LOW);
delayMicroseconds(1150); delayMicroseconds(1150);
SendSyncPreamble(13); SendSyncPreamble(13);
delayMicroseconds(3500); delayMicroseconds(3500);
@ -208,9 +217,9 @@ void SendSyncPreamble(int l)
{ {
for (int i = 0; i < l; ++i) for (int i = 0; i < l; ++i)
{ {
digitalWrite(TX_PORT, LOW); digitalWrite(jaroliftDevice.port_tx, LOW);
delayMicroseconds(400); delayMicroseconds(400);
digitalWrite(TX_PORT, HIGH); digitalWrite(jaroliftDevice.port_tx, HIGH);
delayMicroseconds(380); delayMicroseconds(380);
} }
} }
@ -231,8 +240,11 @@ void CreateKeeloqPacket()
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("pack low: %08x"), jaroliftDevice.pack); AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("pack low: %08x"), jaroliftDevice.pack);
} }
void InitKeeloq() void KeeloqInit()
{ {
jaroliftDevice.port_tx = pin[GPIO_CC1101_GDO2]; // Output port for transmission
jaroliftDevice.port_rx = pin[GPIO_CC1101_GDO0]; // Input port for reception
DEBUG_DRIVER_LOG(LOG_LEVEL_DEBUG_MORE, PSTR("cc1101.init()")); DEBUG_DRIVER_LOG(LOG_LEVEL_DEBUG_MORE, PSTR("cc1101.init()"));
delay(100); delay(100);
cc1101.init(); cc1101.init();
@ -241,8 +253,8 @@ void InitKeeloq()
cc1101.setCarrierFreq(CFREQ_433); cc1101.setCarrierFreq(CFREQ_433);
cc1101.disableAddressCheck(); cc1101.disableAddressCheck();
pinMode(TX_PORT, OUTPUT); pinMode(jaroliftDevice.port_tx, OUTPUT);
pinMode(RX_PORT, INPUT_PULLUP); pinMode(jaroliftDevice.port_rx, INPUT_PULLUP);
jaroliftDevice.serial = Settings.keeloq_serial; jaroliftDevice.serial = Settings.keeloq_serial;
jaroliftDevice.count = Settings.keeloq_count; jaroliftDevice.count = Settings.keeloq_count;
@ -254,17 +266,19 @@ void InitKeeloq()
\*********************************************************************************************/ \*********************************************************************************************/
bool Xdrv36(uint8_t function) bool Xdrv36(uint8_t function)
{ {
if ((99 == pin[GPIO_CC1101_GDO0]) || (99 == pin[GPIO_CC1101_GDO2])) { return false; }
bool result = false; bool result = false;
switch (function) { switch (function) {
case FUNC_INIT:
InitKeeloq();
DEBUG_DRIVER_LOG(LOG_LEVEL_DEBUG_MORE, PSTR("init done."));
break;
case FUNC_COMMAND: case FUNC_COMMAND:
AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("calling command")); AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("calling command"));
result = DecodeCommand(kJaroliftCommands, jaroliftCommand); result = DecodeCommand(kJaroliftCommands, jaroliftCommand);
break; break;
case FUNC_INIT:
KeeloqInit();
DEBUG_DRIVER_LOG(LOG_LEVEL_DEBUG_MORE, PSTR("init done."));
break;
} }
return result; return result;

View File

@ -198,7 +198,7 @@ a_features = [[
"USE_NRF24","USE_MIBLE","USE_HM10","USE_LE01MR", "USE_NRF24","USE_MIBLE","USE_HM10","USE_LE01MR",
"USE_AHT1x","USE_WEMOS_MOTOR_V1","USE_DEVICE_GROUPS","USE_PWM_DIMMER" "USE_AHT1x","USE_WEMOS_MOTOR_V1","USE_DEVICE_GROUPS","USE_PWM_DIMMER"
],[ ],[
"","","","", "USE_KEELOQ","","","",
"","","","", "","","","",
"","","","", "","","","",
"","","","", "","","","",
@ -239,7 +239,7 @@ else:
obj = json.load(fp) obj = json.load(fp)
def StartDecode(): def StartDecode():
print ("\n*** decode-status.py v20200227 by Theo Arends and Jacek Ziolkowski ***") print ("\n*** decode-status.py v20200228 by Theo Arends and Jacek Ziolkowski ***")
# print("Decoding\n{}".format(obj)) # print("Decoding\n{}".format(obj))