diff --git a/src/driver/nbiot.be b/src/driver/nbiot.be index b710b53f27a196c1f5f7d61ec613130688b3e954..1cfe03078ad2e653fb6cb9eca4902b39f27af956 100644 --- a/src/driver/nbiot.be +++ b/src/driver/nbiot.be @@ -124,13 +124,15 @@ class NBIoTCommand var cmd var rsp var retries - var done def init(cmd, rsp, retries) self.cmd = cmd self.rsp = rsp self.retries = retries - self.done = false + + if self.retries == nil + self.retries = 0 + end end end @@ -251,27 +253,63 @@ end class NBIoTResetProcedure : NBIoTProcedure var cmd_reset + var cmd_at def init(ser) super(self).init(ser) - self.cmd_reset = NBIoTCommand('AT+QRST=1\r\n', 'RDY', 0) + self.cmd_reset = NBIoTCommand('AT+QRST=1\r\n', 'RDY') + self.cmd_at = NBIoTCommand('AT\r\n', 'OK') end def execute() if self.cmd_in_process == nil self.cmd_in_process = self.cmd_reset + elif self.cmd_in_process == self.cmd_reset + if self.read_rsp_contains_expected_rsp_or_send() + self.cmd_in_process = self.cmd_at + end + elif self.cmd_in_process == self.cmd_at + self.done = self.read_rsp_contains_expected_rsp_or_send() end + end +end - self.done = self.read_rsp_contains_expected_rsp_or_send() +class NBIoTDisablePSMProcedure : NBIoTProcedure + var cmd_register + var cmd_disable_psm + var cmd_disable_sleep + + def init(ser) + super(self).init(ser) + + self.cmd_register = NBIoTCommand('AT+CEREG=1\r\n', 'OK') + self.cmd_disable_psm = NBIoTCommand('AT+CPSMS=0\r\n', 'OK') + self.cmd_disable_sleep = NBIoTCommand('AT+QSCLK=0\r\n', 'OK') + end + + def execute() + if self.cmd_in_process == nil + self.cmd_in_process = self.cmd_register + elif self.cmd_in_process == self.cmd_register + if self.read_rsp_contains_expected_rsp_or_send() + self.cmd_in_process = self.cmd_disable_psm + end + elif self.cmd_in_process == self.cmd_disable_psm + if self.read_rsp_contains_expected_rsp_or_send() + self.cmd_in_process = self.cmd_disable_sleep + end + elif self.cmd_in_process == self.cmd_disable_sleep + self.done = self.read_rsp_contains_expected_rsp_or_send() + end end end class NBIoTNTPProcedure : NBIoTProcedure var cmd_ntp - def init(ser) - super(self).init(ser) + def init(ser, request) + super(self).init(ser, request) self.cmd_ntp = NBIoTCommand('AT+QNTP=1,\"0.at.pool.ntp.org\"\r\n', '+QNTP: 0', 10) end @@ -312,10 +350,12 @@ end # ------------------------------------------------------- # class NBIoTDriverState - static var IDLE = 0 - static var RESET = 1 - static var READY = 2 - static var BUSY = 3 + static var INIT = 0 + static var IDLE = 1 + static var RESET = 2 + static var DISABLE_PSM = 3 + static var READY = 4 + static var BUSY = 5 end # ------------------------------------------------------- # @@ -333,7 +373,7 @@ class NBIoTDriver self.ser = serial(rx, tx, 115200, serial.SERIAL_8N1) self.psm_eint = psm_eint - self.state = NBIoTDriverState.RESET + self.state = NBIoTDriverState.INIT self.request_queue = [] self.procedure = nil end @@ -360,9 +400,16 @@ class NBIoTDriver self.state = state end + def set_psm_pin(value) + gpio.digital_write(self.psm_eint, value) + end + def every_second() if self.state == NBIoTDriverState.IDLE return + elif self.state == NBIoTDriverState.INIT + self.set_psm_pin(1) + self.next_state(NBIoTDriverState.RESET) elif self.state == NBIoTDriverState.RESET if self.procedure == nil self.init_procedure(NBIoTResetProcedure(self.ser)) @@ -371,6 +418,18 @@ class NBIoTDriver self.procedure.execute() if self.procedure.is_done() + self.finish_procedure() + self.next_state(NBIoTDriverState.DISABLE_PSM) + end + elif self.state == NBIoTDriverState.DISABLE_PSM + if self.procedure == nil + self.init_procedure(NBIoTDisablePSMProcedure(self.ser)) + end + + self.procedure.execute() + + if self.procedure.is_done() + self.finish_procedure() self.next_state(NBIoTDriverState.READY) end elif self.state == NBIoTDriverState.READY @@ -383,7 +442,7 @@ class NBIoTDriver if request.request_type == NBIoTRequestType.DEBUG procedure = NBIoTDebugProcedure(self.ser, request) elif request.request_type == NBIoTRequestType.NTP - procedure = NBIoTNTPProcedure(self.ser) + procedure = NBIoTNTPProcedure(self.ser, request) elif tasmota.log(string.format('NBT: Request with type %i not supported, discarding request', request.request_type), 2) end @@ -478,6 +537,10 @@ nbiot.init = def (m) end def debug_send(cmd, rsp, retries) + if retries == nil + retries = 0 + end + var request = NBIoTDebugRequest(cmd, rsp, retries) self._driver.queue_request(request)