Skip to content

Commit b72b376

Browse files
committed
data is now a linked list
1 parent 77a0d49 commit b72b376

File tree

2 files changed

+68
-41
lines changed

2 files changed

+68
-41
lines changed

src/AdafruitIO_Data.cpp

Lines changed: 61 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,64 @@
1414

1515
AdafruitIO_Data::AdafruitIO_Data()
1616
{
17-
feed = 0;
17+
_feed = 0;
1818
_csv = 0;
19-
_value = 0;
2019
_lat = 0;
2120
_lon = 0;
2221
_ele = 0;
22+
next_data = 0;
23+
24+
memset(_value, 0, AIO_DATA_LENGTH);
2325
}
2426

2527
AdafruitIO_Data::AdafruitIO_Data(AdafruitIO_Feed *f)
2628
{
27-
feed = f;
29+
_feed = f->name;
2830
_csv = 0;
29-
_value = 0;
3031
_lat = 0;
3132
_lon = 0;
3233
_ele = 0;
34+
next_data = 0;
35+
36+
memset(_value, 0, AIO_DATA_LENGTH);
3337
}
3438

3539
AdafruitIO_Data::AdafruitIO_Data(AdafruitIO_Feed *f, char *csv)
3640
{
37-
feed = f;
41+
_feed = f->name;
3842
_csv = csv;
39-
_value = 0;
4043
_lat = 0;
4144
_lon = 0;
4245
_ele = 0;
46+
next_data = 0;
47+
48+
memset(_value, 0, AIO_DATA_LENGTH);
49+
50+
_parseCSV();
51+
}
52+
53+
AdafruitIO_Data::AdafruitIO_Data(const char *f)
54+
{
55+
_feed = f;
56+
_csv = 0;
57+
_lat = 0;
58+
_lon = 0;
59+
_ele = 0;
60+
next_data = 0;
61+
62+
memset(_value, 0, AIO_DATA_LENGTH);
63+
}
64+
65+
AdafruitIO_Data::AdafruitIO_Data(const char *f, char *csv)
66+
{
67+
_feed = f;
68+
_csv = csv;
69+
_lat = 0;
70+
_lon = 0;
71+
_ele = 0;
72+
next_data = 0;
73+
74+
memset(_value, 0, AIO_DATA_LENGTH);
4375

4476
_parseCSV();
4577
}
@@ -61,26 +93,24 @@ void AdafruitIO_Data::setLocation(double lat, double lon, double ele)
6193
_ele = ele;
6294
}
6395

64-
static char _converted[AIO_DATA_LENGTH];
65-
6696
void AdafruitIO_Data::setValue(const char *value, double lat, double lon, double ele)
6797
{
68-
_value = (char *)value;
98+
strcpy(_value, value);
6999
setLocation(lat, lon, ele);
70100
}
71101

72102
void AdafruitIO_Data::setValue(char *value, double lat, double lon, double ele)
73103
{
74-
_value = value;
104+
strcpy(_value, value);
75105
setLocation(lat, lon, ele);
76106
}
77107

78108
void AdafruitIO_Data::setValue(bool value, double lat, double lon, double ele)
79109
{
80110
if(value)
81-
_value = (char *)"1";
111+
strcpy(_value, "1");
82112
else
83-
_value = (char *)"0";
113+
strcpy(_value, "0");
84114

85115
setLocation(lat, lon, ele);
86116
}
@@ -93,83 +123,76 @@ void AdafruitIO_Data::setValue(String value, double lat, double lon, double ele)
93123

94124
void AdafruitIO_Data::setValue(int value, double lat, double lon, double ele)
95125
{
96-
memset(_converted, 0, sizeof(_converted));
97-
itoa(value, _converted, 10);
98-
_value = _converted;
126+
memset(_value, 0, AIO_DATA_LENGTH);
127+
itoa(value, _value, 10);
99128
setLocation(lat, lon, ele);
100129
}
101130

102131
void AdafruitIO_Data::setValue(unsigned int value, double lat, double lon, double ele)
103132
{
104-
memset(_converted, 0, sizeof(_converted));
105-
utoa(value, _converted, 10);
106-
_value = _converted;
133+
memset(_value, 0, AIO_DATA_LENGTH);
134+
utoa(value, _value, 10);
107135
setLocation(lat, lon, ele);
108136
}
109137

