/**
|
|
* @file TinyGsmCommon.h
|
|
* @author Volodymyr Shymanskyy
|
|
* @license LGPL-3.0
|
|
* @copyright Copyright (c) 2016 Volodymyr Shymanskyy
|
|
* @date Nov 2016
|
|
*/
|
|
|
|
#ifndef TinyGsmCommon_h
|
|
#define TinyGsmCommon_h
|
|
|
|
#if defined(SPARK) || defined(PARTICLE)
|
|
#include "Particle.h"
|
|
#elif defined(ARDUINO)
|
|
#if ARDUINO >= 100
|
|
#include "Arduino.h"
|
|
#else
|
|
#include "WProgram.h"
|
|
#endif
|
|
#endif
|
|
|
|
#include <Client.h>
|
|
#include <TinyGsmFifo.h>
|
|
|
|
#ifndef TINY_GSM_YIELD
|
|
#define TINY_GSM_YIELD() { delay(0); }
|
|
#endif
|
|
|
|
#define TINY_GSM_ATTR_NOT_AVAILABLE __attribute__((error("Not available on this modem type")))
|
|
#define TINY_GSM_ATTR_NOT_IMPLEMENTED __attribute__((error("Not implemented")))
|
|
|
|
#if defined(__AVR__)
|
|
#define TINY_GSM_PROGMEM PROGMEM
|
|
typedef const __FlashStringHelper* GsmConstStr;
|
|
#define GFP(x) (reinterpret_cast<GsmConstStr>(x))
|
|
#define GF(x) F(x)
|
|
#else
|
|
#define TINY_GSM_PROGMEM
|
|
typedef const char* GsmConstStr;
|
|
#define GFP(x) x
|
|
#define GF(x) x
|
|
#endif
|
|
|
|
#ifdef TINY_GSM_DEBUG
|
|
namespace {
|
|
template<typename T>
|
|
static void DBG(T last) {
|
|
TINY_GSM_DEBUG.println(last);
|
|
}
|
|
|
|
template<typename T, typename... Args>
|
|
static void DBG(T head, Args... tail) {
|
|
TINY_GSM_DEBUG.print(head);
|
|
TINY_GSM_DEBUG.print(' ');
|
|
DBG(tail...);
|
|
}
|
|
}
|
|
#else
|
|
#define DBG(...)
|
|
#endif
|
|
|
|
template<class T>
|
|
const T& TinyGsmMin(const T& a, const T& b)
|
|
{
|
|
return (b < a) ? b : a;
|
|
}
|
|
|
|
template<class T>
|
|
const T& TinyGsmMax(const T& a, const T& b)
|
|
{
|
|
return (b < a) ? a : b;
|
|
}
|
|
|
|
template<class T>
|
|
uint32_t TinyGsmAutoBaud(T& SerialAT)
|
|
{
|
|
static uint32_t rates[] = { 115200, 57600, 38400, 19200, 9600, 74400, 74880, 230400, 460800, 2400, 4800, 14400, 28800 };
|
|
|
|
for (unsigned i = 0; i < sizeof(rates)/sizeof(rates[0]); i++) {
|
|
uint32_t rate = rates[i];
|
|
DBG("Trying baud rate", rate, "...");
|
|
SerialAT.begin(rate);
|
|
delay(10);
|
|
for (int i=0; i<3; i++) {
|
|
SerialAT.print("AT\r\n");
|
|
String input = SerialAT.readString();
|
|
if (input.indexOf("OK") >= 0) {
|
|
DBG("Modem responded at rate", rate);
|
|
return rate;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
IPAddress TinyGsmIpFromString(const String& strIP) {
|
|
int Parts[4] = {0,0,0,0};
|
|
int Part = 0;
|
|
for (uint8_t i=0; i<strIP.length(); i++) {
|
|
char c = strIP[i];
|
|
if (c == '.') {
|
|
Part++;
|
|
continue;
|
|
}
|
|
Parts[Part] *= 10;
|
|
Parts[Part] += c - '0';
|
|
}
|
|
return IPAddress(Parts[0], Parts[1], Parts[2], Parts[3]);
|
|
}
|
|
|
|
#endif
|