-
Notifications
You must be signed in to change notification settings - Fork 0
/
tinyGS_ver02.ino
213 lines (200 loc) · 7.03 KB
/
tinyGS_ver02.ino
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include "controlStepper.h"
#include "Radio.h"
#include "ESPAsyncWebServer.h"
#include <SPIFFS.h>
#define SSID_WIFI "TinyGS"
#define PASSWORD_WIFI "123456789"
#define URL_TLE_TINYGS "https://api.tinygs.com/v1/tinygs_supported.txt"
#define SERVER_NTP "pool.ntp.org"
#define RX_EN_PIN 13
#define TX_EN_PIN 14
#define uS_TO_S_FACTOR 1000000ULL /* Conversion factor for micro seconds to seconds */
#define TIME_PREPARE_AFTER_WAKEUP 0 /* in second */
#define TIME_ACCEPT_PASS_LISTEN 5 /* in second */
#define SAVE_MODE 0
#define FOCUS_MODE 1
#define STATE_PRE_PASS 0
#define STATE_IN_PASS 1
#define STATE_POST_PASS 2
/* Create OBJ use for prediction, LoRa, epoch time */
Sgp4 mySat;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
timeInfoSat epochInfo;
Status status;
SX1278 radio = new Module(5, 4, 27, 17);
AsyncWebServer server(80);
//FirebaseAuth auth;
//FirebaseConfig config;
/* Create order sat list */
String orderSatList[8] = {"RS52SV", "FossaSat-2E11", "FossaSat-2E12", "GaoFen-7", "FEES", "SATLLA-2B", "FossaSat-2E8", "GaoFen-19"};
/* Create global variables */
String payload;
unsigned long epochNow = 1660138928;
//String* upcomingSatList;
uint8_t totalSat = 0, posInList = 0;
struct stateGS{
uint8_t current = STATE_PRE_PASS;
uint8_t previous;
};
stateGS state;
void setup() {
Serial.begin(9600);
WiFi.begin(SSID_WIFI, PASSWORD_WIFI);
while (WiFi.status() != WL_CONNECTED);
Serial.println(WiFi.localIP());
pinMode(DIR_AZ, OUTPUT);
pinMode(DIR_EL, OUTPUT);
pinMode(RX_EN_PIN, OUTPUT);
pinMode(TX_EN_PIN, OUTPUT);
configTime(GMT_OFFSET_SECOND, DAYLIGHT_OFFSET_SECOND, SERVER_NTP);
getEpochTimeNow(epochNow);
Serial.println(epochNow);
status.stateSD = initSDCard();
updateTleData(payload, URL_TLE_TINYGS);
mySat.site(10.869,106.802,21);
totalSat = NUM_ORDER_SAT;
createUpcomingOrderList(orderSatList, mySat, payload);
EEPROM.begin(EEPROM_SIZE);
if((EEPROM.read(ADDR_ID_EEPROM) > 0) && (EEPROM.read(ADDR_ID_EEPROM) < 255)){
status.lastPacketInfo.id = EEPROM.read(ADDR_ID_EEPROM);
}
//initFirebase();
if(!SPIFFS.begin()){
Serial.println("An Error has occurred while mounting SPIFFS");
}
createWebPage();
server.begin();
setupPWM();
}
void loop(){
switch(state.current){
case STATE_PRE_PASS:
prePass(posInList, epochNow, FOCUS_MODE, state);
break;
case STATE_IN_PASS:
inPass(posInList, epochNow, state);
break;
case STATE_POST_PASS:
postPass(posInList, totalSat, state);
break;
default:
break;
}
}
void goToSleep(uint64_t timeToSleep)
{
esp_sleep_enable_timer_wakeup(timeToSleep * uS_TO_S_FACTOR);
Serial.println("Going to sleep now");
Serial.println(timeToSleep * uS_TO_S_FACTOR);
Serial.flush();
esp_deep_sleep_start();
}
uint64_t calculateSleepTime(unsigned long Now, unsigned long Start)
{
return (uint64_t)(Start - Now - TIME_PREPARE_AFTER_WAKEUP);
}
void findSatEpochInfo(uint8_t positionInOrder, unsigned long& unixtNow){
getEpochTimeNow(unixtNow);
initialize_Sat(orderSatList[positionInOrder], mySat, payload);
status.statePredict = Predict(mySat, unixtNow);
}
void prePass(uint8_t positionInOrder, unsigned long& unixtNow, uint8_t modeOP, stateGS& state){
findSatEpochInfo(positionInOrder, unixtNow);
state.previous = STATE_PRE_PASS;
Serial.println(epochInfo.epochStart);
if(epochInfo.epochStart - TIME_PREPARE_AFTER_WAKEUP > unixtNow){
if(modeOP == SAVE_MODE){
uint64_t timeToSleep = calculateSleepTime(unixtNow, epochInfo.epochStart);
goToSleep(timeToSleep);
}else{
configParamsLoRa(status, radio, orderSatList[positionInOrder], false);
unsigned long unixtStart = epochInfo.epochStart - TIME_PREPARE_AFTER_WAKEUP;
while(unixtStart > unixtNow){
listenRadio(radio);
getEpochTimeNow(unixtNow);
}
}
}else if(unixtNow < epochInfo.epochStop){
state.current = STATE_IN_PASS;
}else{
state.current = STATE_POST_PASS;
}
}
void inPass(uint8_t positionInOrder, unsigned long& unixtNow, stateGS& state){
Serial.print("Sat listen: "); Serial.println(orderSatList[positionInOrder]);
configParamsLoRa(status, radio, orderSatList[positionInOrder], true);
bool endTime = false;
digitalWrite(RX_EN_PIN, HIGH);
digitalWrite(TX_EN_PIN, LOW);
while(unixtNow <= epochInfo.epochStop){
listenRadio(radio);
getEpochTimeNow(unixtNow);
mySat.findsat(unixtNow);
rotateInTrackingMode(mySat, endTime);
}
endTime = true;
rotateInTrackingMode(mySat, endTime);
state.previous = STATE_IN_PASS;
state.current = STATE_POST_PASS;
digitalWrite(RX_EN_PIN, LOW);
digitalWrite(TX_EN_PIN, LOW);
}
void postPass(uint8_t& positionInOrder, uint8_t totalSatOrder, stateGS& state){
Serial.println("update TLE");
updateTleData(payload, URL_TLE_TINYGS);
sortUpcomingList(orderSatList, mySat, payload, totalSatOrder);
if(state.previous != STATE_PRE_PASS){
positionInOrder = 0;
}else{
++positionInOrder;
}
state.previous = STATE_POST_PASS;
state.current = STATE_PRE_PASS;
}
void createWebPage(void){
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/index.html", String(), false, processor);
});
server.on("/rssi", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(status.lastPacketInfo.rssi).c_str());
});
server.on("/packet", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(status.lastPacketInfo.packet).c_str());
});
server.on("/checkLoRa", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(status.stateLoRa).c_str());
});
server.on("/checkSD", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(status.stateSD).c_str());
});
server.on("/checkPredict", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(status.statePredict).c_str());
});
server.on("/checkEpoch", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", String(epochInfo.epochStart).c_str());
});
server.on("/winter", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/winter.jpg", "image/jpg");
});
}
String processor(const String& var){
if (var == "RRSI"){
return String(status.lastPacketInfo.rssi);
}else if(var == "PACKET"){
return String(status.lastPacketInfo.packet);
}else if(var == "LORA"){
return ((String)status.stateLoRa);
}else if(var == "SD"){
return ((String)status.stateSD);
}else if(var == "PREDICT"){
return ((String)status.statePredict);
}else if(var == "EPOCH"){
return ((String)epochInfo.epochStart);
}else{
return String();
}
}