st-anything/lib/SmartThings/SmartThingsThingShield.h

213 lines
10 KiB
C
Raw Normal View History

2023-03-11 14:11:03 +00:00
//*******************************************************************************
/// @file
/// @brief
/// SmartThingsThingShield Arduino Library
/// @section License
/// (C) Copyright 2013 Physical Graph
///
/// Updates by Daniel Ogorchock 12/30/2014 - Arduino Mega 2560 HW Serial support
/// -Numerous performance and size optimizations (helpful on UNO with only 2K SRAM)
/// -Arduino UNO should use the SoftwareSerial library Constructor since the UNO has
/// only one Hardware UART port ("Serial") which is used by the USB port for
/// programming and debugging typically. UNO can use the Hardware "Serial"
/// if desired, but USB programming and debug will be troublesome.
/// Leonardo and Mega can use SoftwareSerial BUT cannot use Pin3 for Rx - use
/// Pin10 for Rx and add jumper from Pin10 to Pin3.
/// -Arduino LEONARDO should use the Hardware Serial Constructor since it has 1 UART
/// separate from the USB port. "Serial1" port uses pins 0(Rx) and 1(Tx).
/// -Arduino MEGA should use the Hardware Serial Constructor since it has 4 UARTs.
/// "Serial3" port uses pins 14(Tx) and 15(Rx). Wire Pin14 to Pin2 and Pin15 to Pin3.
/// -Be certain to not use Pins 2 & 3 in your Arduino sketch for I/O since they are
/// electrically connected to the ThingShield if set to D2/D3.
/// -Note - Pin6 is reserved by the ThingShield as well. Best to avoid using it.
/// -The SoftwareSerial library has the following known limitations:
/// - If using multiple software serial ports, only one can receive data at a time.
/// - Not all pins on the Mega and Mega 2560 support change interrupts, so only
/// the following can be used for RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53,
/// A8(62), A9(63), A10(64), A11(65), A12(66), A13(67), A14(68), A15(69).
/// - Not all pins on the Leonardo and Micro support change interrupts, so only
/// the following can be used for RX : 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
/// -2016-06-04 Dan Ogorchock Added improved support for Arduino Leonardo
/// -2017-02-04 Dan Ogorchock Modified to be a subclass of new SmartThings base class
/// -2017-02-08 Dan Ogorchock Cleaned up. Now uses HardwareSerial* objects directly.
/// -2017-08-14 Dan Ogorchock Disabled SoftwareSerial support if compiling ESP32 board
//*******************************************************************************
#ifndef __SMARTTHINGS_THINGSHIELD_H__
#define __SMARTTHINGS_THINGSHIELD_H__
#include "SmartThings.h"
//*******************************************************************************
#define BOARD_TYPE_UNO 0
#define BOARD_TYPE_LEONARDO 1
#define BOARD_TYPE_MEGA 2
//*******************************************************************************
#include <inttypes.h>
//*******************************************************************************
// Set the correct board type automatically
//*******************************************************************************
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__)
#define BOARD_TYPE BOARD_TYPE_UNO
//#define DISABLE_SOFTWARESERIAL // uncomment to disable SoftwareSerial to save some program space if neccessary while using HW Serial
#elif defined(__AVR_ATmega32U4__)
#define BOARD_TYPE BOARD_TYPE_LEONARDO
#define DISABLE_SOFTWARESERIAL //Assume HW Serial is being used. Saves some program space while using HW Serial
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define BOARD_TYPE BOARD_TYPE_MEGA
#define DISABLE_SOFTWARESERIAL //Assume HW Serial is being used. Saves some program space while using HW Serial
#elif defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_ESP32)
#define DISABLE_SOFTWARESERIAL //The SAMD chip (e.g. MKR1000) and ESP32 do not support SoftwareSerial
#else //assume user is using an UNO for the unknown case
#define BOARD_TYPE BOARD_TYPE_UNO
//#define DISABLE_SOFTWARESERIAL // uncomment to disable SoftwareSerial to save some program space if neccessary while using HW Serial
#endif
#ifndef DISABLE_SOFTWARESERIAL
#include <SoftwareSerial.h>
#endif
//*******************************************************************************
#define SMARTTHINGS_RX_BUFFER_SIZE 256 // if > 255: change _nBufRX to u16
#define SMARTTHINGS_SHIELDTYPE_SIZE 32 // if > 255: change _shieldTypeLen to u16
namespace st
{
//*******************************************************************************
/// @brief ZigBee Network State Definition
//*******************************************************************************
typedef enum
{
STATE_NO_NETWORK,
STATE_JOINING,
STATE_JOINED,
STATE_JOINED_NOPARENT,
STATE_LEAVING,
STATE_UNKNOWN
} SmartThingsNetworkState_t;
//*******************************************************************************
class SmartThingsThingShield: public SmartThings
{
private:
#ifndef DISABLE_SOFTWARESERIAL
SoftwareSerial* _mySerial;
#else
HardwareSerial* _mySerial;
#endif
//SmartThingsSerialType_t _SerialPort;
uint32_t _lastPingMS;
uint32_t _lastShieldMS;
SmartThingsNetworkState_t _networkState;
uint8_t _eui64[8];
uint16_t _nodeID;
uint8_t _pBufRX[SMARTTHINGS_RX_BUFFER_SIZE];
uint_fast8_t _nBufRX;
void _shieldGetNetworkInfo(void);
void _process(void);
void debugPrintBuffer(String prefix, uint8_t * pBuf, uint_fast8_t nBuf);
bool isRxLine(uint8_t * pLine);
bool isAsciiHex(uint8_t ascii);
uint8_t asciiToHexU8(uint8_t pAscii[2]);
uint_fast8_t translatePayload(uint8_t *pBuf, uint_fast8_t nBuf);
void handleLine(void);
public:
//*******************************************************************************
/// @brief SmartThings SoftwareSerial Constructor
/// @param[in] pinRX - Receive Pin for the SoftwareSerial Port to the Arduino
/// @param[in] pinTX - Transmit Pin for the SoftwareSerial Port to the Arduino
/// @param[in] callout - Set the Callout Function that is called on Msg Reception
/// @param[in] shieldType (optional) - Set the Reported SheildType to the Server
/// @param[in] enableDebug (optional) - Enable internal Library debug
//*******************************************************************************
#ifndef DISABLE_SOFTWARESERIAL
SmartThingsThingShield(uint8_t pinRX, uint8_t pinTX, SmartThingsCallout_t *callout, String shieldType = "ThingShield", bool enableDebug = false, int transmitInterval = 1000);
#else
//*******************************************************************************
/// @brief SmartThings HardwareSerial Constructor
/// @param[in] hwSerialPort - HardwareSerial Port of the Arduino (i.e. &Serial, &Serial1, &Serial2, &Serial3)
/// @param[in] callout - Set the Callout Function that is called on Msg Reception
/// @param[in] shieldType (optional) - Set the Reported SheildType to the Server
/// @param[in] enableDebug (optional) - Enable internal Library debug
//*******************************************************************************
SmartThingsThingShield(HardwareSerial* hwSerialPort, SmartThingsCallout_t *callout, String shieldType = "ThingShield", bool enableDebug = false, int transmitInterval = 1000);
#endif
//*******************************************************************************
/// @brief Destructor
//*******************************************************************************
virtual ~SmartThingsThingShield();
//*******************************************************************************
/// @brief Initialize SmartThings Library
//*******************************************************************************
virtual void init(void);
//*******************************************************************************
/// @brief Run SmartThings Library
//*******************************************************************************
virtual void run(void);
//*******************************************************************************
/// @brief Send Message out over ZigBee to the Hub
/// @param[in] message to send
//*******************************************************************************
virtual void send(String message);
//*******************************************************************************
/// @brief Set SmartThings Shield MultiColor LED
/// @param[in] red: intensity {0=off to 9=max}
/// @param[in] green: intensity {0=off to 9=max}
/// @param[in] blue: intensity {0=off to 9=max}
//*******************************************************************************
void shieldSetLED(uint8_t red, uint8_t green, uint8_t blue);
//*******************************************************************************
/// @brief Get Last Read Shield State
/// @return Last Read Network State
//*******************************************************************************
SmartThingsNetworkState_t shieldGetLastNetworkState(void);
//*******************************************************************************
/// @brief Get Last Read Shield State and Trigger Refresh of Network Info
/// @return Last Read Network State
//*******************************************************************************
SmartThingsNetworkState_t shieldGetNetworkState(void);
//*******************************************************************************
/// @brief Get Last Read NodeID and Trigger Refresh of Network Info
/// @return Last Read NodeID
//*******************************************************************************
uint16_t shieldGetNodeID(void);
//*******************************************************************************
/// @brief Get Last Read EUI64 and Trigger Refresh of Network Info
/// @return Last Read EUI64
//*******************************************************************************
void shieldGetEUI64(uint8_t eui[8]);
//*******************************************************************************
/// @brief Find and Join a Network
//*******************************************************************************
void shieldFindNetwork(void);
//*******************************************************************************
/// @brief Leave the Current ZigBee Network
//*******************************************************************************
void shieldLeaveNetwork(void);
//*******************************************************************************
// Update the network State/LED
//*******************************************************************************
void updateNetworkState(void); //get the current zigbee network status of the ST Shield
};
}
#endif