1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/coloz-blinker-library

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
BlinkerHTTPAIR202.h 28 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
某10 Отправлено 6 лет назад 4bf677d
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881
#ifndef BLINKER_HTTP_AIR202_H
#define BLINKER_HTTP_AIR202_H
#if ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
// #include "Adapters/BlinkerSerialM QTT.h"
#include "../Blinker/BlinkerATMaster.h"
#include "../Blinker/BlinkerConfig.h"
#include "../Blinker/BlinkerDebug.h"
#include "../Blinker/BlinkerStream.h"
#include "../Blinker/BlinkerUtility.h"
// #if defined(ESP32)
// #include <HardwareSerial.h>
// HardwareSerial *HSerial_HTTP;
// #else
// #include <SoftwareSerial.h>
// SoftwareSerial *SSerial_HTTP;
// #endif
#define BLINKER_HTTP_AIR202_DEFAULT_TIMEOUT 5000UL
#define BLINKER_HTTP_AIR202_DATA_BUFFER_SIZE 1024
enum air202_http_status_t
{
air202_init,
air202_init_success,
air202_ver_check,
air202_ver_check_success,
air202_cgtt,
air202_cgtt_resp,
air202_cgtt_success,
air202_spbar_1,
air202_spbar_1_success,
air202_spbar_2,
air202_spbar_2_success,
air202_http_init,
air202_http_init_success,
air202_http_init_failed,
air202_http_para_set,
air202_http_para_set_success,
air202_http_para_set_failed,
air202_http_start,
air202_http_start_success,
air202_http_start_failed,
air202_http_data_set,
air202_http_data_set_success,
air202_http_data_set_failed,
air202_http_data_post,
air202_http_data_post_success,
air202_http_data_post_failed,
air202_http_upload_success,
air202_http_upload_failed,
air202_http_read_response,
air202_http_read_success,
air202_http_read_failed,
air202_http_read_paylaod,
air202_http_end,
air202_http_end_failed,
air202_http_end_success
};
enum air202_status_sap_t
{
air202_sap_cgtt_state_ver_check,
air202_sap_cgtt_state_ver_check_success,
air202_sap_cgtt_state,
air202_sap_cgtt_state_resp,
air202_sap_cgtt_state_success,
air202_sap_sapbar_pdp_REQ,
air202_sap_sapbar_pdp_success,
air202_sap_sapbar_pdp_failed,
air202_sap_sapbar_apn_REQ,
air202_sap_sapbar_apn_success,
air202_sap_sapbar_apn_failed,
air202_sap_sapbar_save_REQ,
air202_sap_sapbar_save_success,
air202_sap_sapbar_save_failed,
air202_sap_sapbar_fresh_REQ,
air202_sap_sapbar_fresh_success,
air202_sap_sapbar_fresh_failed,
};
class BlinkerHTTPAIR202
{
public :
BlinkerHTTPAIR202(Stream& s, bool isHardware, blinker_callback_t func)
{ stream = &s; isHWS = isHardware; listenFunc = func; }
~BlinkerHTTPAIR202() { flush(); }
void streamPrint(const String & s)
{
// stream->flush();
BLINKER_LOG_ALL(s);
stream->println(s);
}
int checkCGTT()
{
uint32_t http_time = millis();
air202_http_status_t http_status = air202_init;
streamPrint(BLINKER_CMD_AT);
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_init_success"));
http_status = air202_init_success;
break;
}
}
}
if (http_status != air202_init_success) return false;
streamPrint(BLINKER_CMD_CGMMR_REQ);
http_status = air202_ver_check;
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_CGMMR_RESP) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_ver_check_success"));
http_status = air202_ver_check_success;
break;
}
}
}
if (http_status != air202_ver_check_success) return false;
streamPrint(BLINKER_CMD_CGQTT_REQ);
http_status = air202_cgtt;
while(millis() - http_time < _httpTimeout)
{
if (available())
{
_masterAT = new BlinkerMasterAT();
_masterAT->update(STRING_format(streamData));
if (_masterAT->getState() != AT_M_NONE &&
_masterAT->reqName() == BLINKER_CMD_CGATT &&
_masterAT->getParam(0).toInt() == 1)
{
BLINKER_LOG_ALL(BLINKER_F("air202_cgtt_resp"));
http_status = air202_cgtt_resp;
}
free(_masterAT);
break;
}
}
if (http_status != air202_cgtt_resp) return false;
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_cgtt_success"));
http_status = air202_cgtt_success;
break;
}
}
}
if (http_status != air202_cgtt_success) return false;
// stream->println(BLINKER_CMD_CGQTT_REQ);
// http_status = air202_cgtt;
}
bool begin(String host, String uri) { _host = host; _uri = uri; }
void setTimeout(uint16_t timeout) { _httpTimeout = timeout; }
bool GET()
{
// streamPrint(STRING_format(BLINKER_CMD_MDISCONNECT_REQ));
// uint32_t mqtt_time = millis();
// uint8_t status_get = 0;
// while(millis() - mqtt_time < _httpTimeout)
// {
// if (available())
// {
// BLINKER_LOG_ALL(BLINKER_F("== disconnect available =="));
// if (strcmp(streamData, BLINKER_CMD_CONNACK_OK) == 0)
// {
// BLINKER_LOG_ALL(BLINKER_F("mqtt disconnect"));
// // return true;
// break;
// }
// }
// }
// streamPrint(STRING_format(BLINKER_CMD_MIPCLOSE_REQ));
// mqtt_time = millis();
// while(millis() - mqtt_time < _httpTimeout)
// {
// if (available())
// {
// BLINKER_LOG_ALL(BLINKER_F("== disconnect available =="));
// if (strcmp(streamData, BLINKER_CMD_CONNACK_OK) == 0)
// {
// BLINKER_LOG_ALL(BLINKER_F("mqtt disconnect"));
// // return true;
// break;
// }
// }
// }
// streamPrint(STRING_format(BLINKER_CMD_CIPSHUT_REQ));
// mqtt_time = millis();
// while(millis() - mqtt_time < _httpTimeout)
// {
// if (available())
// {
// BLINKER_LOG_ALL(BLINKER_F("== disconnect available =="));
// if (strcmp(streamData, BLINKER_CMD_CONNACK_OK) == 0)
// {
// BLINKER_LOG_ALL(BLINKER_F("mqtt disconnect"));
// return true;
// // break;
// }
// }
// }
streamPrint(BLINKER_CMD_HTTPINIT_REQ);
uint32_t http_time = millis();
air202_http_status_t http_status = air202_http_init;
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_init_success"));
http_status = air202_http_init_success;
break;
}
}
}
if (http_status != air202_http_init_success)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_init_failed"));
return false;
}
streamPrint(STRING_format(BLINKER_CMD_HTTPPARA_REQ) + "=\"CID\",1");
http_status = air202_http_para_set;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_para_set_success 1"));
http_status = air202_http_para_set_success;
break;
}
}
}
if (http_status != air202_http_para_set_success) return false;
streamPrint(STRING_format(BLINKER_CMD_HTTPPARA_REQ) + \
"=\"URL\",\"" + _host + _uri + "\"");
http_status = air202_http_para_set;
http_time = millis();
while(millis() - http_time < _httpTimeout*2)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_para_set_success 2"));
http_status = air202_http_para_set_success;
break;
}
else if (strcmp(streamData, BLINKER_CMD_ERROR) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_para_set_failed 2"));
// streamPrint("AT+CPOWD");
break;
}
}
}
// http_status = air202_http_para_set_success;// TBD
if (http_status != air202_http_para_set_success)
{
// streamPrint(STRING_format(BLINKER_CMD_HTTPERM_REQ));
// streamPrint("AT+CPOWD");
return false;
}
streamPrint(STRING_format(BLINKER_CMD_HTTPACTION_REQ) + "=0");
http_status = air202_http_start;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_start_success"));
http_status = air202_http_start_success;
break;
}
else if (strcmp(streamData, BLINKER_CMD_ERROR) == 0)
{
streamPrint(STRING_format(BLINKER_CMD_HTTPREAD_REQ));
::delay(500);
streamPrint(STRING_format(BLINKER_CMD_HTTPERM_REQ));
::delay(500);
break;
}
}
}
if (http_status != air202_http_start_success)
{
streamPrint(STRING_format(BLINKER_CMD_HTTPERM_REQ));
return false;
}
http_time = millis();
while(millis() - http_time < _httpTimeout*10)
{
if (available())
{
_masterAT = new BlinkerMasterAT();
_masterAT->update(STRING_format(streamData));
if (_masterAT->getState() != AT_M_NONE &&
_masterAT->reqName() == BLINKER_CMD_HTTPACTION)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_upload_success"));
http_status = air202_http_upload_success;
free(_masterAT);
break;
}
free(_masterAT);
// break;
}
}
// if (http_status != air202_http_upload_success) return false;
streamPrint(STRING_format(BLINKER_CMD_HTTPREAD_REQ));
http_status = air202_http_read_response;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
_masterAT = new BlinkerMasterAT();
_masterAT->update(STRING_format(streamData));
if (_masterAT->getState() != AT_M_NONE &&
_masterAT->reqName() == BLINKER_CMD_HTTPREAD)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_read_success"));
http_status = air202_http_read_success;
free(_masterAT);
break;
}
free(_masterAT);
// break;
}
}
if (http_status != air202_http_read_success) return false;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) != 0)
{
// payload = streamData;
if (isFreshPayload) free(payload);
isFreshPayload = true;
// char data_buff[1024] = { '\0' };
payload = (char*)malloc((strlen(streamData) + 1)*sizeof(char));
strcpy(payload, streamData);
BLINKER_LOG_ALL(BLINKER_F("payload: "), payload);
}
}
}
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
break;
}
}
}
streamPrint(STRING_format(BLINKER_CMD_HTTPERM_REQ));
http_status = air202_http_end;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_end_success"));
http_status = air202_http_end_success;
return true;
}
}
}
if (http_status != air202_http_end_success) return false;
}
bool POST(String _msg, String _type, String _application)
{
uint32_t http_time = millis();
air202_http_status_t http_status = air202_http_init;
streamPrint(BLINKER_CMD_HTTPINIT_REQ);
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_init_success"));
http_status = air202_http_init_success;
break;
}
}
}
if (http_status != air202_http_init_success) return false;
streamPrint(STRING_format(BLINKER_CMD_HTTPPARA_REQ) + "=\"CID\",1");
http_status = air202_http_para_set;
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_para_set_success 1"));
http_status = air202_http_para_set_success;
break;
}
}
}
if (http_status != air202_http_para_set_success) return false;
streamPrint(STRING_format(BLINKER_CMD_HTTPPARA_REQ) + \
"=\"URL\",\"" + _host + _uri + "\"");
http_status = air202_http_para_set;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_para_set_success 2"));
http_status = air202_http_para_set_success;
break;
}
}
}
if (http_status != air202_http_para_set_success) return false;
// streamPrint(STRING_format(BLINKER_CMD_HTTPPARA_REQ) + \
// "=\"" + _type + "\",\"" + _application + "\"");
// http_status = air202_http_para_set;
// http_time = millis();
// while(millis() - http_time < _httpTimeout)
// {
// if (available())
// {
// if (strcmp(streamData, BLINKER_CMD_OK) == 0)
// {
// BLINKER_LOG_ALL(BLINKER_F("air202_http_para_set_success 3"));
// http_status = air202_http_para_set_success;
// break;
// }
// }
// }
// if (http_status != air202_http_para_set_success) return false;
// _msg.replace("\"", "\\22");
// _msg = "\"" + _msg + "\"";
streamPrint(STRING_format(BLINKER_CMD_HTTPDATA_REQ) + \
"=" + _msg.length() + ",10000");
http_status = air202_http_data_set;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_DOWNLOAD) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_data_set_success"));
http_status = air202_http_data_set_success;
break;
}
}
}
if (http_status != air202_http_data_set_success) return false;
streamPrint(_msg);
http_status = air202_http_data_post;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_data_post_success"));
http_status = air202_http_data_post_success;
break;
}
}
}
if (http_status != air202_http_data_post_success) return false;
streamPrint(STRING_format(BLINKER_CMD_HTTPACTION_REQ) + "=1");
http_status = air202_http_start;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_start_success"));
http_status = air202_http_start_success;
break;
}
}
}
if (http_status != air202_http_start_success)
{
streamPrint(STRING_format(BLINKER_CMD_HTTPERM_REQ));
return false;
}
http_time = millis();
while(millis() - http_time < _httpTimeout*2)
{
if (available())
{
_masterAT = new BlinkerMasterAT();
_masterAT->update(STRING_format(streamData));
if (_masterAT->getState() != AT_M_NONE &&
_masterAT->reqName() == BLINKER_CMD_HTTPACTION)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_upload_success"));
http_status = air202_http_upload_success;
free(_masterAT);
break;
}
free(_masterAT);
// break;
}
}
if (http_status != air202_http_upload_success)
{
streamPrint(STRING_format(BLINKER_CMD_HTTPERM_REQ));
return false;
}
streamPrint(STRING_format(BLINKER_CMD_HTTPREAD_REQ));
http_status = air202_http_read_response;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
_masterAT = new BlinkerMasterAT();
_masterAT->update(STRING_format(streamData));
if (_masterAT->getState() != AT_M_NONE &&
_masterAT->reqName() == BLINKER_CMD_HTTPREAD)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_read_success, data len: "), _masterAT->getParam(0));
http_status = air202_http_read_success;
free(_masterAT);
break;
}
free(_masterAT);
// break;
}
}
if (http_status != air202_http_read_success) return false;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) != 0)
{
// payload = streamData;
if (isFreshPayload) free(payload);
isFreshPayload = true;
char data_buff[1024] = { '\0' };
payload = (char*)malloc((strlen(streamData) + 1)*sizeof(char));
strcpy(payload, streamData);
BLINKER_LOG_ALL(BLINKER_F("payload: "), payload);
}
}
}
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
break;
}
}
}
streamPrint(STRING_format(BLINKER_CMD_HTTPERM_REQ));
http_status = air202_http_end;
http_time = millis();
while(millis() - http_time < _httpTimeout)
{
if (available())
{
if (strcmp(streamData, BLINKER_CMD_OK) == 0)
{
BLINKER_LOG_ALL(BLINKER_F("air202_http_end_success"));
http_status = air202_http_end_success;
break;
}
}
}
if (http_status != air202_http_end_success) return false;
return true;
}
String getString()
{
return payload;//TBD
}
void flush()
{
if (isFreshPayload) free(payload);
if (isFresh) free(streamData);
}
protected :
class BlinkerMasterAT * _masterAT;
Stream* stream;
// String streamData;
// char streamData[1024];
char* streamData;
// String payload = "";
char* payload;
bool isFreshPayload = false;
bool isFresh = false;
bool isHWS = false;
String _host;
String _uri;
blinker_callback_t listenFunc = NULL;
uint16_t _httpTimeout = BLINKER_HTTP_AIR202_DEFAULT_TIMEOUT;
int timedRead()
{
int c;
uint32_t _startMillis = millis();
do {
c = stream->read();
if (c >= 0) return c;
} while(millis() - _startMillis < 1000);
return -1;
}
bool available()
{
yield();
if (!isHWS)
{
// #if defined(__AVR__) || defined(ESP8266)
// if (!SSerial_HTTP->isListening())
// {
// SSerial_HTTP->listen();
// ::delay(100);
// }
// #endif
if (listenFunc) listenFunc();
}
// char _data[BLINKER_HTTP_AIR202_DATA_BUFFER_SIZE];// = { '\0' };
// memset(_data, '\0', BLINKER_HTTP_AIR202_DATA_BUFFER_SIZE);
// if (!isFresh) streamData = (char*)malloc(BLINKER_HTTP_AIR202_DATA_BUFFER_SIZE*sizeof(char));
// else memset(streamData, '\0', BLINKER_HTTP_AIR202_DATA_BUFFER_SIZE);
if (stream->available())
{
// strcpy(_data, stream->readStringUntil('\n').c_str());
String _data = stream->readStringUntil('\n');
BLINKER_LOG_ALL(BLINKER_F("handleSerial rs: "), _data, BLINKER_F(", len: "), _data.length());
// _data[strlen(_data) - 1] = '\0';
if (isFresh)
{
free(streamData);
isFresh = false;
}
if (_data.length() <= 1) return false;
streamData = (char*)malloc((_data.length() + 1)*sizeof(char));
strcpy(streamData, _data.c_str());
if (_data.length() > 0 && streamData[_data.length() - 1] == '\r') streamData[_data.length() - 1] = '\0';
isFresh = true;
return true;
// if (isFresh) free(streamData);
// streamData = (char*)malloc(1*sizeof(char));
// // streamData = "";
// // memset(streamData, '\0', 1024);
// // BLINKER_LOG_ALL(BLINKER_F("handleSerial rs: "), stream->readString());
// // strcpy(streamData, stream->readStringUntil('\n').c_str());
// // int16_t dNum = strlen(streamData);
// // BLINKER_LOG_ALL(BLINKER_F("handleSerial rs: "), streamData,
// // BLINKER_F(", dNum: "), dNum);
// int16_t dNum = 0;
// int c_d = timedRead();
// while (dNum < BLINKER_MAX_READ_SIZE &&
// c_d >=0 && c_d != '\n')
// {
// // if (c_d != '\r')
// {
// streamData[dNum] = (char)c_d;
// dNum++;
// streamData = (char*)realloc(streamData, (dNum+1)*sizeof(char));
// }
// c_d = timedRead();
// }
// // dNum++;
// // // streamData = (char*)realloc(streamData, dNum*sizeof(char));
// // streamData[dNum-1] = '\0';
// // strcpy(streamData, stream->readStringUntil('\n').c_str());
// // int16_t dNum = strlen(streamData);
// // streamData[dNum-1] = '\0';
// // stream->flush();
// // BLINKER_LOG_ALL(BLINKER_F("handleSerial: "), streamData,
// // BLINKER_F(" , dNum: "), dNum);
// // BLINKER_LOG_FreeHeap_ALL();
// if (dNum < BLINKER_MAX_READ_SIZE && dNum > 0)
// {
// // if (streamData[dNum - 1] == '\r')
// streamData[dNum - 1] = '\0';
// BLINKER_LOG_ALL(BLINKER_F("handleSerial: "), streamData,
// BLINKER_F(" , dNum: "), dNum);
// isFresh = true;
// return true;
// }
// else
// {
// return false;
// }
}
else
{
return false;
}
}
};
#endif

Комментарий ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/coloz-blinker-library.git
git@gitlife.ru:oschina-mirror/coloz-blinker-library.git
oschina-mirror
coloz-blinker-library
coloz-blinker-library
master