/**
|
|
* @file TinyGsmCommon.h
|
|
* @author Volodymyr Shymanskyy
|
|
* @license LGPL-3.0
|
|
* @copyright Copyright (c) 2016 Volodymyr Shymanskyy
|
|
* @date Nov 2016
|
|
*/
|
|
|
|
#ifndef SRC_TINYGSMCOMMON_H_
|
|
#define SRC_TINYGSMCOMMON_H_
|
|
|
|
// The current library version number
|
|
#define TINYGSM_VERSION "0.11.5"
|
|
|
|
#if defined(SPARK) || defined(PARTICLE)
|
|
#include "Particle.h"
|
|
#elif defined(ARDUINO)
|
|
#if ARDUINO >= 100
|
|
#include "Arduino.h"
|
|
#else
|
|
#include "WProgram.h"
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(ARDUINO_DASH)
|
|
#include <ArduinoCompat/Client.h>
|
|
#else
|
|
#include <Client.h>
|
|
#endif
|
|
|
|
#ifndef TINY_GSM_YIELD_MS
|
|
#define TINY_GSM_YIELD_MS 0
|
|
#endif
|
|
|
|
#ifndef TINY_GSM_YIELD
|
|
#define TINY_GSM_YIELD() \
|
|
{ delay(TINY_GSM_YIELD_MS); }
|
|
#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__) && !defined(__AVR_ATmega4809__)
|
|
#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_PLAIN(T last) {
|
|
TINY_GSM_DEBUG.println(last);
|
|
}
|
|
|
|
template <typename T, typename... Args>
|
|
static void DBG_PLAIN(T head, Args... tail) {
|
|
TINY_GSM_DEBUG.print(head);
|
|
TINY_GSM_DEBUG.print(' ');
|
|
DBG_PLAIN(tail...);
|
|
}
|
|
|
|
template <typename... Args>
|
|
static void DBG(Args... args) {
|
|
TINY_GSM_DEBUG.print(GF("["));
|
|
TINY_GSM_DEBUG.print(millis());
|
|
TINY_GSM_DEBUG.print(GF("] "));
|
|
DBG_PLAIN(args...);
|
|
}
|
|
} // namespace
|
|
#else
|
|
#define DBG_PLAIN(...)
|
|
#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, uint32_t minimum = 9600,
|
|
uint32_t maximum = 115200) {
|
|
static uint32_t rates[] = {115200, 57600, 38400, 19200, 9600, 74400, 74880,
|
|
230400, 460800, 2400, 4800, 14400, 28800};
|
|
|
|
for (uint8_t i = 0; i < sizeof(rates) / sizeof(rates[0]); i++) {
|
|
uint32_t rate = rates[i];
|
|
if (rate < minimum || rate > maximum) continue;
|
|
|
|
DBG("Trying baud rate", rate, "...");
|
|
SerialAT.begin(rate);
|
|
delay(10);
|
|
for (int j = 0; j < 10; j++) {
|
|
SerialAT.print("AT\r\n");
|
|
String input = SerialAT.readString();
|
|
if (input.indexOf("OK") >= 0) {
|
|
DBG("Modem responded at rate", rate);
|
|
return rate;
|
|
}
|
|
}
|
|
}
|
|
SerialAT.begin(minimum);
|
|
return 0;
|
|
}
|
|
|
|
#endif // SRC_TINYGSMCOMMON_H_
|