kopia lustrzana https://github.com/dl9rdz/rdz_ttgo_sonde
Merge branch 'dl9rdz:devel' into devel
commit
71452e97e6
|
@ -320,7 +320,7 @@ const char *handleQRGPost(AsyncWebServerRequest *request) {
|
||||||
const char *fstr = fstring.c_str();
|
const char *fstr = fstring.c_str();
|
||||||
const char *tstr = tstring.c_str();
|
const char *tstr = tstring.c_str();
|
||||||
const char *sstr = sstring.c_str();
|
const char *sstr = sstring.c_str();
|
||||||
if(*tstr=='6' || *tstr=='9') tstr="D";
|
if (*tstr == '6' || *tstr == '9') tstr = "D";
|
||||||
Serial.printf("Processing a=%s, f=%s, t=%s, site=%s\n", active ? "YES" : "NO", fstr, tstr, sstr);
|
Serial.printf("Processing a=%s, f=%s, t=%s, site=%s\n", active ? "YES" : "NO", fstr, tstr, sstr);
|
||||||
char typech = tstr[0];
|
char typech = tstr[0];
|
||||||
file.printf("%3.3f %c %c %s\n", atof(fstr), typech, active ? '+' : '-', sstr);
|
file.printf("%3.3f %c %c %s\n", atof(fstr), typech, active ? '+' : '-', sstr);
|
||||||
|
@ -1029,6 +1029,7 @@ const char *handleEditPost(AsyncWebServerRequest *request) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// will be removed. its now in data/upd.html (for GET; POST to update.html still handled here)
|
||||||
const char *createUpdateForm(boolean run) {
|
const char *createUpdateForm(boolean run) {
|
||||||
char *ptr = message;
|
char *ptr = message;
|
||||||
strcpy(ptr, "<html><head><link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\"></head><body><form action=\"update.html\" method=\"post\">");
|
strcpy(ptr, "<html><head><link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\"></head><body><form action=\"update.html\" method=\"post\">");
|
||||||
|
@ -1902,7 +1903,7 @@ void setup()
|
||||||
Serial.println("AXP192 Begin FAIL");
|
Serial.println("AXP192 Begin FAIL");
|
||||||
}
|
}
|
||||||
axp.setPowerOutPut(AXP192_LDO2, AXP202_ON);
|
axp.setPowerOutPut(AXP192_LDO2, AXP202_ON);
|
||||||
if(sonde.config.type == TYPE_M5_CORE2) {
|
if (sonde.config.type == TYPE_M5_CORE2) {
|
||||||
// Display backlight on M5 Core2
|
// Display backlight on M5 Core2
|
||||||
axp.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
|
axp.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
|
||||||
axp.setDCDC3Voltage(3300);
|
axp.setDCDC3Voltage(3300);
|
||||||
|
@ -1931,7 +1932,9 @@ void setup()
|
||||||
delay(500);
|
delay(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sonde.config.batt_adc>=0) { pinMode(sonde.config.batt_adc, INPUT); }
|
if (sonde.config.batt_adc >= 0) {
|
||||||
|
pinMode(sonde.config.batt_adc, INPUT);
|
||||||
|
}
|
||||||
if (sonde.config.power_pout >= 0) { // for a heltec v2, pull GPIO21 low for display power
|
if (sonde.config.power_pout >= 0) { // for a heltec v2, pull GPIO21 low for display power
|
||||||
pinMode(sonde.config.power_pout & 127, OUTPUT);
|
pinMode(sonde.config.power_pout & 127, OUTPUT);
|
||||||
digitalWrite(sonde.config.power_pout & 127, sonde.config.power_pout & 128 ? 1 : 0);
|
digitalWrite(sonde.config.power_pout & 127, sonde.config.power_pout & 128 ? 1 : 0);
|
||||||
|
@ -2027,11 +2030,11 @@ void setup()
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
|
|
||||||
if(sonde.config.type == TYPE_M5_CORE2) {
|
if (sonde.config.type == TYPE_M5_CORE2) {
|
||||||
// Core2 uses Pin 38 for MISO
|
// Core2 uses Pin 38 for MISO
|
||||||
SPI.begin(18, 38, 23, -1);
|
SPI.begin(18, 38, 23, -1);
|
||||||
} else {
|
} else {
|
||||||
SPI.begin();
|
SPI.begin();
|
||||||
}
|
}
|
||||||
//Set most significant bit first
|
//Set most significant bit first
|
||||||
SPI.setBitOrder(MSBFIRST);
|
SPI.setBitOrder(MSBFIRST);
|
||||||
|
@ -2040,23 +2043,23 @@ void setup()
|
||||||
//Set data mode
|
//Set data mode
|
||||||
SPI.setDataMode(SPI_MODE0);
|
SPI.setDataMode(SPI_MODE0);
|
||||||
|
|
||||||
sx1278.setup(globalLock);
|
sx1278.setup(globalLock);
|
||||||
|
|
||||||
int i=0;
|
int i = 0;
|
||||||
while(++i<3) {
|
while (++i < 3) {
|
||||||
delay(500);
|
delay(500);
|
||||||
// == check the radio chip by setting default frequency =========== //
|
// == check the radio chip by setting default frequency =========== //
|
||||||
sx1278.ON();
|
sx1278.ON();
|
||||||
if (sx1278.setFrequency(402700000) == 0) {
|
if (sx1278.setFrequency(402700000) == 0) {
|
||||||
Serial.println(F("Setting freq: SUCCESS "));
|
Serial.println(F("Setting freq: SUCCESS "));
|
||||||
} else {
|
} else {
|
||||||
Serial.println(F("Setting freq: ERROR "));
|
Serial.println(F("Setting freq: ERROR "));
|
||||||
|
}
|
||||||
|
float f = sx1278.getFrequency();
|
||||||
|
Serial.print("Frequency set to ");
|
||||||
|
Serial.println(f);
|
||||||
|
// == check the radio chip by setting default frequency =========== //
|
||||||
}
|
}
|
||||||
float f = sx1278.getFrequency();
|
|
||||||
Serial.print("Frequency set to ");
|
|
||||||
Serial.println(f);
|
|
||||||
// == check the radio chip by setting default frequency =========== //
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//sx1278.setLNAGain(-48);
|
//sx1278.setLNAGain(-48);
|
||||||
|
@ -2863,17 +2866,25 @@ void execOTA() {
|
||||||
int contentLength = 0;
|
int contentLength = 0;
|
||||||
bool isValidContentType = false;
|
bool isValidContentType = false;
|
||||||
sonde.clearDisplay();
|
sonde.clearDisplay();
|
||||||
disp.rdis->setFont(FONT_SMALL);
|
uint8_t dispxs, dispys;
|
||||||
disp.rdis->drawString(0, 0, "C:");
|
if( ISOLED(sonde.config) ) {
|
||||||
String dispHost = updateHost.substring(0, 14);
|
disp.rdis->setFont(FONT_SMALL);
|
||||||
disp.rdis->drawString(2, 0, dispHost.c_str());
|
dispxs = dispys = 1;
|
||||||
|
} else {
|
||||||
|
disp.rdis->setFont(5);
|
||||||
|
dispxs = 18;
|
||||||
|
dispys = 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
String dispHost = updateHost.substring(0, 16);
|
||||||
|
disp.rdis->drawString(0, 0, dispHost.c_str());
|
||||||
|
|
||||||
Serial.println("Connecting to: " + updateHost);
|
Serial.println("Connecting to: " + updateHost);
|
||||||
// Connect to Update host
|
// Connect to Update host
|
||||||
if (client.connect(updateHost.c_str(), updatePort)) {
|
if (client.connect(updateHost.c_str(), updatePort)) {
|
||||||
// Connection succeeded, fecthing the bin
|
// Connection succeeded, fecthing the bin
|
||||||
Serial.println("Fetching bin: " + String(*updateBin));
|
Serial.println("Fetching bin: " + String(*updateBin));
|
||||||
disp.rdis->drawString(0, 1, "Fetching update");
|
disp.rdis->drawString(0, 1 * dispys, "Fetching update");
|
||||||
|
|
||||||
// Get the contents of the bin file
|
// Get the contents of the bin file
|
||||||
client.print(String("GET ") + *updateBin + " HTTP/1.1\r\n" +
|
client.print(String("GET ") + *updateBin + " HTTP/1.1\r\n" +
|
||||||
|
@ -2966,22 +2977,22 @@ void execOTA() {
|
||||||
|
|
||||||
// Check what is the contentLength and if content type is `application/octet-stream`
|
// Check what is the contentLength and if content type is `application/octet-stream`
|
||||||
Serial.println("contentLength : " + String(contentLength) + ", isValidContentType : " + String(isValidContentType));
|
Serial.println("contentLength : " + String(contentLength) + ", isValidContentType : " + String(isValidContentType));
|
||||||
disp.rdis->drawString(0, 2, "Len: ");
|
disp.rdis->drawString(0, 2 * dispys, "Len: ");
|
||||||
String cls = String(contentLength);
|
String cls = String(contentLength);
|
||||||
disp.rdis->drawString(5, 2, cls.c_str());
|
disp.rdis->drawString(5 * dispxs, 2 * dispys, cls.c_str());
|
||||||
|
|
||||||
// check contentLength and content type
|
// check contentLength and content type
|
||||||
if (contentLength && isValidContentType) {
|
if (contentLength && isValidContentType) {
|
||||||
// Check if there is enough to OTA Update
|
// Check if there is enough to OTA Update
|
||||||
bool canBegin = Update.begin(contentLength);
|
bool canBegin = Update.begin(contentLength);
|
||||||
disp.rdis->drawString(0, 4, "Starting update");
|
disp.rdis->drawString(0, 4 * dispys, "Starting update");
|
||||||
|
|
||||||
// If yes, begin
|
// If yes, begin
|
||||||
if (canBegin) {
|
if (canBegin) {
|
||||||
Serial.println("Begin OTA. This may take 2 - 5 mins to complete. Things might be quite for a while.. Patience!");
|
Serial.println("Begin OTA. This may take 2 - 5 mins to complete. Things might be quite for a while.. Patience!");
|
||||||
// No activity would appear on the Serial monitor
|
// No activity would appear on the Serial monitor
|
||||||
// So be patient. This may take 2 - 5mins to complete
|
// So be patient. This may take 2 - 5mins to complete
|
||||||
disp.rdis->drawString(0, 5, "Please wait!");
|
disp.rdis->drawString(0, 5 * dispys, "Please wait!");
|
||||||
size_t written = Update.writeStream(client);
|
size_t written = Update.writeStream(client);
|
||||||
|
|
||||||
if (written == contentLength) {
|
if (written == contentLength) {
|
||||||
|
@ -2996,7 +3007,7 @@ void execOTA() {
|
||||||
Serial.println("OTA done!");
|
Serial.println("OTA done!");
|
||||||
if (Update.isFinished()) {
|
if (Update.isFinished()) {
|
||||||
Serial.println("Update successfully completed. Rebooting.");
|
Serial.println("Update successfully completed. Rebooting.");
|
||||||
disp.rdis->drawString(0, 7, "Rebooting....");
|
disp.rdis->drawString(0, 7 * dispys, "Rebooting....");
|
||||||
delay(1000);
|
delay(1000);
|
||||||
ESP.restart();
|
ESP.restart();
|
||||||
} else {
|
} else {
|
||||||
|
@ -3223,7 +3234,9 @@ void sondehub_send_data(WiFiClient * client, SondeInfo * s, struct st_sondehub *
|
||||||
struct tm ts;
|
struct tm ts;
|
||||||
uint8_t realtype = s->type;
|
uint8_t realtype = s->type;
|
||||||
// config setting M10 and M20 will both decode both types, so use the real type that was decoded
|
// config setting M10 and M20 will both decode both types, so use the real type that was decoded
|
||||||
if(TYPE_IS_METEO(realtype)) { realtype = s->subtype==1 ? STYPE_M10 : STYPE_M20; }
|
if (TYPE_IS_METEO(realtype)) {
|
||||||
|
realtype = s->subtype == 1 ? STYPE_M10 : STYPE_M20;
|
||||||
|
}
|
||||||
|
|
||||||
// For DFM, s->time is data from subframe DAT8 (gps date/hh/mm), and sec is from DAT1 (gps sec/usec)
|
// For DFM, s->time is data from subframe DAT8 (gps date/hh/mm), and sec is from DAT1 (gps sec/usec)
|
||||||
// For all others, sec should always be 0 and time the exact time in seconds
|
// For all others, sec should always be 0 and time the exact time in seconds
|
||||||
|
@ -3237,7 +3250,7 @@ void sondehub_send_data(WiFiClient * client, SondeInfo * s, struct st_sondehub *
|
||||||
|
|
||||||
while (client->available() > 0) {
|
while (client->available() > 0) {
|
||||||
// data is available from remote server, process it...
|
// data is available from remote server, process it...
|
||||||
int cnt = client->readBytesUntil('\n', rs_msg, MSG_SIZE-1);
|
int cnt = client->readBytesUntil('\n', rs_msg, MSG_SIZE - 1);
|
||||||
rs_msg[cnt] = 0;
|
rs_msg[cnt] = 0;
|
||||||
Serial.println(rs_msg);
|
Serial.println(rs_msg);
|
||||||
// If something that looks like a valid HTTP response is received, we are ready to send the next data item
|
// If something that looks like a valid HTTP response is received, we are ready to send the next data item
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
Copyright © 2019-2021 by Hansi Reiser, DL9RDZ<br>
|
Copyright © 2019-2021 by Hansi Reiser, DL9RDZ<br>
|
||||||
(version %VERSION_ID%)<br><br>
|
(version %VERSION_ID%)<br><br>
|
||||||
|
|
||||||
<a href="/update.html">Check for update (requires TTGO internet connection via WiFi)</a><br><br>
|
<a href="/upd.html">Check for update (requires TTGO internet connection via WiFi)</a><br><br>
|
||||||
|
|
||||||
with contributions by Vigor and Xavier (M20 support),
|
with contributions by Vigor and Xavier (M20 support),
|
||||||
<a href="https://github.com/LukePrior">Luke Prior</a> and <a href="https://github.com/oh3bsg">OH3BSG</a> (SondeHub support),
|
<a href="https://github.com/LukePrior">Luke Prior</a> and <a href="https://github.com/oh3bsg">OH3BSG</a> (SondeHub support),
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
<html><head>
|
||||||
|
<link rel="stylesheet" type="text/css" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
|
||||||
|
<form action="update.html" method="post"><p>Currently installed: devel20210908-B14</p>
|
||||||
|
<p>
|
||||||
|
Available master: <span id="masterDiv">(...checking...)</span>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
Available devel: <span id="develDiv">(...checking...)</span>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
<input type="submit" name="master" value="Master-Update"></input><br>
|
||||||
|
<input type="submit" name="devel" value="Devel-Update"><br>
|
||||||
|
<p>Note: If suffix is the same, update should work fully. If the number is different, update contains changes in the file system. A full re-flash is required to get all new features, but the update should not break anything. If the letter is different, a full re-flash is mandatory, update will not work</p></form>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const masterInfo = document.getElementById('masterDiv');
|
||||||
|
const develInfo = document.getElementById('develDiv');
|
||||||
|
|
||||||
|
let request = new XMLHttpRequest();
|
||||||
|
request.open('GET', 'http://rdzsonde.mooo.com/master/update-info.html');
|
||||||
|
request.onload = function() {
|
||||||
|
masterInfo.innerHTML = request.response.replace(/<[^>]*>/g, '');
|
||||||
|
}
|
||||||
|
request.send();
|
||||||
|
let drequest = new XMLHttpRequest();
|
||||||
|
drequest.open('GET', 'http://rdzsonde.mooo.com/devel/update-info.html');
|
||||||
|
drequest.onload = function() {
|
||||||
|
develInfo.innerHTML= drequest.response.replace(/<[^>]*>/g, '');;
|
||||||
|
}
|
||||||
|
drequest.send();
|
||||||
|
</script>
|
||||||
|
</body></html>
|
|
@ -546,12 +546,6 @@ int DFM::decodeFrameDFM(uint8_t *data) {
|
||||||
deinterleave(data, 7, hamming_conf);
|
deinterleave(data, 7, hamming_conf);
|
||||||
deinterleave(data+7, 13, hamming_dat1);
|
deinterleave(data+7, 13, hamming_dat1);
|
||||||
deinterleave(data+20, 13, hamming_dat2);
|
deinterleave(data+20, 13, hamming_dat2);
|
||||||
#if 0
|
|
||||||
Serial.print("RAWCFG:");
|
|
||||||
for(int i=0; i<7*8; i++) {
|
|
||||||
Serial.print(hamming_conf[i]?"1":"0");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int ret0 = hamming(hamming_conf, 7, block_conf);
|
int ret0 = hamming(hamming_conf, 7, block_conf);
|
||||||
int ret1 = hamming(hamming_dat1, 13, block_dat1);
|
int ret1 = hamming(hamming_dat1, 13, block_dat1);
|
||||||
|
@ -575,22 +569,6 @@ int DFM::decodeFrameDFM(uint8_t *data) {
|
||||||
// moved to a single function in Sonde(). This function can be used for additional
|
// moved to a single function in Sonde(). This function can be used for additional
|
||||||
// processing here, that takes too long for doing in the RX task loop
|
// processing here, that takes too long for doing in the RX task loop
|
||||||
int DFM::waitRXcomplete() {
|
int DFM::waitRXcomplete() {
|
||||||
#if 0
|
|
||||||
int res=0;
|
|
||||||
uint32_t t0 = millis();
|
|
||||||
while( rxtask.receiveResult < 0 && millis()-t0 < 2000) { delay(50); }
|
|
||||||
|
|
||||||
if( rxtask.receiveResult<0 || rxtask.receiveResult==RX_TIMEOUT) {
|
|
||||||
res = RX_TIMEOUT;
|
|
||||||
} else if ( rxtask.receiveResult ==0) {
|
|
||||||
res = RX_OK;
|
|
||||||
} else {
|
|
||||||
res = RX_ERROR;
|
|
||||||
}
|
|
||||||
rxtask.receiveResult = -1;
|
|
||||||
Serial.printf("waitRXcomplete returning %d\n", res);
|
|
||||||
return res;
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -336,6 +336,7 @@ const struct gfxoffset_t gfxoffsets[]={
|
||||||
{ 13, 18 }, // 17+13-12 "j"
|
{ 13, 18 }, // 17+13-12 "j"
|
||||||
{ 17, 23 }, // 23+17-17
|
{ 17, 23 }, // 23+17-17
|
||||||
{ 4, 6}, // 6+4-4
|
{ 4, 6}, // 6+4-4
|
||||||
|
{ 25, 34 }, // 34 25 -25
|
||||||
};
|
};
|
||||||
static int ngfx = sizeof(gfl)/sizeof(GFXfont *);
|
static int ngfx = sizeof(gfl)/sizeof(GFXfont *);
|
||||||
|
|
||||||
|
@ -551,20 +552,6 @@ void ILI9225Display::drawTile(uint16_t x, uint16_t y, uint8_t cnt, uint8_t *tile
|
||||||
}
|
}
|
||||||
tft->endWrite();
|
tft->endWrite();
|
||||||
SPI_MUTEX_UNLOCK();
|
SPI_MUTEX_UNLOCK();
|
||||||
#if 0
|
|
||||||
int i,j;
|
|
||||||
tft->startWrite();
|
|
||||||
for(int i=0; i<cnt*8; i++) {
|
|
||||||
uint8_t v = tile_ptr[i];
|
|
||||||
for(j=0; j<8; j++) {
|
|
||||||
tft->drawPixel(8*x+i, 8*y+j, (v&0x01) ? COLOR_GREEN:COLOR_BLUE);
|
|
||||||
v >>= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tft->endWrite();
|
|
||||||
//tft->drawBitmap(x*8, y*8, tile_ptr, cnt*8, 8, COLOR_RED, COLOR_BLUE);
|
|
||||||
//???u8x8->drawTile(x, y, cnt, tile_ptr);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ILI9225Display::drawTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t color, boolean fill) {
|
void ILI9225Display::drawTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t color, boolean fill) {
|
||||||
|
@ -1081,11 +1068,6 @@ void Display::initFromFile(int index) {
|
||||||
what++;
|
what++;
|
||||||
newlayouts[idx].de[what].func = NULL;
|
newlayouts[idx].de[what].func = NULL;
|
||||||
} else {
|
} else {
|
||||||
#if 0
|
|
||||||
for(int i=0; i<12; i++) {
|
|
||||||
Serial.printf("action %d: %d\n", i, (int)newlayouts[idx].actions[i]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
what=-1;
|
what=-1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -62,46 +62,6 @@ int MP3H::setup(float frequency)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/// TODO: Maybe do this conditionally? -- maybe skip if afc if agcbw set to 0 or -1?
|
|
||||||
//// Step 1: Tentative AFC mode
|
|
||||||
sx1278.clearIRQFlags();
|
|
||||||
// preamble detector + AFC + AGC on
|
|
||||||
// wait for preamble interrupt within 2sec
|
|
||||||
sx1278.setBitrate(4800);
|
|
||||||
// DetectorOn=1, Preamble detector size 01, preamble tol 0x0A (10)
|
|
||||||
sx1278.setPreambleDetect(0x80 | 0x20 | 0x0A);
|
|
||||||
// Manual start RX, Enable Auto-AFC, Auto-AGC, RX Trigger (AGC+AFC)by preamble
|
|
||||||
sx1278.setRxConf(0x20 | 0x10 | 0x08 | 0x06);
|
|
||||||
// Packet config 1: fixed len, no mancecer, no crc, no address filter
|
|
||||||
// Packet config 2: packet mode, no home ctrl, no beackn, msb(packetlen)=0)
|
|
||||||
if(sx1278.setPacketConfig(0x08, 0x40)!=0) {
|
|
||||||
MP3H_DBG(Serial.println("Setting Packet config FAILED"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
// enable RX
|
|
||||||
sx1278.setPayloadLength(0);
|
|
||||||
sx1278.writeRegister(REG_OP_MODE, FSK_RX_MODE);
|
|
||||||
unsigned long t0 = millis();
|
|
||||||
MP3H_DBG(Serial.printf("MP3H::setup() AFC preamble search start at %ld\n",t0));
|
|
||||||
while( millis() - t0 < 1000 ) {
|
|
||||||
uint8_t value = sx1278.readRegister(REG_IRQ_FLAGS1);
|
|
||||||
if(value & 2) {
|
|
||||||
int32_t afc = sx1278.getAFC();
|
|
||||||
int16_t rssi = sx1278.getRSSI();
|
|
||||||
Serial.printf("MP3H::setup: preamble: AFC is %d, RSSI is %.1f\n", afc, rssi/2.0);
|
|
||||||
sonde.sondeList[rxtask.currentSonde].rssi = rssi;
|
|
||||||
sonde.sondeList[rxtask.currentSonde].afc = afc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
yield();
|
|
||||||
}
|
|
||||||
if( millis() - t0 >= 1000) {
|
|
||||||
Serial.println("Preamble scan for AFC: TIMEOUT\n");
|
|
||||||
return 1; // no preamble, so we may fail fast....
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//// Step 2: Real reception
|
//// Step 2: Real reception
|
||||||
// FSK standby mode, seems like otherweise baudrate cannot be changed?
|
// FSK standby mode, seems like otherweise baudrate cannot be changed?
|
||||||
sx1278.setFSK();
|
sx1278.setFSK();
|
||||||
|
|
|
@ -17,18 +17,6 @@
|
||||||
static byte data[800];
|
static byte data[800];
|
||||||
static int dpos = 0;
|
static int dpos = 0;
|
||||||
|
|
||||||
#if 0
|
|
||||||
// subframe is never used?
|
|
||||||
static byte subframe[51*16]; // 816 subframe bytes
|
|
||||||
// this is moved to sondeInfo->extra
|
|
||||||
static bool subframeReceived[51] = { false }; // do we have data for row
|
|
||||||
static bool subframeComplete = false; // is the subframe complete
|
|
||||||
// this is needed only locally, use a local variable on stack for that
|
|
||||||
static bool validExternalTemperature = false; // have received all the calibration frames for the external temperature
|
|
||||||
static bool validHumidity = false; // have received all the calibration frames for the humidity
|
|
||||||
static bool validRAExternalTemperature = false; // have received all the calibration frames for the external temperature
|
|
||||||
static bool validRAHumidity = false; // have received all the calibration frames for the humidity
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// whole 51 row frame as C structure
|
// whole 51 row frame as C structure
|
||||||
// taken from https://github.com/einergehtnochrein/ra-firmware
|
// taken from https://github.com/einergehtnochrein/ra-firmware
|
||||||
|
@ -715,13 +703,6 @@ int RS41::decode41(byte *data, int maxlen)
|
||||||
sonde.si()->countKT = cntdown;
|
sonde.si()->countKT = cntdown;
|
||||||
sonde.si()->crefKT = fnr;
|
sonde.si()->crefKT = fnr;
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
// process this subframe
|
|
||||||
int subframeOffset = 24; // 24 = 0x18, start of subframe data
|
|
||||||
byte receivedBytes[16];
|
|
||||||
memcpy( receivedBytes, data+p+subframeOffset, 16);
|
|
||||||
ProcessSubframe( receivedBytes, calnr );
|
|
||||||
#endif
|
|
||||||
ProcessSubframe( data+p+24, calnr );
|
ProcessSubframe( data+p+24, calnr );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -754,9 +735,11 @@ int RS41::decode41(byte *data, int maxlen)
|
||||||
uint32_t tempHumiMain = getint24(data, 560, p+18);
|
uint32_t tempHumiMain = getint24(data, 560, p+18);
|
||||||
uint32_t tempHumiRef1 = getint24(data, 560, p+21);
|
uint32_t tempHumiRef1 = getint24(data, 560, p+21);
|
||||||
uint32_t tempHumiRef2 = getint24(data, 560, p+24);
|
uint32_t tempHumiRef2 = getint24(data, 560, p+24);
|
||||||
|
#if 0
|
||||||
uint32_t pressureMain = getint24(data, 560, p+27);
|
uint32_t pressureMain = getint24(data, 560, p+27);
|
||||||
uint32_t pressureRef1 = getint24(data, 560, p+30);
|
uint32_t pressureRef1 = getint24(data, 560, p+30);
|
||||||
uint32_t pressureRef2 = getint24(data, 560, p+33);
|
uint32_t pressureRef2 = getint24(data, 560, p+33);
|
||||||
|
#endif
|
||||||
#if 0
|
#if 0
|
||||||
Serial.printf( "External temp: tempMeasMain = %ld, tempMeasRef1 = %ld, tempMeasRef2 = %ld\n", tempMeasMain, tempMeasRef1, tempMeasRef2 );
|
Serial.printf( "External temp: tempMeasMain = %ld, tempMeasRef1 = %ld, tempMeasRef2 = %ld\n", tempMeasMain, tempMeasRef1, tempMeasRef2 );
|
||||||
Serial.printf( "Rel Humidity: humidityMain = %ld, humidityRef1 = %ld, humidityRef2 = %ld\n", humidityMain, humidityRef1, humidityRef2 );
|
Serial.printf( "Rel Humidity: humidityMain = %ld, humidityRef1 = %ld, humidityRef2 = %ld\n", humidityMain, humidityRef1, humidityRef2 );
|
||||||
|
@ -856,22 +839,6 @@ int RS41::receive() {
|
||||||
int RS41::waitRXcomplete() {
|
int RS41::waitRXcomplete() {
|
||||||
// Currently not used. can be used for additinoal post-processing
|
// Currently not used. can be used for additinoal post-processing
|
||||||
// (required for RS92 to avoid FIFO overrun in rx task)
|
// (required for RS92 to avoid FIFO overrun in rx task)
|
||||||
#if 0
|
|
||||||
int res;
|
|
||||||
uint32_t t0 = millis();
|
|
||||||
while(rxtask.receiveResult<0 && millis()-t0 < 3000) { delay(50); }
|
|
||||||
|
|
||||||
if(rxtask.receiveResult<0 || rxtask.receiveResult==RX_TIMEOUT) {
|
|
||||||
res = RX_TIMEOUT;
|
|
||||||
} else if (rxtask.receiveResult==0) {
|
|
||||||
res = RX_OK;
|
|
||||||
} else {
|
|
||||||
res = RX_ERROR;
|
|
||||||
}
|
|
||||||
rxtask.receiveResult = -1;
|
|
||||||
Serial.printf("waitRXcomplete returning %d\n", res);
|
|
||||||
return res;
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#define RS92_DBG(x)
|
#define RS92_DBG(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//static uint16_t CRCTAB[256];
|
|
||||||
uint16_t *CRCTAB = NULL;
|
uint16_t *CRCTAB = NULL;
|
||||||
|
|
||||||
#define X2C_DIVR(a, b) ((b) != 0.0f ? (a)/(b) : (a))
|
#define X2C_DIVR(a, b) ((b) != 0.0f ? (a)/(b) : (a))
|
||||||
|
@ -39,27 +38,6 @@ static uint32_t X2C_LSH(uint32_t a, int32_t length, int32_t n)
|
||||||
return (a >> -n) & m;
|
return (a >> -n) & m;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static double atang2(double x, double y)
|
|
||||||
{
|
|
||||||
double w;
|
|
||||||
if (fabs(x)>fabs(y)) {
|
|
||||||
w = (double)atan((float)(X2C_DIVL(y,x)));
|
|
||||||
if (x<0.0) {
|
|
||||||
if (y>0.0) w = 3.1415926535898+w;
|
|
||||||
else w = w-3.1415926535898;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (y!=0.0) {
|
|
||||||
w = (double)(1.5707963267949f-atan((float)(X2C_DIVL(x,
|
|
||||||
y))));
|
|
||||||
if (y<0.0) w = w-3.1415926535898;
|
|
||||||
}
|
|
||||||
else w = 0.0;
|
|
||||||
return w;
|
|
||||||
} /* end atang2() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void Gencrctab(void)
|
static void Gencrctab(void)
|
||||||
{
|
{
|
||||||
uint16_t j;
|
uint16_t j;
|
||||||
|
@ -196,19 +174,6 @@ int RS92::setup(float frequency)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
int RS92::setFrequency(float frequency) {
|
|
||||||
Serial.print("RS92: setting RX frequency to ");
|
|
||||||
Serial.println(frequency);
|
|
||||||
int res = sx1278.setFrequency(frequency);
|
|
||||||
// enable RX
|
|
||||||
sx1278.setPayloadLength(0); // infinite for now...
|
|
||||||
|
|
||||||
sx1278.writeRegister(REG_OP_MODE, FSK_RX_MODE);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uint32_t RS92::bits2val(const uint8_t *bits, int len) {
|
uint32_t RS92::bits2val(const uint8_t *bits, int len) {
|
||||||
uint32_t val = 0;
|
uint32_t val = 0;
|
||||||
for (int j = 0; j < len; j++) {
|
for (int j = 0; j < len; j++) {
|
||||||
|
@ -448,34 +413,6 @@ void RS92::printRaw(uint8_t *data, int len)
|
||||||
Serial.println();
|
Serial.println();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
// I guess this is old copy&paste stuff from RS41??
|
|
||||||
int RS92::bitsToBytes(uint8_t *bits, uint8_t *bytes, int len)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for(i=0; i<len*4; i++) {
|
|
||||||
bytes[i/8] = (bytes[i/8]<<1) | (bits[i]?1:0);
|
|
||||||
}
|
|
||||||
bytes[(i-1)/8] &= 0x0F;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned char lookup[16] = {
|
|
||||||
0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
|
|
||||||
0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf, };
|
|
||||||
|
|
||||||
static uint8_t reverse(uint8_t n) {
|
|
||||||
return (lookup[n&0x0f] << 4) | lookup[n>>4];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static uint8_t scramble[64] = {150U,131U,62U,81U,177U,73U,8U,152U,50U,5U,89U,
|
|
||||||
14U,249U,68U,198U,38U,33U,96U,194U,234U,121U,93U,109U,161U,
|
|
||||||
84U,105U,71U,12U,220U,232U,92U,241U,247U,118U,130U,127U,7U,
|
|
||||||
153U,162U,44U,147U,124U,48U,99U,245U,16U,46U,97U,208U,188U,
|
|
||||||
180U,182U,6U,170U,244U,35U,120U,110U,59U,174U,191U,123U,76U,
|
|
||||||
193U};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void RS92::stobyte92(uint8_t b)
|
void RS92::stobyte92(uint8_t b)
|
||||||
{
|
{
|
||||||
|
@ -631,97 +568,9 @@ int RS92::waitRXcomplete() {
|
||||||
si->time = (gpx.gpssec/1000) + 86382 + gpx.week*604800 + 315878400UL;
|
si->time = (gpx.gpssec/1000) + 86382 + gpx.week*604800 + 315878400UL;
|
||||||
si->validTime = true;
|
si->validTime = true;
|
||||||
|
|
||||||
#if 0
|
|
||||||
int res=0;
|
|
||||||
uint32_t t0 = millis();
|
|
||||||
while( rxtask.receiveResult == 0xFFFF && millis()-t0 < 2000) { delay(20); }
|
|
||||||
|
|
||||||
if( rxtask.receiveResult<0 || rxtask.receiveResult==RX_TIMEOUT) {
|
|
||||||
res = RX_TIMEOUT;
|
|
||||||
} else if ( rxtask.receiveResult==0) {
|
|
||||||
res = RX_OK;
|
|
||||||
} else {
|
|
||||||
res = RX_ERROR;
|
|
||||||
}
|
|
||||||
rxtask.receiveResult = 0xFFFF;
|
|
||||||
Serial.printf("RS92::waitRXcomplete returning %d (%s)\n", res, RXstr[res]);
|
|
||||||
return res;
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
int oldwaitRXcomplete() {
|
|
||||||
Serial.println("RS92: receive frame...\n");
|
|
||||||
sx1278receiveData = true;
|
|
||||||
delay(6000); // done in other task....
|
|
||||||
//sx1278receiveData = false;
|
|
||||||
#if 0
|
|
||||||
//sx1278.setPayloadLength(518-8); // Expect 320-8 bytes or 518-8 bytes (8 byte header)
|
|
||||||
//sx1278.setPayloadLength(0); // infinite for now...
|
|
||||||
|
|
||||||
////// test code for continuous reception
|
|
||||||
// sx1278.receive(); /// active FSK RX mode -- already done above...
|
|
||||||
uint8_t value = sx1278.readRegister(REG_IRQ_FLAGS2);
|
|
||||||
unsigned long previous = millis();
|
|
||||||
|
|
||||||
byte ready=0;
|
|
||||||
uint32_t wait = 8000;
|
|
||||||
// while not yet done or FIFO not yet empty
|
|
||||||
// bit 6: FIFO Empty
|
|
||||||
// bit 2 payload ready
|
|
||||||
int by=0;
|
|
||||||
while( (!ready || bitRead(value,6)==0) && (millis() - previous < wait) )
|
|
||||||
{
|
|
||||||
if( bitRead(value, 7) ) { Serial.println("FIFO full"); }
|
|
||||||
if( bitRead(value, 4) ) { Serial.println("FIFO overflow"); }
|
|
||||||
if( bitRead(value,2)==1 ) ready=1;
|
|
||||||
if( bitRead(value, 6) == 0 ) { // FIFO not empty
|
|
||||||
byte data = sx1278.readRegister(REG_FIFO);
|
|
||||||
process8N1data(data);
|
|
||||||
by++;
|
|
||||||
#if 0
|
|
||||||
if(di==1) {
|
|
||||||
int rssi=getRSSI();
|
|
||||||
int fei=getFEI();
|
|
||||||
int afc=getAFC();
|
|
||||||
Serial.print("Test: RSSI="); Serial.println(rssi);
|
|
||||||
Serial.print("Test: FEI="); Serial.println(fei);
|
|
||||||
Serial.print("Test: AFC="); Serial.println(afc);
|
|
||||||
sonde.si()->rssi = rssi;
|
|
||||||
sonde.si()->afc = afc;
|
|
||||||
}
|
|
||||||
if(di>520) {
|
|
||||||
// TODO
|
|
||||||
Serial.println("TOO MUCH DATA");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
previous = millis(); // reset timeout after receiving data
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
value = sx1278.readRegister(REG_IRQ_FLAGS2);
|
|
||||||
}
|
|
||||||
Serial.printf("processed %d bytes before end/timeout\n", by);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////
|
|
||||||
#if 0
|
|
||||||
int e = sx1278.receivePacketTimeout(1000, data+8);
|
|
||||||
if(e) { Serial.println("TIMEOUT"); return RX_TIMEOUT; } //if timeout... return 1
|
|
||||||
|
|
||||||
printRaw(data, RS92MAXLEN);
|
|
||||||
//for(int i=0; i<RS92MAXLEN; i++) { data[i] = reverse(data[i]); }
|
|
||||||
//printRaw(data, MAXLEN);
|
|
||||||
//for(int i=0; i<RS92MAXLEN; i++) { data[i] = data[i] ^ scramble[i&0x3F]; }
|
|
||||||
//printRaw(data, MAXLEN);
|
|
||||||
//int res = decode41(data, RS92MAXLEN);
|
|
||||||
#endif
|
|
||||||
int res=0;
|
|
||||||
return res==0 ? RX_OK : RX_ERROR;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
RS92 rs92 = RS92();
|
RS92 rs92 = RS92();
|
||||||
|
|
|
@ -55,11 +55,6 @@ private:
|
||||||
void process8N1data(uint8_t data);
|
void process8N1data(uint8_t data);
|
||||||
void stobyte92(uint8_t byte);
|
void stobyte92(uint8_t byte);
|
||||||
void decodeframe92(uint8_t *data);
|
void decodeframe92(uint8_t *data);
|
||||||
#if 0
|
|
||||||
void dogps(const uint8_t *sf, int sf_len,
|
|
||||||
struct CONTEXTR9 * cont, uint32_t * timems,
|
|
||||||
uint32_t * gpstime);
|
|
||||||
#endif
|
|
||||||
uint32_t bits2val(const uint8_t *bits, int len);
|
uint32_t bits2val(const uint8_t *bits, int len);
|
||||||
void printRaw(uint8_t *data, int len);
|
void printRaw(uint8_t *data, int len);
|
||||||
int bitsToBytes(uint8_t *bits, uint8_t *bytes, int len);
|
int bitsToBytes(uint8_t *bits, uint8_t *bytes, int len);
|
||||||
|
|
|
@ -60,6 +60,8 @@ extern const char *sondeTypeLongStr[NSondeTypes];
|
||||||
extern const char sondeTypeChar[NSondeTypes];
|
extern const char sondeTypeChar[NSondeTypes];
|
||||||
extern const char *manufacturer_string[NSondeTypes];
|
extern const char *manufacturer_string[NSondeTypes];
|
||||||
|
|
||||||
|
#define ISOLED(cfg) ((cfg).disptype==0 || (cfg).disptype==2)
|
||||||
|
|
||||||
#define TYPE_IS_DFM(t) ( (t)==STYPE_DFM )
|
#define TYPE_IS_DFM(t) ( (t)==STYPE_DFM )
|
||||||
#define TYPE_IS_METEO(t) ( (t)==STYPE_M10 || (t)==STYPE_M20 )
|
#define TYPE_IS_METEO(t) ( (t)==STYPE_M10 || (t)==STYPE_M20 )
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ extern WiFiClient client;
|
||||||
char outbuf[128];
|
char outbuf[128];
|
||||||
uint8_t ephstate = EPH_NOTUSED;
|
uint8_t ephstate = EPH_NOTUSED;
|
||||||
//enum EPHSTATE { EPH_NOTUSED, EPH_PENDING, EPH_TIMEERR, EPH_ERROR, EPH_EPHERROR, EPH_GOOD };
|
//enum EPHSTATE { EPH_NOTUSED, EPH_PENDING, EPH_TIMEERR, EPH_ERROR, EPH_EPHERROR, EPH_GOOD };
|
||||||
char *ephtxt[] = { "Disabled", "Pending", "Time error", "Fetch error", "Read error", "Good" };
|
const char *ephtxt[] = { "Disabled", "Pending", "Time error", "Fetch error", "Read error", "Good" };
|
||||||
|
|
||||||
uint8_t getreply() {
|
uint8_t getreply() {
|
||||||
String s = client.readStringUntil('\n');
|
String s = client.readStringUntil('\n');
|
||||||
|
|
|
@ -7,5 +7,5 @@ void geteph();
|
||||||
enum EPHSTATE { EPH_NOTUSED, EPH_PENDING, EPH_TIMEERR, EPH_ERROR, EPH_EPHERROR, EPH_GOOD };
|
enum EPHSTATE { EPH_NOTUSED, EPH_PENDING, EPH_TIMEERR, EPH_ERROR, EPH_EPHERROR, EPH_GOOD };
|
||||||
|
|
||||||
extern uint8_t ephstate;
|
extern uint8_t ephstate;
|
||||||
extern char *ephtxt[];
|
extern const char *ephtxt[];
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
const char *version_name = "rdzTTGOsonde";
|
const char *version_name = "rdzTTGOsonde";
|
||||||
const char *version_id = "devel20210913";
|
const char *version_id = "devel20210914";
|
||||||
const int SPIFFS_MAJOR=2;
|
const int SPIFFS_MAJOR=2;
|
||||||
const int SPIFFS_MINOR=14;
|
const int SPIFFS_MINOR=14;
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
|
||||||
|
RS41, RS92
|
||||||
|
ID: R1234567 (letter, 7 digits)
|
||||||
|
ShortID: Same as ID
|
||||||
|
Serial: Same is ID
|
||||||
|
|
||||||
|
DFM:
|
||||||
|
ID: D12345678 (D + 8 ditis)
|
||||||
|
ShortID: 12345678 (serial without "D")
|
||||||
|
Serial: Same as ID
|
||||||
|
|
||||||
|
M10:
|
||||||
|
ID: ME96231F0 (ME + 7 hex digits)
|
||||||
|
ShortID: M95231F0 (ID without "E")
|
||||||
|
Serial: 9062104592 (10 numerical digits, as written on sonde)
|
||||||
|
|
||||||
|
Serial on Sonde: 810 2 13028
|
||||||
|
Data in frame:
|
||||||
|
|
||||||
|
M10:
|
||||||
|
APRS: MEAABCCCC, AA=rx[95] in hex, B = rx[93] in hex, CCCC=rx[96:97| in hex
|
||||||
|
fullID: A0B C DEEEE, A=rx[95]/16, B=rx[95] in hex, C=rx[93] in hex, C= rx[112:113]/8192&7 ; EEEE=rx[96:97]&8191
|
||||||
|
|
||||||
|
M20:
|
||||||
|
APRS: MEAABBBBB, AA=rx[18] in hex, BBBBB=rx[19:20] in decimal
|
||||||
|
fullID: AAA-B-CCCCC, AAA=rx[18]%128 in decimal, B=1+(rx[18]>>7), CCCCC=rx[19:20] in decimal
|
||||||
|
|
Ładowanie…
Reference in New Issue