mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-27 12:46:34 +00:00
Fix keeloq functionality
This commit is contained in:
parent
c0a490a54e
commit
94f5321db4
@ -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;
|
||||||
|
@ -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)
|
||||||
@ -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;
|
||||||
|
@ -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))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user