Browse Source

Version bump

v_master
Sara Damiano 4 years ago
parent
commit
4cfabb14eb
18 changed files with 71 additions and 78 deletions
  1. +1
    -1
      .github/ISSUE_TEMPLATE.md
  2. +1
    -1
      library.json
  3. +1
    -1
      library.properties
  4. +8
    -11
      src/TinyGsmClientA6.h
  5. +1
    -1
      src/TinyGsmClientBG96.h
  6. +5
    -8
      src/TinyGsmClientESP8266.h
  7. +2
    -4
      src/TinyGsmClientM590.h
  8. +3
    -2
      src/TinyGsmClientM95.h
  9. +4
    -8
      src/TinyGsmClientSIM5360.h
  10. +1
    -1
      src/TinyGsmClientSIM7000.h
  11. +1
    -1
      src/TinyGsmClientSIM800.h
  12. +1
    -1
      src/TinyGsmClientSaraR4.h
  13. +2
    -1
      src/TinyGsmClientSequansMonarch.h
  14. +2
    -2
      src/TinyGsmClientUBLOX.h
  15. +4
    -2
      src/TinyGsmClientXBee.h
  16. +1
    -1
      src/TinyGsmCommon.h
  17. +12
    -14
      src/TinyGsmGPS.tpp
  18. +21
    -18
      src/TinyGsmModem.tpp

+ 1
- 1
.github/ISSUE_TEMPLATE.md View File

@ -25,7 +25,7 @@ with your board before submitting any issues.
Modem: <!-- Brand, model, variant, firmware version, ie Quectel BG96 Revision: BG96MAR02A07M1G --> Modem: <!-- Brand, model, variant, firmware version, ie Quectel BG96 Revision: BG96MAR02A07M1G -->
Main processor board: <!-- Uno, Zero, ESP32, Particle, etc --> Main processor board: <!-- Uno, Zero, ESP32, Particle, etc -->
TinyGSM version: <!-- always try to use the latest (0.10.8) -->
TinyGSM version: <!-- always try to use the latest (0.10.9) -->
Code: <!-- Example name or paste in your code --> Code: <!-- Example name or paste in your code -->
### Scenario, steps to reproduce ### Scenario, steps to reproduce


+ 1
- 1
library.json View File

