From 63ff462f53b026ba552fe55a82d9508166e67180 Mon Sep 17 00:00:00 2001 From: jziolkowski Date: Sun, 5 Dec 2021 13:40:01 +0100 Subject: [PATCH] using pointer for Shift595, refactored pin init --- tasmota/i18n.h | 2 - tasmota/my_user_config.h | 6 ++- tasmota/tasmota_template.h | 2 - tasmota/xdrv_60_shift595.ino | 92 +++++++++++++++++++----------------- 4 files changed, 53 insertions(+), 49 deletions(-) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index db93df902..387ba8f33 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -717,9 +717,7 @@ #define D_BR_NOT_STARTED "Berry not started" // Commands xdrv_60_shift595.ino - 74x595 family shift register driver -#ifdef USE_SHIFT595 #define D_CMND_SHIFT595_DEVICE_COUNT "Shift595DeviceCount" -#endif // Commands xsns_02_analog.ino #define D_CMND_ADCPARAM "AdcParam" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index dcdb5acc9..9eb87e186 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -350,8 +350,6 @@ #define ZIGBEE_DISTINCT_TOPICS false // [SetOption89] Enable unique device topic based on Zigbee device ShortAddr #define ZIGBEE_RMV_ZBRECEIVED false // [SetOption100] Remove ZbReceived form JSON message #define ZIGBEE_INDEX_EP false // [SetOption101] Add the source endpoint as suffix to attributes, ex `Power3` instead of `Power` if sent from endpoint 3 -#define SHIFT595_INVERT_OUTPUTS false // [SetOption133] Don't invert outputs of 74x595 shift register -#define SHIFT595_DEVICE_COUNT 1 // [Shift595DeviceCount] Set the number of connected 74x595 shift registers /*********************************************************************************************\ * END OF SECTION 1 @@ -895,6 +893,10 @@ // -- Other sensors/drivers ----------------------- +// #define USE_SHIFT595 + #define SHIFT595_INVERT_OUTPUTS false // [SetOption133] Don't invert outputs of 74x595 shift register + #define SHIFT595_DEVICE_COUNT 1 // [Shift595DeviceCount] Set the number of connected 74x595 shift registers + //#define USE_TM1638 // Add support for TM1638 switches copying Switch1 .. Switch8 (+1k code) //#define USE_HX711 // Add support for HX711 load cell (+1k5 code) // #define USE_HX711_GUI // Add optional web GUI to HX711 as scale (+1k8 code) diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 311ac9388..d8aa87742 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -374,9 +374,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_HM330X_SET "|" D_SENSOR_HEARTBEAT "|" D_SENSOR_HEARTBEAT "_i|" -#ifdef USE_SHIFT595 D_GPIO_SHIFT595_SRCLK "|" D_GPIO_SHIFT595_RCLK "|" D_GPIO_SHIFT595_OE "|" D_GPIO_SHIFT595_SER "|" -#endif ; const char kSensorNamesFixed[] PROGMEM = diff --git a/tasmota/xdrv_60_shift595.ino b/tasmota/xdrv_60_shift595.ino index 27200d52f..cf9a3868c 100644 --- a/tasmota/xdrv_60_shift595.ino +++ b/tasmota/xdrv_60_shift595.ino @@ -24,60 +24,64 @@ const char kShift595Commands[] PROGMEM = "|" D_CMND_SHIFT595_DEVICE_COUNT ; void (* const Shift595Command[])(void) PROGMEM = { &CmndShift595Devices }; struct Shift595 { - int8_t pinSRCLK; - int8_t pinRCLK; - int8_t pinSER; - int8_t pinOE; - int8_t outputs; - int8_t first = TasmotaGlobal.devices_present; + uint8_t pinSRCLK; + uint8_t pinRCLK; + uint8_t pinSER; + uint8_t pinOE; + uint8_t outputs; + uint8_t first; bool connected = false; -} Shift595; +} *Shift595 = nullptr; + +void Shift595ConfigurePin(uint8_t pin, uint8_t value = 0){ + pinMode(pin, OUTPUT); + digitalWrite(pin, value); +} void Shift595Init(void) { if (PinUsed(GPIO_SHIFT595_SRCLK) && PinUsed(GPIO_SHIFT595_RCLK) && PinUsed(GPIO_SHIFT595_SER)) { - Shift595.pinSRCLK = Pin(GPIO_SHIFT595_SRCLK); - pinMode(Shift595.pinSRCLK, OUTPUT); - digitalWrite(Shift595.pinSRCLK, 0); - - Shift595.pinRCLK = Pin(GPIO_SHIFT595_RCLK); - pinMode(Shift595.pinRCLK, OUTPUT); - digitalWrite(Shift595.pinRCLK, 0); + Shift595 = (struct Shift595*)calloc(1, sizeof(struct Shift595)); - Shift595.pinSER = Pin(GPIO_SHIFT595_SER); - pinMode(Shift595.pinSER, OUTPUT); - digitalWrite(Shift595.pinSER, 0); + Shift595->pinSRCLK = Pin(GPIO_SHIFT595_SRCLK); + Shift595->pinRCLK = Pin(GPIO_SHIFT595_RCLK); + Shift595->pinSER = Pin(GPIO_SHIFT595_SER); + + Shift595ConfigurePin(Shift595->pinSRCLK); + Shift595ConfigurePin(Shift595->pinRCLK); + Shift595ConfigurePin(Shift595->pinSER); if (PinUsed(GPIO_SHIFT595_OE)) { - Shift595.pinOE = Pin(GPIO_SHIFT595_OE); - pinMode(Shift595.pinOE, OUTPUT); - digitalWrite(Shift595.pinOE, 1); + Shift595->pinOE = Pin(GPIO_SHIFT595_OE); + Shift595ConfigurePin(Shift595->pinOE, 1); } - Shift595.outputs = Settings->shift595_device_count * 8; - TasmotaGlobal.devices_present += Shift595.outputs; - Shift595.connected = true; - AddLog(LOG_LEVEL_DEBUG, PSTR("595: Controlling relays POWER%d to POWER%d"), Shift595.first + 1, Shift595.first + Shift595.outputs); + + Shift595->first = TasmotaGlobal.devices_present; + Shift595->outputs = Settings->shift595_device_count * 8; + TasmotaGlobal.devices_present += Shift595->outputs; + Shift595->connected = true; + AddLog(LOG_LEVEL_DEBUG, PSTR("595: Controlling relays POWER%d to POWER%d"), Shift595->first + 1, Shift595->first + Shift595->outputs); } } -void Shift595LatchPin(uint8 pin) { +void Shift595LatchPin(uint8_t pin) { digitalWrite(pin, 1); digitalWrite(pin, 0); } void Shift595SwitchRelay(void) { - if (Shift595.connected == true) { - for (uint32_t i = 0; i < Shift595.outputs; i++) { - uint8_t relay_state = bitRead(XdrvMailbox.index, Shift595.first + Shift595.outputs -1 -i); - digitalWrite(Shift595.pinSER, Settings->flag5.shift595_invert_outputs ? !relay_state : relay_state); - Shift595LatchPin(Shift595.pinSRCLK); + if (Shift595 && Shift595->connected == true) { + for (uint32_t i = 0; i < Shift595->outputs; i++) { + uint8_t relay_state = bitRead(XdrvMailbox.index, Shift595->first + Shift595->outputs -1 -i); + digitalWrite(Shift595->pinSER, Settings->flag5.shift595_invert_outputs ? !relay_state : relay_state); + Shift595LatchPin(Shift595->pinSRCLK); } - Shift595LatchPin(Shift595.pinRCLK); + Shift595LatchPin(Shift595->pinRCLK); if (PinUsed(GPIO_SHIFT595_OE)) { - digitalWrite(Shift595.pinOE, 0); + digitalWrite(Shift595->pinOE, 0); } } } @@ -97,17 +101,19 @@ void CmndShift595Devices(void) { bool Xdrv60(uint8_t function) { bool result = false; - switch (function) { - case FUNC_PRE_INIT: - Shift595Init(); - break; - case FUNC_SET_POWER: - Shift595SwitchRelay(); - break; - case FUNC_COMMAND: - result = DecodeCommand(kShift595Commands, Shift595Command); - break; - } + + if (FUNC_PRE_INIT == function) { + Shift595Init(); + } else if (Shift595) { + switch (function) { + case FUNC_SET_POWER: + Shift595SwitchRelay(); + break; + case FUNC_COMMAND: + result = DecodeCommand(kShift595Commands, Shift595Command); + break; + } + } return result; }