1 #include "BayEOSBuffer.h" 3 BayEOSBuffer::BayEOSBuffer(
void) {
12 uint8_t BayEOSBuffer::b_seek(
unsigned long pos) {
16 uint8_t BayEOSBuffer::b_write(
const uint8_t b) {
19 if (_pos == _max_length) {
25 uint8_t BayEOSBuffer::b_write(
const uint8_t *b, uint8_t length) {
27 _res = (((
unsigned long) (_pos + length)) <= _max_length ?
28 length : _max_length - _pos);
29 _res = write(b, _res);
33 if (_pos == _max_length) {
38 _res = write(b + _res, length - _res);
48 int BayEOSBuffer::b_read() {
51 if (_pos == _max_length) {
57 int BayEOSBuffer::b_read(uint8_t *dest,
int length) {
59 _res = (((
unsigned long) (_pos + length)) <= _max_length ?
60 length : _max_length - _pos);
61 _res = read(dest, _res);
65 if (_pos == _max_length) {
70 _res = read(dest + _res, length - _res);
71 if (_res == -1)
return -1;
79 return ((
unsigned long) (_max_length + _write_pos - _read_pos))
84 if (_end == _write_pos)
85 return (_max_length > (
unsigned long) length);
87 Serial.print(
"Space: ");
90 Serial.print((((
unsigned long) (_max_length + _end - _write_pos)) % _max_length));
91 Serial.print(
" Free: ");
92 Serial.println((((
unsigned long) (_max_length + _end - _write_pos)) % _max_length)> (
unsigned long) length);
94 return (((
unsigned long) (_max_length + _end - _write_pos)) % _max_length)
95 > (
unsigned long) length;
99 return b_read(dest, _packet_length);
105 return b_read(dest, length);
109 uint8_t length, uint8_t *dest) {
111 unsigned long remaining= ((
unsigned long) (_max_length + stop - pos))
113 if(remaining<length) length=remaining;
114 return b_read(dest, length);
119 Serial.print(
"Set: ");
127 Serial.print(
" --end: ");
129 Serial.print(
" -- write: ");
130 Serial.print(_write_pos);
131 Serial.print(
" -- read: ");
132 Serial.println(_read_pos);
150 uint8_t* p = (uint8_t*) &_millis;
153 _packet_length = b_read();
155 Serial.println(
"init Packet: ");
156 Serial.print(
"length: ");
157 Serial.print(_packet_length);
158 Serial.print(
" --end: ");
160 Serial.print(
" -- write: ");
161 Serial.print(_write_pos);
162 Serial.print(
" -- read: ");
163 Serial.println(_read_pos);
165 return _packet_length;
169 if (_packet_length == 0) {
171 Serial.println(
"Packet Length is 0. This should not happen...");
173 _read_pos = _write_pos;
175 _read_pos += _packet_length + 5;
177 Serial.println(
"next(): Set _read_pos");
181 if (_read_pos >= _max_length)
182 _read_pos -= _max_length;
184 Serial.print(
"Next Packet: ");
185 Serial.print(
"length: ");
186 Serial.print(_packet_length);
187 Serial.print(
" --end: ");
189 Serial.print(
" -- write: ");
190 Serial.print(_write_pos);
191 Serial.print(
" -- read: ");
192 Serial.println(_read_pos);
197 uint8_t move_read_pos = 0;
200 if (_end == _read_pos) {
201 _framesDiscarded = 1;
204 Serial.println(
"Verwerfe Paket");
208 if (_end >= _max_length)
216 unsigned long time = getTime();
217 uint8_t* b = (uint8_t *) &time;
220 b_write(payload, length);
222 _write_pos += length + 5;
223 if (_write_pos >= _max_length)
224 _write_pos -= _max_length;
228 Serial.print(
"end: ");
230 Serial.print(
" -- write: ");
231 Serial.print(_write_pos);
232 Serial.print(
" -- read: ");
233 Serial.println(_read_pos);
241 return _packet_length;
251 _absoluteTime=absolute_time;
255 if(_rtc!=NULL)
return 1;
260 unsigned long BayEOSBuffer::getTime(
void){
263 return _rtc->now().get();
268 unsigned long BayEOSBuffer::writePos(
void){
return _write_pos; }
269 unsigned long BayEOSBuffer::readPos(
void){
return _read_pos; }
270 unsigned long BayEOSBuffer::endPos(
void){
return _end; }
271 unsigned long BayEOSBuffer::length(
void){
return _max_length; }
277 static uint8_t daysInMonth[] =
278 { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
281 static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) {
285 for (uint8_t i = 1; i < m; ++i)
286 days += daysInMonth[(i - 1)];
288 if (m > 2 && y % 4 == 0)
290 return days + 365 * y + (y + 3) / 4 - 1;
293 static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) {
294 return ((days * 24L + h) * 60 + m) * 60 + s;
301 DateTime::DateTime(
long t) {
307 uint16_t days = t / 24;
309 for (yOff = 0;; ++yOff) {
310 leap = yOff % 4 == 0;
311 if (days < (uint16_t) 365 + leap)
316 uint8_t daysPerMonth = daysInMonth[(m - 1)];
319 if (days < daysPerMonth)
321 days -= daysPerMonth;
326 DateTime::DateTime(uint16_t year, uint8_t month, uint8_t day, uint8_t hour,
327 uint8_t min, uint8_t sec) {
338 static uint8_t conv2d(
const char* p) {
340 if (
'0' <= *p && *p <=
'9')
342 return 10 * v + *++p -
'0';
348 DateTime::DateTime(
const char* date,
const char* time) {
350 yOff = conv2d(date + 9);
354 m = date[1] ==
'a' ? 1 : m = date[2] ==
'n' ? 6 : 7;
360 m = date[2] ==
'r' ? 4 : 8;
363 m = date[2] ==
'r' ? 3 : 5;
379 d = conv2d(date + 4);
381 mm = conv2d(time + 3);
382 ss = conv2d(time + 6);
385 uint8_t DateTime::dayOfWeek()
const {
386 uint16_t day =
get() / SECONDS_PER_DAY;
387 return (day + 6) % 7;
390 long DateTime::get()
const {
391 uint16_t days = date2days(yOff, m, d);
392 return time2long(days, hh, mm, ss);
395 uint16_t DateTime::year()
const {
return 2000 + yOff; }
396 uint8_t DateTime::month()
const {
return m; }
397 uint8_t DateTime::day()
const {
return d; }
398 uint8_t DateTime::hour()
const {
return hh; }
399 uint8_t DateTime::minute()
const {
return mm; }
400 uint8_t DateTime::second()
const {
return ss; }
void seekReadPointer(unsigned long pos)
int readPacket(uint8_t *dest)
void set(unsigned long pos)
uint8_t initPacket(unsigned long pos)
unsigned long packetMillis(void)
uint8_t freeSpace(uint8_t length)
uint8_t readBinary(unsigned long pos, uint8_t length, uint8_t *dest)
unsigned long available(void)
void setRTC(RTC &rtc, boolean absolute_time=true)
uint8_t packetLength(void)
uint8_t addPacket(const uint8_t *payload, uint8_t length)
uint8_t initNextPacket(void)