BLE_iBeacon / serial.h /
772169e a year ago
1 contributor
118 lines | 3.787kb
#ifndef _SERIAL_H
#define _SERIAL_H

#include "beacon.h"

#define SERIAL_MAX_LINES 32
void serialHelp() {
  Serial.println("Available commands: ");
  Serial.println("- help: Display this screen");
  Serial.println("- beacon: Display beacon details");
  Serial.println("- type X: Set type of Beacon");
  Serial.println("- num aabb: Set the Beacon number in HEX padded to 2bytes");
  Serial.println("- reset: Reset the board");
}

void serialBeacon() {
  String serialOut = "{\"command\": \"beacon\", \"status\": { ";
  serialOut += "\"appName\": \""+String(APPNAME)+"\", ";
  serialOut += "\"appVersion\": \""+String(APPVER)+"\", ";
  serialOut += "\"mac\": \""+String(macStr)+"\", ";
  serialOut += "\"instance\": \""+String(instanceStr)+"\", ";
  serialOut += "\"count\": \""+String(beacon_count)+"\", ";
  serialOut += "\"type\": \""+beaconTypeStr+"\"";
  serialOut += "}";
  serialOut += "}";
  Serial.println(serialOut);
}

void serialReset() {
  Serial.println("");
  Serial.println("");
  Serial.println("");
  Serial.println("{\"command\": \"reset\", \"status\": \"ok\" }");
  ESP.restart();
}

void serialNum(char *buf) {
  int len = strlen(buf);
  char newNum[5]="";
  strncpy(newNum,buf+4,4);
  newNum[4] =0x0;
  String newNumStr = "";
  newNumStr += newNum;
  Serial.println(newNumStr);
  uint16_t newNumDW = strtoul(newNum,NULL,16);
  EEPROM.write(1, (uint8_t)((newNumDW >> 8) & 0xff) );
  EEPROM.write(2, (uint8_t)(newNumDW & 0xff) );
  EEPROM.commit();
  beacon_num[0] = EEPROM.read(1);
  beacon_num[1] = EEPROM.read(2);
  String serialOut = "{\"command\": \"num\", \"status\": { ";
  serialOut += "\"numDec\": \""+String(newNumDW)+"\", ";
  serialOut += "\"numHex\": \""+String(newNum)+"\"";
  serialOut += "}";
  Serial.println(serialOut);
}

void serialType(EN_BEACON_TYPE type) {
  beacon_type = type;
  switch( type ) {
  case EN_BEACON_TYPE_entry:
    beaconTypeStr="Entry     ";
    break;
  case EN_BEACON_TYPE_hazard:
    beaconTypeStr="Hazard    ";
    break;
  case EN_BEACON_TYPE_safe:
    beaconTypeStr="Safe       ";
    break;
  case EN_BEACON_TYPE_exit:
    beaconTypeStr="Exit      ";
    break;
  case EN_BEACON_TYPE_other:
    beaconTypeStr="Other     ";
    break;
  default:
    beaconTypeStr="Safe      ";
    break;
  }
  String serialOut = "{\"command\": \"beacon\", \"status\": { ";
  serialOut += "\"type\": \""+String(beaconTypeStr)+"\"";
  serialOut += "}";
  Serial.println(serialOut);
  EEPROM.write(0, beacon_type);
  EEPROM.commit();
}

void pollSerial() {
  if (Serial.available() > 0) {
    char command[SERIAL_MAX_LINES];
    int sizeCommand = Serial.readBytesUntil('\r', command, sizeof(command) / sizeof(char) );
    command[sizeCommand]='\0';
    if(command[sizeCommand-1]=='\n') command[sizeCommand-1]='\0';
    Serial.println("[CMD] received: "+String(command));
    if( 0 == strcmp(command,"help") ) {
      serialHelp();
    } else if( 0 == strcmp(command,"beacon") ) {
      serialBeacon();
    } else if( 0 == strcmp(command,"type 1") ) {
      serialType(EN_BEACON_TYPE_entry);
    } else if( 0 == strcmp(command,"type 2") ) {
      serialType(EN_BEACON_TYPE_exit);
    } else if( 0 == strcmp(command,"type 3") ) {
      serialType(EN_BEACON_TYPE_hazard);
    } else if( 0 == strcmp(command,"type 4") ) {
      serialType(EN_BEACON_TYPE_safe);
    } else if( 0 == strcmp(command,"type 5") ) {
      serialType(EN_BEACON_TYPE_other);
    } else if( 0 == strncmp(command,"num ",4) ) {
      serialNum(command);
    } else if( 0 == strcmp(command,"reset") ) {
      serialReset();
    } else {
      Serial.println("{\"command\": \""+String(command)+"\", \"status\": \"error\" }");
    }
  }
}
#endif //_SERIAL_H