1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#include "Mode.h"
#include "MTSLog.h"
const char* Mode::_file_name = "SurveyData.txt";
Mode::Mode(DOGS102* lcd, ButtonHandler* buttons, mDot* dot, LoRaHandler* lora)
: _lcd(lcd),
_buttons(buttons),
_dot(dot),
_lora(lora),
_main_id(Thread::gettid()),
_index(0),
_band(_dot->getFrequencyBand()),
_sub_band(_dot->getFrequencySubBand()),
_data_rate(mDot::SF_7),
_power(2),
_next_tx(0),
_send_data(false)
{}
Mode::~Mode() {}
bool Mode::deleteDataFile() {
bool ret = true;
// if survey data file exists, attempt to delete it
std::vector<mDot::mdot_file> files = _dot->listUserFiles();
for (std::vector<mDot::mdot_file>::iterator it = files.begin(); it != files.end(); it++)
if (it->name == _file_name) {
if (! _dot->deleteUserFile(_file_name))
ret = false;
break;
}
return ret;
}
// ID, Status, Lock, Lat, Long, Alt, Time, RSSIup, SNRup, RSSIdown, SNRdown, DataRate, Power
bool Mode::appendDataFile(const DataItem& data) {
char main_buf[256];
char id_buf[16];
char lat_buf[32];
char lon_buf[32];
char alt_buf[16];
char time_buf[32];
char stats_buf[32];
size_t size;
memset(main_buf, 0, sizeof(main_buf));
memset(id_buf, 0, sizeof(id_buf));
memset(lat_buf, 0, sizeof(lat_buf));
memset(lon_buf, 0, sizeof(lon_buf));
memset(alt_buf, 0, sizeof(alt_buf));
memset(time_buf, 0, sizeof(time_buf));
memset(stats_buf, 0, sizeof(stats_buf));
snprintf(id_buf, sizeof(id_buf), "%c%ld", (data.type == single) ? 'P' : 'S', data.index);
// if we had GPS lock, format GPS data
if (data.lock > 0) {
snprintf(lat_buf, sizeof(lat_buf), "%d %d %d.%03d %c",
abs(data.gps_latitude.degrees),
data.gps_latitude.minutes,
(data.gps_latitude.seconds * 6) / 1000,
(data.gps_latitude.seconds % 6) / 1000,
(data.gps_latitude.degrees > 0) ? 'N' : 'S');
snprintf(lon_buf, sizeof(lon_buf), "%d %d %d.%03d %c",
abs(data.gps_longitude.degrees),
data.gps_longitude.minutes,
(data.gps_longitude.seconds * 6) / 1000,
(data.gps_longitude.seconds % 6) / 1000,
(data.gps_longitude.degrees > 0) ? 'E' : 'W');
snprintf(alt_buf, sizeof(alt_buf), "%d",
data.gps_altitude);
snprintf(time_buf, sizeof(time_buf), "%02d:%02d:%02d %02d/%02d/%04d",
data.gps_time.tm_hour,
data.gps_time.tm_min,
data.gps_time.tm_sec,
data.gps_time.tm_mon + 1,
data.gps_time.tm_mday,
data.gps_time.tm_year + 1900);
}
if (data.status) {
snprintf(stats_buf, sizeof(stats_buf), "%d,%d.%ld,%d,%d.%ld",
data.ping.up.rssi,
data.ping.up.snr / 10, abs(data.ping.up.snr) % 10,
data.ping.down.rssi,
data.ping.down.snr / 4, (abs(data.ping.down.snr) % 10) * 25);
}
size = snprintf(main_buf, sizeof(main_buf), "%s,%c,%ld,%s,%s,%s,%s,%s,%s,%lu\n",
id_buf,
data.status ? 'S' : 'F',
data.lock,
(data.lock > 0) ? lat_buf : "",
(data.lock > 0) ? lon_buf : "",
(data.lock > 0) ? alt_buf : "",
(data.lock > 0) ? time_buf : "",
data.status ? stats_buf : ",,,",
_dot->DataRateStr(data.data_rate).substr(3).c_str(),
data.power);
if (size < 0) {
logError("failed to format survey data");
return false;
}
if (! _dot->appendUserFile(_file_name, (void*)main_buf, size)) {
logError("failed to write survey data to file");
return false;
} else {
logInfo("successfully wrote survey data to file");
}
return true;
}
void Mode::updateData(DataItem& data, DataType type, bool status) {
data.type = type;
data.index = _index;
data.status = status;
data.lock = 0;
// TODO add GPS info
data.ping = _ping_result;
data.data_rate = _data_rate;
data.power = _power;
}
|