Supports ArduinoJson V6. Issue #47
parent
2c0207fb40
commit
e790a0f4ac
@ -0,0 +1,416 @@ |
||||
/**
|
||||
* Implementation of template functions of AutoConnect and AutoConnectAux.
|
||||
* This implementation instantiates completely the void AutoConnectElement |
||||
* as each type and also absorbs interface differences due to ArduinoJson |
||||
* version differences.
|
||||
* @file AutoConnectAuxImpl.h |
||||
* @author hieromon@gmail.com |
||||
* @version 0.9.8 |
||||
* @date 2019-03-21 |
||||
* @copyright MIT license. |
||||
*/ |
||||
|
||||
#ifndef _AUTOCONNECTAUXIMPL_H_ |
||||
#define _AUTOCONNECTAUXIMPL_H_ |
||||
|
||||
#include "AutoConnectDefs.h" |
||||
|
||||
#ifndef AUTOCONNECT_USE_JSON |
||||
|
||||
/**
|
||||
* Get AutoConnectElementBasis element. |
||||
* @param name an element name. |
||||
* @return A reference of AutoConnectElement class. |
||||
*/ |
||||
template<> |
||||
AutoConnectElementBasis& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
return *(reinterpret_cast<AutoConnectElementBasis*>(elm)); |
||||
} |
||||
return reinterpret_cast<AutoConnectElementBasis&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectButtonBasis element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectButton class. |
||||
*/ |
||||
template<> |
||||
AutoConnectButtonBasis& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Button) |
||||
return *(reinterpret_cast<AutoConnectButtonBasis*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectButtonBasis&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectCheckboxBasis element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectCheckbox class. |
||||
*/ |
||||
template<> |
||||
AutoConnectCheckboxBasis& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Checkbox) |
||||
return *(reinterpret_cast<AutoConnectCheckboxBasis*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectCheckboxBasis&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectFileBasis element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectFile class. |
||||
*/ |
||||
template<> |
||||
AutoConnectFileBasis& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_File) |
||||
return *(reinterpret_cast<AutoConnectFileBasis*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectFileBasis&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectInputBasis element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectInput class. |
||||
*/ |
||||
template<> |
||||
AutoConnectInputBasis& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Input) |
||||
return *(reinterpret_cast<AutoConnectInputBasis*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectInputBasis&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectRadioBasis element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectRadio class. |
||||
*/ |
||||
template<> |
||||
AutoConnectRadioBasis& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Radio) |
||||
return *(reinterpret_cast<AutoConnectRadioBasis*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectRadioBasis&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectSelectBasis element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectSelect class. |
||||
*/ |
||||
template<> |
||||
AutoConnectSelectBasis& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Select) |
||||
return *(reinterpret_cast<AutoConnectSelectBasis*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectSelectBasis&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectSubmitBasis element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectSubmit class. |
||||
*/ |
||||
template<> |
||||
AutoConnectSubmitBasis& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Submit) |
||||
return *(reinterpret_cast<AutoConnectSubmitBasis*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectSubmitBasis&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectTextBasis element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectText class. |
||||
*/ |
||||
template<> |
||||
AutoConnectTextBasis& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Text) |
||||
return *(reinterpret_cast<AutoConnectTextBasis*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectTextBasis&>(_nullElement()); |
||||
} |
||||
|
||||
#else |
||||
|
||||
/**
|
||||
* Parse and load a JSON document which marks up multiple custom web |
||||
* pages. The compiler instantiates this template according to the stored |
||||
* data type that contains the JSON document. |
||||
* This template also generates different parsing function calls |
||||
* depending on the ArduinoJson version. |
||||
* @param T An object type of the JSON document which must be a |
||||
* passable object to ArduinoJson. |
||||
* @param in An instance of a source JSON document to load. |
||||
*/ |
||||
template<typename T> |
||||
bool AutoConnect::_parseJson(T in) { |
||||
ArduinoJsonBuffer jsonBuffer(AUTOCONNECT_JSONBUFFER_PRIMITIVE_SIZE); |
||||
JsonVariant jv; |
||||
#if ARDUINOJSON_VERSION_MAJOR<=5 |
||||
jv = jsonBuffer.parse(in); |
||||
if (!jv.success()) { |
||||
AC_DBG("JSON parse error\n"); |
||||
return false; |
||||
} |
||||
#else |
||||
DeserializationError err = deserializeJson(jsonBuffer, in); |
||||
if (err) { |
||||
AC_DBG("Deserialize error:%s\n", err.c_str()); |
||||
return false; |
||||
} |
||||
jv = jsonBuffer.as<JsonVariant>(); |
||||
#endif |
||||
return _load(jv); |
||||
} |
||||
|
||||
/**
|
||||
* Parse and load a JSON document which marks up a custom web page. |
||||
* The compiler instantiates this template according to the stored data |
||||
* type that contains the JSON document. |
||||
* This template also generates different parsing function calls |
||||
* depending on the ArduinoJson version. |
||||
* @param T An object type of the JSON document which must be a |
||||
* passable object to ArduinoJson. |
||||
* @param in An instance of a source JSON document to load. |
||||
*/ |
||||
template<typename T> |
||||
bool AutoConnectAux::_parseJson(T in) { |
||||
ArduinoJsonBuffer jsonBuffer(AUTOCONNECT_JSONBUFFER_PRIMITIVE_SIZE); |
||||
#if ARDUINOJSON_VERSION_MAJOR<=5 |
||||
JsonObject& jb = jsonBuffer.parseObject(in); |
||||
if (!jb.success()) { |
||||
AC_DBG("JSON parse error\n"); |
||||
return false; |
||||
} |
||||
#else |
||||
DeserializationError err = deserializeJson(jsonBuffer, in); |
||||
if (err) { |
||||
AC_DBG("Deserialize:%s\n", err.c_str()); |
||||
return false; |
||||
} |
||||
JsonObject jb = jsonBuffer.as<JsonObject>(); |
||||
#endif |
||||
return _load(jb); |
||||
} |
||||
|
||||
/**
|
||||
* Parse and load a JSON document which declares one of the AutoConnectElement. |
||||
* The compiler instantiates this template according to the stored data |
||||
* type that contains the JSON document. |
||||
* This template also generates different parsing function calls |
||||
* depending on the ArduinoJson version. |
||||
* @param T An object type of the JSON document which must be a |
||||
* passable object to ArduinoJson. |
||||
* @param in An instance of a source JSON document to load. |
||||
*/ |
||||
template<typename T> |
||||
bool AutoConnectAux::_parseElement(T in, const String& name) { |
||||
ArduinoJsonBuffer jsonBuffer(AUTOCONNECT_JSONBUFFER_PRIMITIVE_SIZE); |
||||
JsonVariant jb; |
||||
#if ARDUINOJSON_VERSION_MAJOR<=5 |
||||
jb = jsonBuffer.parse(in); |
||||
if (!jb.success()) { |
||||
AC_DBG("JSON parse error\n"); |
||||
return false; |
||||
} |
||||
#else |
||||
DeserializationError err = deserializeJson(jsonBuffer, in); |
||||
if (err) { |
||||
AC_DBG("Deserialize:%s\n", err.c_str()); |
||||
return false; |
||||
} |
||||
jb = jsonBuffer.as<JsonObject>(); |
||||
#endif |
||||
return _loadElement(jb, name); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectElementJson element. |
||||
* @param name an element name. |
||||
* @return A reference of AutoConnectElement class. |
||||
*/ |
||||
template<> |
||||
AutoConnectElementJson& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
return *(reinterpret_cast<AutoConnectElementJson*>(elm)); |
||||
} |
||||
return reinterpret_cast<AutoConnectElementJson&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectButtonJson element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectButton class. |
||||
*/ |
||||
template<> |
||||
AutoConnectButtonJson& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Button) |
||||
return *(reinterpret_cast<AutoConnectButtonJson*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectButtonJson&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectCheckboxJson element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectCheckbox class. |
||||
*/ |
||||
template<> |
||||
AutoConnectCheckboxJson& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Checkbox) |
||||
return *(reinterpret_cast<AutoConnectCheckboxJson*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectCheckboxJson&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectFile element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectFile class. |
||||
*/ |
||||
template<> |
||||
AutoConnectFileJson& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_File) |
||||
return *(reinterpret_cast<AutoConnectFileJson*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectFileJson&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectInputJson element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectInput class. |
||||
*/ |
||||
template<> |
||||
AutoConnectInputJson& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Input) |
||||
return *(reinterpret_cast<AutoConnectInputJson*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectInputJson&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectRadioJson element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectRadio class. |
||||
*/ |
||||
template<> |
||||
AutoConnectRadioJson& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Radio) |
||||
return *(reinterpret_cast<AutoConnectRadioJson*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectRadioJson&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectSelectJson element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectSelect class. |
||||
*/ |
||||
template<> |
||||
AutoConnectSelectJson& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Select) |
||||
return *(reinterpret_cast<AutoConnectSelectJson*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectSelectJson&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectSubmitJson element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectSubmit class. |
||||
*/ |
||||
template<> |
||||
AutoConnectSubmitJson& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Submit) |
||||
return *(reinterpret_cast<AutoConnectSubmitJson*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectSubmitJson&>(_nullElement()); |
||||
} |
||||
|
||||
/**
|
||||
* Get AutoConnectTextJson element. |
||||
* @param name An element name. |
||||
* @return A reference of AutoConnectText class. |
||||
*/ |
||||
template<> |
||||
AutoConnectTextJson& AutoConnectAux::getElement(const String& name) { |
||||
AutoConnectElement* elm = getElement(name); |
||||
if (elm) { |
||||
if (elm->typeOf() == AC_Text) |
||||
return *(reinterpret_cast<AutoConnectTextJson*>(elm)); |
||||
else |
||||
AC_DBG("Element<%s> type mismatch<%d>\n", name.c_str(), elm->typeOf()); |
||||
} |
||||
return reinterpret_cast<AutoConnectTextJson&>(_nullElement()); |
||||
} |
||||
|
||||
#endif // !AUTOCONNECT_USE_JSON
|
||||
|
||||
#endif // !_AUTOCONNECTAUXIMPL_H_
|
Loading…
Reference in new issue