@ -1,6 +1,6 @@
{ {
"name": "TinyGSM", "name": "TinyGSM",
"version": "0.10.8",
"version": "0.10.9",
"description": "A small Arduino library for GPRS modules, that just works. Includes examples for Blynk, MQTT, File Download, and Web Client. Supports many GSM, LTE, and WiFi modules with AT command interfaces.", "description": "A small Arduino library for GPRS modules, that just works. Includes examples for Blynk, MQTT, File Download, and Web Client. Supports many GSM, LTE, and WiFi modules with AT command interfaces.",
"keywords": "GSM, AT commands, AT, SIM800, SIM900, A6, A7, M590, ESP8266, SIM7000, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900A, SIM900D, SIM908, SIM968, M95, MC60, MC60E, BG96, ublox, Quectel, SIMCOM, AI Thinker, LTE, LTE-M", "keywords": "GSM, AT commands, AT, SIM800, SIM900, A6, A7, M590, ESP8266, SIM7000, SIM800A, SIM800C, SIM800L, SIM800H, SIM808, SIM868, SIM900A, SIM900D, SIM908, SIM968, M95, MC60, MC60E, BG96, ublox, Quectel, SIMCOM, AI Thinker, LTE, LTE-M",
"authors": [ "authors": [


+ 1
- 1
library.properties View File

@ -1,5 +1,5 @@
name=TinyGSM name=TinyGSM
version=0.10.8
version=0.10.9
author=Volodymyr Shymanskyy author=Volodymyr Shymanskyy
maintainer=Volodymyr Shymanskyy maintainer=Volodymyr Shymanskyy
sentence=A small Arduino library for GPRS modules, that just works. sentence=A small Arduino library for GPRS modules, that just works.


+ 8
- 11
src/TinyGsmClientA6.h View File

@ -191,7 +191,8 @@ class TinyGsmA6 : public TinyGsmModem<TinyGsmA6>,
bool sleepEnableImpl(bool enable = true) TINY_GSM_ATTR_NOT_AVAILABLE; bool sleepEnableImpl(bool enable = true) TINY_GSM_ATTR_NOT_AVAILABLE;
bool setPhoneFunctionalityImpl(uint8_t fun, bool reset = false) TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool setPhoneFunctionalityImpl(uint8_t fun, bool reset = false)
TINY_GSM_ATTR_NOT_IMPLEMENTED;
/* /*
* Generic network functions * Generic network functions
@ -475,7 +476,7 @@ class TinyGsmA6 : public TinyGsmModem<TinyGsmA6>,
String r5s(r5); r5s.trim(); String r5s(r5); r5s.trim();
DBG("### ..:", r1s, ",", r2s, ",", r3s, ",", r4s, ",", r5s);*/ DBG("### ..:", r1s, ",", r2s, ",", r3s, ",", r4s, ",", r5s);*/
data.reserve(64); data.reserve(64);
uint8_t index = 0;
uint8_t index = 0;
uint32_t startMillis = millis(); uint32_t startMillis = millis();
do { do {
TINY_GSM_YIELD(); TINY_GSM_YIELD();
@ -505,8 +506,8 @@ class TinyGsmA6 : public TinyGsmModem<TinyGsmA6>,
index = 5; index = 5;
goto finish; goto finish;
} else if (data.endsWith(GF("+CIPRCV:"))) { } else if (data.endsWith(GF("+CIPRCV:"))) {
int8_t mux = streamGetIntBefore(',');
int16_t len = streamGetIntBefore(',');
int8_t mux = streamGetIntBefore(',');
int16_t len = streamGetIntBefore(',');
int16_t len_orig = len; int16_t len_orig = len;
if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) { if (mux >= 0 && mux < TINY_GSM_MUX_COUNT && sockets[mux]) {
if (len > sockets[mux]->rx.free()) { if (len > sockets[mux]->rx.free()) {
@ -514,9 +515,7 @@ class TinyGsmA6 : public TinyGsmModem<TinyGsmA6>,
} else { } else {
DBG("### Got: ", len, "->", sockets[mux]->rx.free()); DBG("### Got: ", len, "->", sockets[mux]->rx.free());
} }
while (len--) {
moveCharFromStreamToFifo(mux);
}
while (len--) { moveCharFromStreamToFifo(mux); }
// TODO(?) Deal with missing characters // TODO(?) Deal with missing characters
if (len_orig > sockets[mux]->available()) { if (len_orig > sockets[mux]->available()) {
DBG("### Fewer characters received than expected: ", DBG("### Fewer characters received than expected: ",
@ -537,9 +536,7 @@ class TinyGsmA6 : public TinyGsmModem<TinyGsmA6>,
finish: finish:
if (!index) { if (!index) {
data.trim(); data.trim();
if (data.length()) {
DBG("### Unhandled:", data);
}
if (data.length()) { DBG("### Unhandled:", data); }
data = ""; data = "";
} }
// data.replace(GSM_NL, "/"); // data.replace(GSM_NL, "/");
@ -577,7 +574,7 @@ class TinyGsmA6 : public TinyGsmModem<TinyGsmA6>,
protected: protected:
GsmClientA6* sockets[TINY_GSM_MUX_COUNT]; GsmClientA6* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL;
const char* gsmNL = GSM_NL;
}; };
#endif // SRC_TINYGSMCLIENTA6_H_ #endif // SRC_TINYGSMCLIENTA6_H_

+ 1
- 1
src/TinyGsmClientBG96.h View File

@ -684,7 +684,7 @@ class TinyGsmBG96 : public TinyGsmModem<TinyGsmBG96>,
} }
public: public:
Stream& stream;
Stream& stream;
protected: protected:
GsmClientBG96* sockets[TINY_GSM_MUX_COUNT]; GsmClientBG96* sockets[TINY_GSM_MUX_COUNT];


+ 5
- 8
src/TinyGsmClientESP8266.h View File

@ -200,7 +200,8 @@ class TinyGsmESP8266 : public TinyGsmModem<TinyGsmESP8266>,
bool sleepEnableImpl(bool enable = true) TINY_GSM_ATTR_NOT_AVAILABLE; bool sleepEnableImpl(bool enable = true) TINY_GSM_ATTR_NOT_AVAILABLE;
bool setPhoneFunctionalityImpl(uint8_t fun, bool reset = false) TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool setPhoneFunctionalityImpl(uint8_t fun, bool reset = false)
TINY_GSM_ATTR_NOT_IMPLEMENTED;
/* /*
* Generic network functions * Generic network functions
@ -317,9 +318,7 @@ class TinyGsmESP8266 : public TinyGsmModem<TinyGsmESP8266>,
// if the status is anything but 3, there are no connections open // if the status is anything but 3, there are no connections open
waitResponse(); // Returns an OK after the status waitResponse(); // Returns an OK after the status
for (int muxNo = 0; muxNo < TINY_GSM_MUX_COUNT; muxNo++) { for (int muxNo = 0; muxNo < TINY_GSM_MUX_COUNT; muxNo++) {
if (sockets[muxNo]) {
sockets[muxNo]->sock_connected = false;
}
if (sockets[muxNo]) { sockets[muxNo]->sock_connected = false; }
} }
return false; return false;
} }
@ -398,9 +397,7 @@ class TinyGsmESP8266 : public TinyGsmModem<TinyGsmESP8266>,
} else { } else {
// DBG("### Got Data: ", len, "on", mux); // DBG("### Got Data: ", len, "on", mux);
} }
while (len--) {
moveCharFromStreamToFifo(mux);
}
while (len--) { moveCharFromStreamToFifo(mux); }
// TODO(SRGDamia1): deal with buffer overflow/missed characters // TODO(SRGDamia1): deal with buffer overflow/missed characters
if (len_orig > sockets[mux]->available()) { if (len_orig > sockets[mux]->available()) {
DBG("### Fewer characters received than expected: ", DBG("### Fewer characters received than expected: ",
@ -446,7 +443,7 @@ class TinyGsmESP8266 : public TinyGsmModem<TinyGsmESP8266>,
} }
public: public:
Stream& stream;
Stream& stream;
protected: protected:
GsmClientESP8266* sockets[TINY_GSM_MUX_COUNT]; GsmClientESP8266* sockets[TINY_GSM_MUX_COUNT];


+ 2
- 4
src/TinyGsmClientM590.h View File

@ -407,9 +407,7 @@ class TinyGsmM590 : public TinyGsmModem<TinyGsmM590>,
} else { } else {
DBG("### Got: ", len, "->", sockets[mux]->rx.free()); DBG("### Got: ", len, "->", sockets[mux]->rx.free());
} }
while (len--) {
moveCharFromStreamToFifo(mux);
}
while (len--) { moveCharFromStreamToFifo(mux); }
// TODO(?): Handle lost characters // TODO(?): Handle lost characters
if (len_orig > sockets[mux]->available()) { if (len_orig > sockets[mux]->available()) {
DBG("### Fewer characters received than expected: ", DBG("### Fewer characters received than expected: ",
@ -465,7 +463,7 @@ class TinyGsmM590 : public TinyGsmModem<TinyGsmM590>,
} }
public: public:
Stream& stream;
Stream& stream;
protected: protected:
GsmClientM590* sockets[TINY_GSM_MUX_COUNT]; GsmClientM590* sockets[TINY_GSM_MUX_COUNT];


+ 3
- 2
src/TinyGsmClientM95.h View File

@ -227,7 +227,8 @@ class TinyGsmM95 : public TinyGsmModem<TinyGsmM95>,
return waitResponse() == 1; return waitResponse() == 1;
} }
bool setPhoneFunctionalityImpl(uint8_t fun, bool reset = false) TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool setPhoneFunctionalityImpl(uint8_t fun, bool reset = false)
TINY_GSM_ATTR_NOT_IMPLEMENTED;
/* /*
* Generic network functions * Generic network functions
@ -625,7 +626,7 @@ class TinyGsmM95 : public TinyGsmModem<TinyGsmM95>,
} }
public: public:
Stream& stream;
Stream& stream;
protected: protected:
GsmClientM95* sockets[TINY_GSM_MUX_COUNT]; GsmClientM95* sockets[TINY_GSM_MUX_COUNT];


+ 4
- 8
src/TinyGsmClientSIM5360.h View File

@ -222,9 +222,7 @@ class TinyGsmSim5360 : public TinyGsmModem<TinyGsmSim5360>,
if (waitResponse(10000L) != 1) { return false; } if (waitResponse(10000L) != 1) { return false; }
// After booting, modem sends out messages as each of its // After booting, modem sends out messages as each of its
// internal modules loads. The final message is "PB DONE". // internal modules loads. The final message is "PB DONE".
if (waitResponse(40000L, GF(GSM_NL "PB DONE")) != 1) {
return false;
}
if (waitResponse(40000L, GF(GSM_NL "PB DONE")) != 1) { return false; }
return init(); return init();
} }
@ -234,7 +232,7 @@ class TinyGsmSim5360 : public TinyGsmModem<TinyGsmSim5360>,
} }
bool radioOffImpl() { bool radioOffImpl() {
if (!setPhoneFunctionality(4)) { return false; }
if (!setPhoneFunctionality(4)) { return false; }
delay(3000); delay(3000);
return true; return true;
} }
@ -587,9 +585,7 @@ class TinyGsmSim5360 : public TinyGsmModem<TinyGsmSim5360>,
for (int muxNo = 0; muxNo < TINY_GSM_MUX_COUNT; muxNo++) { for (int muxNo = 0; muxNo < TINY_GSM_MUX_COUNT; muxNo++) {
// +CIPCLOSE:<link0_state>,<link1_state>,...,<link9_state> // +CIPCLOSE:<link0_state>,<link1_state>,...,<link9_state>
bool muxState = stream.parseInt(); bool muxState = stream.parseInt();
if (sockets[muxNo]) {
sockets[muxNo]->sock_connected = muxState;
}
if (sockets[muxNo]) { sockets[muxNo]->sock_connected = muxState; }
} }
waitResponse(); // Should be an OK at the end waitResponse(); // Should be an OK at the end
if (!sockets[mux]) return false; if (!sockets[mux]) return false;
@ -722,7 +718,7 @@ class TinyGsmSim5360 : public TinyGsmModem<TinyGsmSim5360>,
} }
public: public:
Stream& stream;
Stream& stream;
protected: protected:
GsmClientSim5360* sockets[TINY_GSM_MUX_COUNT]; GsmClientSim5360* sockets[TINY_GSM_MUX_COUNT];


+ 1
- 1
src/TinyGsmClientSIM7000.h View File

@ -764,7 +764,7 @@ class TinyGsmSim7000 : public TinyGsmModem<TinyGsmSim7000>,
} }
public: public:
Stream& stream;
Stream& stream;
protected: protected:
GsmClientSim7000* sockets[TINY_GSM_MUX_COUNT]; GsmClientSim7000* sockets[TINY_GSM_MUX_COUNT];


+ 1
- 1
src/TinyGsmClientSIM800.h View File

@ -254,7 +254,7 @@ class TinyGsmSim800 : public TinyGsmModem<TinyGsmSim800>,
if (!testAT()) { return false; } if (!testAT()) { return false; }
sendAT(GF("&W")); sendAT(GF("&W"));
waitResponse(); waitResponse();
if (!setPhoneFunctionality(0)) { return false; }
if (!setPhoneFunctionality(0)) { return false; }
if (!setPhoneFunctionality(1, true)) { return false; } if (!setPhoneFunctionality(1, true)) { return false; }
delay(3000); delay(3000);
return init(); return init();


+ 1
- 1
src/TinyGsmClientSaraR4.h View File

@ -888,7 +888,7 @@ class TinyGsmSaraR4 : public TinyGsmModem<TinyGsmSaraR4>,
} }
public: public:
Stream& stream;
Stream& stream;
protected: protected:
GsmClientSaraR4* sockets[TINY_GSM_MUX_COUNT]; GsmClientSaraR4* sockets[TINY_GSM_MUX_COUNT];


+ 2
- 1
src/TinyGsmClientSequansMonarch.h View File

@ -316,7 +316,8 @@ class TinyGsmSequansMonarch
return waitResponse() == 1; return waitResponse() == 1;
} }
bool setPhoneFunctionality(uint8_t fun, bool reset = false) TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool setPhoneFunctionality(uint8_t fun,
bool reset = false) TINY_GSM_ATTR_NOT_IMPLEMENTED;
/* /*
* Generic network functions * Generic network functions


+ 2
- 2
src/TinyGsmClientUBLOX.h View File

@ -236,7 +236,7 @@ class TinyGsmUBLOX : public TinyGsmModem<TinyGsmUBLOX>,
bool factoryDefaultImpl() { bool factoryDefaultImpl() {
sendAT(GF("+UFACTORY=0,1")); // No factory restore, erase NVM sendAT(GF("+UFACTORY=0,1")); // No factory restore, erase NVM
waitResponse(); waitResponse();
return setPhoneFunctionality(16); // Reset
return setPhoneFunctionality(16); // Reset
} }
/* /*
@ -820,7 +820,7 @@ class TinyGsmUBLOX : public TinyGsmModem<TinyGsmUBLOX>,
} }
public: public:
Stream& stream;
Stream& stream;
protected: protected:
GsmClientUBLOX* sockets[TINY_GSM_MUX_COUNT]; GsmClientUBLOX* sockets[TINY_GSM_MUX_COUNT];


+ 4
- 2
src/TinyGsmClientXBee.h View File

@ -572,7 +572,8 @@ class TinyGsmXBee : public TinyGsmModem<TinyGsmXBee>,
bool sleepEnableImpl(bool enable = true) TINY_GSM_ATTR_NOT_IMPLEMENTED; bool sleepEnableImpl(bool enable = true) TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool setPhoneFunctionalityImpl(uint8_t fun, bool reset = false) TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool setPhoneFunctionalityImpl(uint8_t fun, bool reset = false)
TINY_GSM_ATTR_NOT_IMPLEMENTED;
/* /*
* Generic network functions * Generic network functions
@ -1443,7 +1444,8 @@ class TinyGsmXBee : public TinyGsmModem<TinyGsmXBee>,
} }
public: public:
Stream& stream;
Stream& stream;
protected: protected:
GsmClientXBee* sockets[TINY_GSM_MUX_COUNT]; GsmClientXBee* sockets[TINY_GSM_MUX_COUNT];
const char* gsmNL = GSM_NL; const char* gsmNL = GSM_NL;


+ 1
- 1
src/TinyGsmCommon.h View File

@ -10,7 +10,7 @@
#define SRC_TINYGSMCOMMON_H_ #define SRC_TINYGSMCOMMON_H_
// The current library version number // The current library version number
#define TINYGSM_VERSION "0.10.8"
#define TINYGSM_VERSION "0.10.9"
#if defined(SPARK) || defined(PARTICLE) #if defined(SPARK) || defined(PARTICLE)
#include "Particle.h" #include "Particle.h"


+ 12
- 14
src/TinyGsmGPS.tpp View File

@ -43,13 +43,11 @@ class TinyGsmGPS {
hour, minute, second); hour, minute, second);
} }
String setGNSSMode(uint8_t mode,bool dpo)
{
return thisModem().setGNSSModeImpl(mode,dpo);
String setGNSSMode(uint8_t mode, bool dpo) {
return thisModem().setGNSSModeImpl(mode, dpo);
} }
uint8_t getGNSSMode()
{
uint8_t getGNSSMode() {
return thisModem().getGNSSModeImpl(); return thisModem().getGNSSModeImpl();
} }
@ -68,15 +66,15 @@ class TinyGsmGPS {
* GPS/GNSS/GLONASS location functions * GPS/GNSS/GLONASS location functions
*/ */
bool enableGPSImpl() TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool disableGPSImpl() TINY_GSM_ATTR_NOT_IMPLEMENTED;
String getGPSrawImpl() TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool getGPSImpl(float* lat, float* lon, float* speed = 0, float* alt = 0,
int* vsat = 0, int* usat = 0, float* accuracy = 0,
int* year = 0, int* month = 0, int* day = 0, int* hour = 0,
int* minute = 0,
int* second = 0) TINY_GSM_ATTR_NOT_IMPLEMENTED;
String setGNSSModeImpl(uint8_t mode,bool dpo) TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool enableGPSImpl() TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool disableGPSImpl() TINY_GSM_ATTR_NOT_IMPLEMENTED;
String getGPSrawImpl() TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool getGPSImpl(float* lat, float* lon, float* speed = 0, float* alt = 0,
int* vsat = 0, int* usat = 0, float* accuracy = 0,
int* year = 0, int* month = 0, int* day = 0, int* hour = 0,
int* minute = 0,
int* second = 0) TINY_GSM_ATTR_NOT_IMPLEMENTED;
String setGNSSModeImpl(uint8_t mode, bool dpo) TINY_GSM_ATTR_NOT_IMPLEMENTED;
uint8_t getGNSSModeImpl() TINY_GSM_ATTR_NOT_IMPLEMENTED; uint8_t getGNSSModeImpl() TINY_GSM_ATTR_NOT_IMPLEMENTED;
}; };


+ 21
- 18
src/TinyGsmModem.tpp View File

@ -174,7 +174,8 @@ class TinyGsmModem {
bool sleepEnableImpl(bool enable = true) TINY_GSM_ATTR_NOT_IMPLEMENTED; bool sleepEnableImpl(bool enable = true) TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool setPhoneFunctionalityImpl(uint8_t fun, bool reset = false) TINY_GSM_ATTR_NOT_IMPLEMENTED;
bool setPhoneFunctionalityImpl(uint8_t fun, bool reset = false)
TINY_GSM_ATTR_NOT_IMPLEMENTED;
/* /*
* Generic network functions * Generic network functions
@ -266,15 +267,15 @@ class TinyGsmModem {
} }
protected: protected:
inline bool streamGetLength(char* buf, int8_t numChars, const uint32_t timeout_ms = 1000L) {
if (!buf) {
return false;
}
int8_t numCharsReady = -1;
uint32_t startMillis = millis();
while (millis() - startMillis < timeout_ms && (numCharsReady = thisModem().stream.available()) < numChars) {
TINY_GSM_YIELD();
inline bool streamGetLength(char* buf, int8_t numChars,
const uint32_t timeout_ms = 1000L) {
if (!buf) { return false; }
int8_t numCharsReady = -1;
uint32_t startMillis = millis();
while (millis() - startMillis < timeout_ms &&
(numCharsReady = thisModem().stream.available()) < numChars) {
TINY_GSM_YIELD();
} }
if (numCharsReady >= numChars) { if (numCharsReady >= numChars) {
@ -285,8 +286,9 @@ class TinyGsmModem {
return false; return false;
} }
inline int16_t streamGetIntLength(int8_t numChars, const uint32_t timeout_ms = 1000L) {
char buf[numChars + 1];
inline int16_t streamGetIntLength(int8_t numChars,
const uint32_t timeout_ms = 1000L) {
char buf[numChars + 1];
if (streamGetLength(buf, numChars, timeout_ms)) { if (streamGetLength(buf, numChars, timeout_ms)) {
buf[numChars] = '\0'; buf[numChars] = '\0';
return atoi(buf); return atoi(buf);
@ -309,13 +311,14 @@ class TinyGsmModem {
return -9999; return -9999;
} }
inline float streamGetFloatLength(int8_t numChars, const uint32_t timeout_ms = 1000L) {
char buf[numChars + 1];
inline float streamGetFloatLength(int8_t numChars,
const uint32_t timeout_ms = 1000L) {
char buf[numChars + 1];
if (streamGetLength(buf, numChars, timeout_ms)) { if (streamGetLength(buf, numChars, timeout_ms)) {
buf[numChars] = '\0'; buf[numChars] = '\0';
return atof(buf); return atof(buf);
}
}
return -9999.0F; return -9999.0F;
} }
@ -328,8 +331,8 @@ class TinyGsmModem {
buf[bytesRead] = '\0'; buf[bytesRead] = '\0';
float res = atof(buf); float res = atof(buf);
return res; return res;
}
}
return -9999.0F; return -9999.0F;
} }


Loading…
Cancel
Save