110138
void AdafruitIO_Data::setValue(long value, double lat, double lon, double ele)
111139
{
112-
memset(_converted, 0, sizeof(_converted));
113-
ltoa(value, _converted, 10);
114-
_value = _converted;
140+
memset(_value, 0, AIO_DATA_LENGTH);
141+
ltoa(value, _value, 10);
115142
setLocation(lat, lon, ele);
116143
}
117144

118145
void AdafruitIO_Data::setValue(unsigned long value, double lat, double lon, double ele)
119146
{
120-
memset(_converted, 0, sizeof(_converted));
121-
ultoa(value, _converted, 10);
122-
_value = _converted;
147+
memset(_value, 0, AIO_DATA_LENGTH);
148+
ultoa(value, _value, 10);
123149
setLocation(lat, lon, ele);
124150
}
125151

126152
void AdafruitIO_Data::setValue(float value, double lat, double lon, double ele, int precision)
127153
{
128-
memset(_converted, 0, sizeof(_converted));
154+
memset(_value, 0, AIO_DATA_LENGTH);
129155

130156
#if defined(ARDUINO_ARCH_AVR)
131157
// Use avrlibc dtostre function on AVR platforms.
132-
dtostre(value, _converted, 10, 0);
158+
dtostre(value, _value, 10, 0);
133159
#elif defined(ESP8266)
134160
// ESP8266 Arduino only implements dtostrf and not dtostre. Use dtostrf
135161
// but accept a hint as to how many decimals of precision are desired.
136-
dtostrf(value, 0, precision, _converted);
162+
dtostrf(value, 0, precision, _value);
137163
#else
138164
// Otherwise fall back to snprintf on other platforms.
139-
snprintf(_converted, sizeof(_converted)-1, "%f", value);
165+
snprintf(_value, sizeof(_value)-1, "%f", value);
140166
#endif
141167

142-
_value = _converted;
143168
setLocation(lat, lon, ele);
144169
}
145170

146171
void AdafruitIO_Data::setValue(double value, double lat, double lon, double ele, int precision)
147172
{
148-
memset(_converted, 0, sizeof(_converted));
173+
memset(_value, 0, AIO_DATA_LENGTH);
149174

150175
#if defined(ARDUINO_ARCH_AVR)
151176
// Use avrlibc dtostre function on AVR platforms.
152-
dtostre(value, _converted, 10, 0);
177+
dtostre(value, _value, 10, 0);
153178
#elif defined(ESP8266)
154179
// ESP8266 Arduino only implements dtostrf and not dtostre. Use dtostrf
155180
// but accept a hint as to how many decimals of precision are desired.
156-
dtostrf(value, 0, precision, _converted);
181+
dtostrf(value, 0, precision, _value);
157182
#else
158183
// Otherwise fall back to snprintf on other platforms.
159-
snprintf(_converted, sizeof(_converted)-1, "%f", value);
184+
snprintf(_value, sizeof(_value)-1, "%f", value);
160185
#endif
161186

162-
163-
_value = _converted;
164187
setLocation(lat, lon, ele);
165188
}
166189

167190
char* AdafruitIO_Data::feedName()
168191
{
169-
if(! feed)
192+
if(! _feed)
170193
return (char*)"";
171194

172-
return (char *)feed->name;
195+
return (char *)_feed;
173196
}
174197

175198
char* AdafruitIO_Data::value()
@@ -344,7 +367,7 @@ char* AdafruitIO_Data::charFromDouble(double d, int precision)
344367
bool AdafruitIO_Data::_parseCSV()
345368
{
346369
// parse value from csv
347-
_value = strtok(_csv, ",");
370+
strcpy(_value, strtok(_csv, ","));
348371
if (! _value) return false;
349372

350373
// parse lat from csv and convert to float

src/AdafruitIO_Data.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class AdafruitIO_Data {
2424
AdafruitIO_Data();
2525
AdafruitIO_Data(AdafruitIO_Feed *f);
2626
AdafruitIO_Data(AdafruitIO_Feed *f, char *csv);
27+
AdafruitIO_Data(const char *f);
28+
AdafruitIO_Data(const char *f, char *csv);
2729

2830
bool setCSV(char *csv);
2931

@@ -67,12 +69,14 @@ class AdafruitIO_Data {
6769
double lon();
6870
double ele();
6971

70-
AdafruitIO_Feed *feed;
72+
AdafruitIO_Data *next_data;
7173

7274
private:
7375

74-
char *_csv,
75-
*_value;
76+
const char *_feed;
77+
78+
char *_csv;
79+
char _value[AIO_DATA_LENGTH];
7680

7781
double _lat,
7882
_lon,

0 commit comments

Comments
 (0)