From 3522ae5bc90b9d74d68b13e80a3d69ab3fe73fb1 Mon Sep 17 00:00:00 2001
From: Adhidarma Hadiwinoto <me@adhisimon.org>
Date: Wed, 4 Sep 2019 10:53:40 +0700
Subject: [PATCH] MODEM-INFO: stuck detector

---
 config.sample.json        |  8 ++++++--
 lib/modem-commands.js     |  1 +
 lib/modem-info.js         | 18 +++++++++++++++++-
 lib/serialport-parsers.js |  1 +
 4 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/config.sample.json b/config.sample.json
index cd222b5..83ccb90 100644
--- a/config.sample.json
+++ b/config.sample.json
@@ -1,15 +1,17 @@
 {
-    "name": "SMS0",
+    "name": "USB0",
     "modem": {
         "device": "/dev/ttyUSB0",
         "options": {
             "baudRate": 115200
         }
     },
+    
     "report_url": {
         "incoming_sms": "http://localhost:16481/apikey/PLEASE_CHANGE_ME/on-sms",
         "register_modem": "http://localhost:16481/apikey/PLEASE_CHANGE_ME/modems/set"
     },
+    
     "http_command_server": {
         "apikey": "PLEASE_CHANGE_ME",
         "listen_port": "2110"
@@ -17,5 +19,7 @@
     
     "interval_beetwen_signal_strength_ms": 30000,
     "sleep_after_send_sms_ms": 2000,
-    "disable_delete_inbox_on_startup": false
+    "disable_delete_inbox_on_startup": false,
+    "disable_idle_check": false,
+    "max_last_data_age_ms": 120000
 }
\ No newline at end of file
diff --git a/lib/modem-commands.js b/lib/modem-commands.js
index 7553562..6fde986 100644
--- a/lib/modem-commands.js
+++ b/lib/modem-commands.js
@@ -13,6 +13,7 @@ let port;
 
 function writeToPort(data) {
     return new Promise((resolve) => {
+        modemInfo.lastWriteTs = new Date();
         port.write(data, (err, bytesWritten) => {
             if (err) logger.warn(`ERROR: ${err.toString()}`);
 
diff --git a/lib/modem-info.js b/lib/modem-info.js
index 5583d04..6a087ec 100644
--- a/lib/modem-info.js
+++ b/lib/modem-info.js
@@ -1,4 +1,8 @@
+const MAX_LAST_DATA_AGE_MS = 2 * 60 * 1000;
+const INTERVAL_BETWEEN_IDLE_CHECK_MS = 30 * 1000;
+
 const config = require('komodo-sdk/config');
+const logger = require('komodo-sdk/logger');
 
 const modemInfo = {
     device: config.modem.device,
@@ -6,13 +10,25 @@ const modemInfo = {
     model: null,
     imei: null,
     imsi: null,
-    msisdn: null,
     cops: null,
     networkId: null,
     networkName: null,
     signalStrength: null,
     signalStrengthTs: null,
     signalStrengthTsReadable: null,
+    startTime: new Date(),
+    lastWriteTs: null,
+    lastReadTs: null,
 };
 
+if (!config.disable_idle_check) {
+    setInterval(() => {
+        const deltaMs = new Date() - Math.max(modemInfo.lastWriteTs, modemInfo.startTime);
+        if (deltaMs >= (config.max_last_data_age_ms || MAX_LAST_DATA_AGE_MS)) {
+            logger.warn(`Modem idle for ${deltaMs} ms. Modem stucked? Terminating!`);
+            process.exit(1);
+        }
+    }, INTERVAL_BETWEEN_IDLE_CHECK_MS);
+}
+
 module.exports = modemInfo;
diff --git a/lib/serialport-parsers.js b/lib/serialport-parsers.js
index 8c8ed7d..9c6b39b 100644
--- a/lib/serialport-parsers.js
+++ b/lib/serialport-parsers.js
@@ -106,6 +106,7 @@ function isResultCodeIs(data, resultCode) {
 
 const parserReadline = new ParserReadline({ delimiter: PARSER_READLINE_DELIMITER });
 parserReadline.on('data', (data) => {
+    modemInfo.lastReadTs = new Date();
     logger.verbose('INCOMING', { data: `${data.toString()}${PARSER_READLINE_DELIMITER}`, parser: 'parserReadLine' });
 
     if (!data) return;
-- 
1.9.0