ここでは、時間に関連する2つの関数を説明する。
まずは、定期的な作業のベースとなるタイマー割込みで、100msec間隔とした。この割込みの設定に関しては、セットアップの事項で説明する。タイマー割込みの役割は2つあり、ウェッブページ更新と1秒経過のフラグ設定である。ウェブページ更新は、センサデバイスに指示したインターバル値と関連している。
次はタイムアウト処理で、対象となるのは接続中のセンサデバイスである。インターバルは最大1秒に設定したので、センサ情報の受信が3秒間途絶えた場合に、デバイスは切断されたと判断している。
// 基本割込みサービスルーチン(100msec間隔)
void IRAM_ATTR baseInterrupt() {
static int web = 0, sec = 0;
// ウェブブラウザ定期配信フラグ設定(インターバル or 起動経過時間1秒間隔更新)
web++;
if (web >= intervalBase || web == 10) {
webFlag = true;
web = 0;
}
// 1秒経過フラグ設定
sec++;
if (sec == 10) {
oneSecFlag = true;
sec = 0;
}
}
// タイムアウト・センサデバイス切断
bool timeoutDisconnect() {
bool timeout = false;
for (uint8_t num = 0; num < CLIENT_MAX; num++) {
// 接続センサデバイス確認(ウェブブラウザ除く)
if (clientSTAT.Connect[num] != 0 && clientSTAT.Station[num] == 2) {
clientSTAT.TimeOut[num]++;
// 接続センサデバイスの応答確認
if (clientSTAT.TimeOut[num] > timeoutMAX) {
clientSTAT.Connect[num] = 0;
IPAddress ip = webSocket.remoteIP(num);
Serial.printf("[%u] Timeout Disconnected %d.%d.%d.%d\n", num, ip[0], ip[1], ip[2], ip[3]);
webSocket.disconnect(num); // 強制切断
timeout = true;
}
}
}
return timeout;
}