From 64592c3bb677ab827fed6dc79dfbc62588039c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Tue, 2 Jan 2018 16:49:30 +0100 Subject: [PATCH] fixed the bug, caused by partly inited units trying to de-init pins --- platform/lock_jumper.c | 1 + platform/status_led.c | 8 ++++---- units/digital_in/unit_din.c | 20 +++++++++++--------- units/digital_out/unit_dout.c | 23 +++++++++++++---------- units/neopixel/unit_neopixel.c | 6 ++++-- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/platform/lock_jumper.c b/platform/lock_jumper.c index da09cd6..cd90022 100644 --- a/platform/lock_jumper.c +++ b/platform/lock_jumper.c @@ -91,6 +91,7 @@ void LockJumper_Check(void) if (debo_ticks > 0) { if (--debo_ticks == 0) { + dbg("Debo finished, state %d", (int)state); // we've reached a change #if PLAT_LOCK_BTN if (state == true) { diff --git a/platform/status_led.c b/platform/status_led.c index 3eb56d2..4fba0aa 100644 --- a/platform/status_led.c +++ b/platform/status_led.c @@ -106,8 +106,8 @@ void Indicator_Tick(void) else if (active_effect == STATUS_DISK_ATTACHED) { if (effect_time == 0) led_on(); else if (effect_time == 100) led_off(); - else if (effect_time == 200) led_on(); - else if (effect_time == 700) { + else if (effect_time == 250) led_on(); + else if (effect_time == 750) { led_off(); active_effect = STATUS_NONE; } @@ -115,8 +115,8 @@ void Indicator_Tick(void) else if (active_effect == STATUS_DISK_REMOVED) { if (effect_time == 0) led_on(); else if (effect_time == 500) led_off(); - else if (effect_time == 600) led_on(); - else if (effect_time == 700) { + else if (effect_time == 650) led_on(); + else if (effect_time == 750) { led_off(); active_effect = STATUS_NONE; } diff --git a/units/digital_in/unit_din.c b/units/digital_in/unit_din.c index cb3972a..9a862b1 100644 --- a/units/digital_in/unit_din.c +++ b/units/digital_in/unit_din.c @@ -167,15 +167,17 @@ static void DI_deInit(Unit *unit) { struct priv *priv = unit->data; - bool suc = true; - uint16_t mask = 1; - for (int i = 0; i < 16; i++, mask <<= 1) { - if (priv->pins & mask) { - uint32_t ll_pin = pin2ll((uint8_t) i, &suc); - assert_param(suc); // this should never fail if we got this far - - // configure the pin as analog - LL_GPIO_SetPinMode(priv->port, ll_pin, LL_GPIO_MODE_ANALOG); + if (unit->status == E_SUCCESS) { + bool suc = true; + uint16_t mask = 1; + for (int i = 0; i < 16; i++, mask <<= 1) { + if (priv->pins & mask) { + uint32_t ll_pin = pin2ll((uint8_t) i, &suc); + assert_param(suc); // this should never fail if we got this far + + // configure the pin as analog + LL_GPIO_SetPinMode(priv->port, ll_pin, LL_GPIO_MODE_ANALOG); + } } } diff --git a/units/digital_out/unit_dout.c b/units/digital_out/unit_dout.c index a331c28..5d01d63 100644 --- a/units/digital_out/unit_dout.c +++ b/units/digital_out/unit_dout.c @@ -156,16 +156,19 @@ static void DO_deInit(Unit *unit) { struct priv *priv = unit->data; - bool suc = true; - uint16_t mask = 1; - for (int i = 0; i < 16; i++, mask <<= 1) { - if (priv->pins & mask) { - - uint32_t ll_pin = pin2ll((uint8_t) i, &suc); - assert_param(suc); // this should never fail if we got this far - - // configure the pin as analog - LL_GPIO_SetPinMode(priv->port, ll_pin, LL_GPIO_MODE_ANALOG); + // de-init the pins only if inited correctly + if (unit->status == E_SUCCESS) { + bool suc = true; + uint16_t mask = 1; + for (int i = 0; i < 16; i++, mask <<= 1) { + if (priv->pins & mask) { + + uint32_t ll_pin = pin2ll((uint8_t) i, &suc); + assert_param(suc); // this should never fail if we got this far + + // configure the pin as analog + LL_GPIO_SetPinMode(priv->port, ll_pin, LL_GPIO_MODE_ANALOG); + } } } diff --git a/units/neopixel/unit_neopixel.c b/units/neopixel/unit_neopixel.c index a6ce3b2..58320b7 100644 --- a/units/neopixel/unit_neopixel.c +++ b/units/neopixel/unit_neopixel.c @@ -125,8 +125,10 @@ static void Npx_deInit(Unit *unit) { struct priv *priv = unit->data; - // configure the pin as analog - LL_GPIO_SetPinMode(priv->port, priv->ll_pin, LL_GPIO_MODE_ANALOG); + if (unit->status == E_SUCCESS) { + // configure the pin as analog + LL_GPIO_SetPinMode(priv->port, priv->ll_pin, LL_GPIO_MODE_ANALOG); + } // Release all resources rsc_teardown(unit);