diff --git a/vehicle/OVMS.V3/components/simcom/src/simcom_7600.cpp b/vehicle/OVMS.V3/components/simcom/src/simcom_7600.cpp index c2e750c4b..bc26db748 100644 --- a/vehicle/OVMS.V3/components/simcom/src/simcom_7600.cpp +++ b/vehicle/OVMS.V3/components/simcom/src/simcom_7600.cpp @@ -153,11 +153,12 @@ void simcom7600::PowerOff() #endif // #ifdef CONFIG_OVMS_COMP_MAX7317 } -void simcom7600::PowerCycle() +void simcom7600::PowerOn() { - unsigned int psd = 500; // min 100ms typical 500ms - ESP_LOGI(TAG, "Power Cycle (SIM7600) %dms, wait 10s for uart",psd); + unsigned int psd = 500; // min 100ms typical 500ms + ESP_LOGI(TAG, "Power On (SIM7600) %dms",psd); + modemdriver::PowerSleep(false); uart_wait_tx_done(m_modem->m_uartnum, portMAX_DELAY); uart_flush(m_modem->m_uartnum); // Flush the ring buffer, to try to address MUX start issues #ifdef CONFIG_OVMS_COMP_MAX7317 @@ -168,6 +169,14 @@ void simcom7600::PowerCycle() #endif // #ifdef CONFIG_OVMS_COMP_MAX7317 } +void simcom7600::PowerCycle() + { + ESP_LOGI(TAG, "Power Cycle (SIM7600)"); + PowerOff(); + vTaskDelay(15000 / portTICK_PERIOD_MS); // wait 15s for uart shutdown + PowerOn(); + } + bool simcom7600::State1Leave(modem::modem_state1_t oldstate) { return modemdriver::State1Leave(oldstate); @@ -186,12 +195,34 @@ bool simcom7600::State1Enter(modem::modem_state1_t newstate) m_modem->m_state1_timeout_goto = modem::CheckPowerOff; return true; } + if (newstate == modem::PoweringOn) + { + m_modem->ClearNetMetrics(); + MyEvents.SignalEvent("system.modem.poweringon", NULL); + PowerOn(); + m_modem->m_state1_timeout_ticks = 30; + m_modem->m_state1_timeout_goto = modem::PowerOffOn; + return true; + } if (newstate == modem::PoweredOn) { + ++m_powercyclefactor; + m_powercyclefactor = m_powercyclefactor % 2; m_modem->ClearNetMetrics(); MyEvents.SignalEvent("system.modem.poweredon", NULL); - m_modem->m_state1_timeout_ticks = 40; - m_modem->m_state1_timeout_goto = modem::PoweringOn; + m_modem->m_state1_timeout_ticks = 30; + if (m_powercyclefactor == 0) + { m_modem->m_state1_timeout_goto = modem::PowerOffOn; } + else + { m_modem->m_state1_timeout_goto = modem::PoweringOn; } + return true; + } + if (newstate == modem::NetStart) + { + m_powercyclefactor = 0; // assume successful start so reset counter + MyEvents.SignalEvent("system.modem.netstart", NULL); + m_modem->m_state1_timeout_ticks = 60; + m_modem->m_state1_timeout_goto = modem::PowerOffOn; return true; } return modemdriver::State1Enter(newstate); @@ -239,11 +270,13 @@ modem::modem_state1_t simcom7600::State1Ticker1(modem::modem_state1_t curstate) } if (curstate == modem::PoweringOn) - { - // min 11s typical 12s - // for uart to start - if (m_modem->m_state1_ticker > 10) m_modem->tx("AT\r\n"); - } + { + // min 11s typical 12s + // for uart to start + // in addition to power off time + if (m_modem->m_state1_ticker > 10) m_modem->tx("AT\r\n"); + return modem::None; + } return modemdriver::State1Ticker1(curstate); } diff --git a/vehicle/OVMS.V3/components/simcom/src/simcom_7600.h b/vehicle/OVMS.V3/components/simcom/src/simcom_7600.h index be916d118..c320d9ca3 100644 --- a/vehicle/OVMS.V3/components/simcom/src/simcom_7600.h +++ b/vehicle/OVMS.V3/components/simcom/src/simcom_7600.h @@ -55,6 +55,7 @@ class simcom7600 : public modemdriver void PowerCycle(); void PowerOff(); + void PowerOn(); bool State1Leave(modem::modem_state1_t oldstate); bool State1Enter(modem::modem_state1_t newstate); modem::modem_state1_t State1Activity(modem::modem_state1_t curstate);