ここでは、時間に関連する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;
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です