Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d8e2fd5daa |
@@ -1,8 +1,7 @@
|
|||||||
RadioSonde Version 0.9.0
|
RadioSonde Version 0.8.8
|
||||||
============================
|
============================
|
||||||
<img src="http://xavier.debert.free.fr/RS/TTGO.jpg" width="50%"><img src="http://xavier.debert.free.fr/RS/TTGO2.jpg" width="50%">
|
<img src="http://xavier.debert.free.fr/RS/TTGO.jpg" width="50%"><img src="http://xavier.debert.free.fr/RS/TTGO2.jpg" width="50%">
|
||||||
<img src="http://xavier.debert.free.fr/RS/TTGO3.jpg" width="50%"><img src="http://xavier.debert.free.fr/RS/TTGO4.jpg" width="50%"><img src="http://xavier.debert.free.fr/RS/TTGO5.jpg" width="50%"><img src="http://xavier.debert.free.fr/RS/TTGO6.jpg" width="50%">
|
<img src="http://xavier.debert.free.fr/RS/TTGO3.jpg" width="50%"><img src="http://xavier.debert.free.fr/RS/TTGO4.jpg" width="50%"><img src="http://xavier.debert.free.fr/RS/TTGO5.jpg" width="50%">
|
||||||
<img src="http://xavier.debert.free.fr/RS/TTGO7.jpg" width="50%"><img src="http://xavier.debert.free.fr/RS/TTGO8.jpg" width="50%">
|
|
||||||
<img src="http://xavier.debert.free.fr/RS/Web4.png" width="20%"><img src="http://xavier.debert.free.fr/RS/Web.png" width="20%">
|
<img src="http://xavier.debert.free.fr/RS/Web4.png" width="20%"><img src="http://xavier.debert.free.fr/RS/Web.png" width="20%">
|
||||||
<img src="http://xavier.debert.free.fr/RS/Web3.png" width="20%"><img src="http://xavier.debert.free.fr/RS/Web2.png" width="20%">
|
<img src="http://xavier.debert.free.fr/RS/Web3.png" width="20%"><img src="http://xavier.debert.free.fr/RS/Web2.png" width="20%">
|
||||||
<img src="http://xavier.debert.free.fr/RS/Web5.png" width="20%"><img src="http://xavier.debert.free.fr/RS/Web6.png" width="20%">
|
<img src="http://xavier.debert.free.fr/RS/Web5.png" width="20%"><img src="http://xavier.debert.free.fr/RS/Web6.png" width="20%">
|
||||||
@@ -20,31 +19,14 @@ vous devez modifier dans config.txt, le port de l'écran OLED
|
|||||||
- TTGO v1: SDA=4 SCL=15, RST=16
|
- TTGO v1: SDA=4 SCL=15, RST=16
|
||||||
- TTGO v2: SDA=21 SCL=22, RST=16
|
- TTGO v2: SDA=21 SCL=22, RST=16
|
||||||
|
|
||||||
## Version en production 0.9.0 devel 0.9.1
|
## Version en production 0.8.5 devel 0.8.7
|
||||||
|
|
||||||
## 0.9.0
|
## 0.8.0
|
||||||
Add M20
|
travail de refonte et réécriture du code
|
||||||
|
|
||||||
## 0.8.8
|
## 0.8.1
|
||||||
|
|
||||||
Add M10+
|
modification de la partie Web
|
||||||
Add Temps restant avant impacte au sol si 99: 0. 0 soit le balon de la sonde n a pas encore éclaté, ou les informations ne sont pas disponible actuellement
|
|
||||||
Add Test Buzzer au démarrage "Arche Perdu" Lol pour des chasseurs de sonde!
|
|
||||||
Compatible Lilygo esp32 GPS inboard pin 34 Rx, 12 Tx
|
|
||||||
|
|
||||||
## 0.8.7
|
|
||||||
|
|
||||||
correction bug Buzzer Off->On->Off
|
|
||||||
Add GainLNA RX SX1278FSK on Web config paramètre
|
|
||||||
Add update OTA Os + DataWeb
|
|
||||||
correction bugs sondmap.html
|
|
||||||
correction text upgrade Os et DataWeb
|
|
||||||
correction texte boussole S et N
|
|
||||||
correction bugs distance 4928Km si lat et lon =0 erroné
|
|
||||||
correction bugs fonction Vbat
|
|
||||||
Add Telemetry width export data.csv
|
|
||||||
Suppression µSD incompatible avec pin SX1278FSK et SPI
|
|
||||||
Add transfert Telemetry To µSD on put SD automatic
|
|
||||||
|
|
||||||
## 0.8.5
|
## 0.8.5
|
||||||
|
|
||||||
@@ -57,21 +39,27 @@ Ajout fonction Smetre, Buzzer, QTH, Gps on off ...
|
|||||||
mise à jour OTA
|
mise à jour OTA
|
||||||
trop de modification pour toutes les expliciter!
|
trop de modification pour toutes les expliciter!
|
||||||
|
|
||||||
## 0.8.1
|
## 0.8.7
|
||||||
|
correction bug Buzzer Off->On->Off
|
||||||
|
Add GainLNA RX SX1278FSK on Web config paramètre
|
||||||
|
Add update OTA Os + DataWeb
|
||||||
|
correction bugs sondmap.html
|
||||||
|
correction text upgrade Os et DataWeb
|
||||||
|
correction texte boussole S et N
|
||||||
|
correction bugs distance 4928Km si lat et lon =0 erroné
|
||||||
|
correction bugs fonction Vbat
|
||||||
|
Add Telemetry width export data.csv
|
||||||
|
Suppression µSD incompatible avec pin SX1278FSK et SPI
|
||||||
|
Add transfert Telemetry To µSD on put SD automatic
|
||||||
|
|
||||||
modification de la partie Web
|
## 0.8.8
|
||||||
|
Add M10+
|
||||||
## 0.8.0
|
|
||||||
|
|
||||||
travail de refonte et réécriture du code
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## Les Boutons optionnel à ajouter(souder)
|
## Les Boutons optionnel à ajouter(souder)
|
||||||
sur les GPIO 1002 et 1004
|
sur les GPIO 1002 et 1004
|
||||||
attention:
|
attention:
|
||||||
|
|
||||||
+3.3V--[ SW ]---GPIO----[ R1 ]---/ R1=10 ou 12KOhms
|
+5V--[ SW ]---GPIO----[ R1 ]---/ R1=10 ou 12KOhms
|
||||||
|
|
||||||
- appuie court <1.5 seconds
|
- appuie court <1.5 seconds
|
||||||
- appuie double court 0.5 seconds
|
- appuie double court 0.5 seconds
|
||||||
@@ -121,4 +109,3 @@ voir Setup.md pour l'installation!
|
|||||||
Xavier
|
Xavier
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -187,9 +187,6 @@ void setupChannelList() {
|
|||||||
else if (space[1] == 'M') {
|
else if (space[1] == 'M') {
|
||||||
type = STYPE_M10;
|
type = STYPE_M10;
|
||||||
}
|
}
|
||||||
else if (space[1] == '2') {
|
|
||||||
type = STYPE_M20;
|
|
||||||
}
|
|
||||||
else continue;
|
else continue;
|
||||||
int active = space[3] == '+' ? 1 : 0;
|
int active = space[3] == '+' ? 1 : 0;
|
||||||
if (space[4] == ' ') {
|
if (space[4] == ' ') {
|
||||||
@@ -263,7 +260,7 @@ const char *handleQRGPost(AsyncWebServerRequest *request) {
|
|||||||
const char *tstr = tstring.c_str();
|
const char *tstr = tstring.c_str();
|
||||||
const char *sstr = sstring.c_str();
|
const char *sstr = sstring.c_str();
|
||||||
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[2] == '4' ? '4' : tstr[2] == '9' ? 'R' : tstr[1] == '1' ? 'M' : tstr[1] == '2' ? '2' : tstr[3]); // a bit ugly
|
char typech = (tstr[2] == '4' ? '4' : tstr[2] == '9' ? 'R' : tstr[0] == 'M' ? 'M' : tstr[3]); // a bit ugly
|
||||||
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);
|
||||||
}
|
}
|
||||||
file.close();
|
file.close();
|
||||||
@@ -377,7 +374,7 @@ void addSondeStatus(char *ptr, int i)
|
|||||||
strcat(ptr, "<table>");
|
strcat(ptr, "<table>");
|
||||||
sprintf(ptr + strlen(ptr), "<tr><td id=\"sfreq\">%3.3f MHz, Type: %s</td><tr><td>ID: %s", s->freq, sondeTypeStr[s->type],
|
sprintf(ptr + strlen(ptr), "<tr><td id=\"sfreq\">%3.3f MHz, Type: %s</td><tr><td>ID: %s", s->freq, sondeTypeStr[s->type],
|
||||||
s->validID ? s->id : "<?""?>");
|
s->validID ? s->id : "<?""?>");
|
||||||
if (s->validID && (s->type == STYPE_DFM06 || s->type == STYPE_DFM09 || s->type == STYPE_M10 || s->type == STYPE_M20)) {
|
if (s->validID && (s->type == STYPE_DFM06 || s->type == STYPE_DFM09 || s->type == STYPE_M10)) {
|
||||||
sprintf(ptr + strlen(ptr), " (ser: %s)", s->ser);
|
sprintf(ptr + strlen(ptr), " (ser: %s)", s->ser);
|
||||||
}
|
}
|
||||||
sprintf(ptr + strlen(ptr), "</td></tr><tr><td>QTHSonde: %.6f,%.6f h=%.0fm</td></tr>\n", s->lat, s->lon, s->alt);
|
sprintf(ptr + strlen(ptr), "</td></tr><tr><td>QTHSonde: %.6f,%.6f h=%.0fm</td></tr>\n", s->lat, s->lon, s->alt);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Frequency in Mhz (format nnn.nnn)
|
# Frequency in Mhz (format nnn.nnn)
|
||||||
# Type (4=RS41, R=RS92, 6=DFM normal, DFM-06, 9=DFM inverted, DFM-09, M=M10, 2=M20)
|
# Type (4=RS41, R=RS92, 6=DFM normal, DFM-06, 9=DFM inverted, DFM-09, M=M10)
|
||||||
#
|
#
|
||||||
400.000 9 + Test(FR)
|
400.000 9 + Test(FR)
|
||||||
401.500 4 - Santander(ES)
|
401.500 4 - Santander(ES)
|
||||||
@@ -20,5 +20,5 @@
|
|||||||
405.900 4 - Bergen_2
|
405.900 4 - Bergen_2
|
||||||
405.100 4 - Meppen_2
|
405.100 4 - Meppen_2
|
||||||
405.300 4 - Essen
|
405.300 4 - Essen
|
||||||
405.500 2 - Essen_2
|
405.500 4 - Essen_2
|
||||||
# end
|
# end
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
const char *version_name = "RadioSonde";
|
const char *version_name = "RadioSonde";
|
||||||
const char *version_id = "0.9.0";
|
const char *version_id = "0.8.8";
|
||||||
//const int SPIFFS_MAJOR=3;
|
//const int SPIFFS_MAJOR=3;
|
||||||
//const int SPIFFS_MINOR=5;
|
//const int SPIFFS_MINOR=5;
|
||||||
|
|||||||
@@ -1,552 +0,0 @@
|
|||||||
|
|
||||||
/* M20 decoder functions */
|
|
||||||
#include "M20.h"
|
|
||||||
#include "SX1278FSK.h"
|
|
||||||
#include "rsc.h"
|
|
||||||
#include "Sonde.h"
|
|
||||||
#include <SPIFFS.h>
|
|
||||||
|
|
||||||
// well...
|
|
||||||
//#include "rs92gps.h"
|
|
||||||
|
|
||||||
#define M20_DEBUG 1
|
|
||||||
|
|
||||||
#if M20_DEBUG
|
|
||||||
#define M20_DBG(x) x
|
|
||||||
#else
|
|
||||||
#define M20_DBG(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static byte data1[512];
|
|
||||||
static byte *dataptr=data1;
|
|
||||||
|
|
||||||
static uint8_t rxbitc;
|
|
||||||
static uint16_t rxbyte;
|
|
||||||
static int rxp=0;
|
|
||||||
static int haveNewFrame = 0;
|
|
||||||
static int lastFrame = 0;
|
|
||||||
static int headerDetected = 0;
|
|
||||||
|
|
||||||
int M20::setup(float frequency)
|
|
||||||
{
|
|
||||||
#if M20_DEBUG
|
|
||||||
Serial.println("Setup sx1278 for M20 sonde");
|
|
||||||
#endif
|
|
||||||
//if(!initialized) {
|
|
||||||
//Gencrctab();
|
|
||||||
//initrsc();
|
|
||||||
// not here for now.... get_eph("/brdc.19n");
|
|
||||||
// initialized = true;
|
|
||||||
//}
|
|
||||||
|
|
||||||
if(sx1278.ON()!=0) {
|
|
||||||
M20_DBG(Serial.println("Setting SX1278 power on FAILED"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if(sx1278.setFSK()!=0) {
|
|
||||||
M20_DBG(Serial.println("Setting FSJ mode FAILED"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if(sx1278.setBitrate(9600)!=0) {
|
|
||||||
M20_DBG(Serial.println("Setting bitrate 9600bit/s FAILED"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#if M20_DEBUG
|
|
||||||
float br = sx1278.getBitrate();
|
|
||||||
Serial.print("Exact bitrate is ");
|
|
||||||
Serial.println(br);
|
|
||||||
#endif
|
|
||||||
if(sx1278.setAFCBandwidth(sonde.config.rs92.rxbw)!=0) {
|
|
||||||
M20_DBG(Serial.printf("Setting AFC bandwidth %d Hz FAILED", sonde.config.rs92.rxbw));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if(sx1278.setRxBandwidth(sonde.config.rs92.rxbw)!=0) {
|
|
||||||
M20_DBG(Serial.printf("Setting RX bandwidth to %d Hz FAILED", sonde.config.rs92.rxbw));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable auto-AFC, auto-AGC, RX Trigger by preamble
|
|
||||||
if(sx1278.setRxConf(0x1E)!=0) {
|
|
||||||
M20_DBG(Serial.println("Setting RX Config FAILED"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
// Set autostart_RX to 01, preamble 0, SYNC detect==on, syncsize=3 (==4 byte
|
|
||||||
//char header[] = "0110.0101 0110.0110 1010.0101 1010.1010";
|
|
||||||
|
|
||||||
//const char *SYNC="\x10\xB6\xCA\x11\x22\x96\x12\xF8";
|
|
||||||
//const char *SYNC="\x08\x6D\x53\x88\x44\x69\x48\x1F";
|
|
||||||
// was 0x57
|
|
||||||
//const char *SYNC="\x99\x9A";
|
|
||||||
#if 1
|
|
||||||
// version 1, working with continuous RX
|
|
||||||
const char *SYNC="\x66\x65";
|
|
||||||
if(sx1278.setSyncConf(0x70, 2, (const uint8_t *)SYNC)!=0) {
|
|
||||||
M20_DBG(Serial.println("Setting SYNC Config FAILED"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
//if(sx1278.setPreambleDetect(0xA8)!=0) {
|
|
||||||
if(sx1278.setPreambleDetect(0x20)!=0) {
|
|
||||||
M20_DBG(Serial.println("Setting PreambleDetect FAILED"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if 0
|
|
||||||
// version 2, with per-packet rx start, untested
|
|
||||||
// header is 2a 10 65, i.e. with lsb first
|
|
||||||
// 0 0101 0100 1 0 0000 1000 1 0 1010 0110 1
|
|
||||||
// 10 10011001 10011010 01 10 10101010 01101010 01 10 01100110 10010110 01
|
|
||||||
// preamble 0x6A 0x66 0x6A
|
|
||||||
// i.e. preamble detector on (0x80), preamble detector size 1 (0x00), preample chip errors??? (0x0A)
|
|
||||||
// after 2a2a2a2a2a1065
|
|
||||||
if(sx1278.setPreambleDetect(0xA8)!=0) {
|
|
||||||
M20_DBG(Serial.println("Setting PreambleDetect FAILED"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
// sync config: ato restart (01), preamble polarity AA (0), sync on (1), resevered (0), syncsize 2+1 (010) => 0x52
|
|
||||||
const char *SYNC="\x6A\x66\x69";
|
|
||||||
if(sx1278.setSyncConf(0x52, 3, (const uint8_t *)SYNC)!=0) {
|
|
||||||
M20_DBG(Serial.println("Setting SYNC Config FAILED"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
// payload length is ((240 - 7)*10 +6)/8 = 292
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// 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) {
|
|
||||||
M20_DBG(Serial.println("Setting Packet config FAILED"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Serial.print("M20: setting RX frequency to ");
|
|
||||||
Serial.println(frequency);
|
|
||||||
int res = sx1278.setFrequency(frequency);
|
|
||||||
// enable RX
|
|
||||||
sx1278.setPayloadLength(0); // infinite for now...
|
|
||||||
//sx1278.setPayloadLength(292);
|
|
||||||
sx1278.writeRegister(REG_OP_MODE, FSK_RX_MODE);
|
|
||||||
|
|
||||||
#if M20_DEBUG
|
|
||||||
M20_DBG(Serial.println("Setting SX1278 config for M20 finished\n"); Serial.println());
|
|
||||||
#endif
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
int M20::setFrequency(float frequency) {
|
|
||||||
Serial.print("M20: 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
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
uint32_t M20::bits2val(const uint8_t *bits, int len) {
|
|
||||||
uint32_t val = 0;
|
|
||||||
for (int j = 0; j < len; j++) {
|
|
||||||
val |= (bits[j] << (len-1-j));
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
M20::M20() {
|
|
||||||
}
|
|
||||||
|
|
||||||
#define M20_FRAMELEN 70
|
|
||||||
#define M20_CRCPOS 22
|
|
||||||
|
|
||||||
void M20::printRaw(uint8_t *data, int len)
|
|
||||||
{
|
|
||||||
char buf[3];
|
|
||||||
int i;
|
|
||||||
for(i=0; i<len; i++) {
|
|
||||||
snprintf(buf, 3, "%02X ", data[i]);
|
|
||||||
Serial.print(buf);
|
|
||||||
}
|
|
||||||
Serial.println();
|
|
||||||
}
|
|
||||||
|
|
||||||
static int update_checkM20(int c, uint8_t b) {
|
|
||||||
int c0, c1, t, t6, t7, s;
|
|
||||||
c1 = c & 0xFF;
|
|
||||||
// B
|
|
||||||
b = (b >> 1) | ((b & 1) << 7);
|
|
||||||
b ^= (b >> 2) & 0xFF;
|
|
||||||
// A1
|
|
||||||
t6 = ( c & 1) ^ ((c >> 2) & 1) ^ ((c >> 4) & 1);
|
|
||||||
t7 = ((c >> 1) & 1) ^ ((c >> 3) & 1) ^ ((c >> 5) & 1);
|
|
||||||
t = (c & 0x3F) | (t6 << 6) | (t7 << 7);
|
|
||||||
// A2
|
|
||||||
s = (c >> 7) & 0xFF;
|
|
||||||
s ^= (s >> 2) & 0xFF;
|
|
||||||
c0 = b ^ t ^ s;
|
|
||||||
return ((c1 << 8) | c0) & 0xFFFF;
|
|
||||||
}
|
|
||||||
static bool checkM20crc(uint8_t *msg) {
|
|
||||||
int i, cs, cs1;
|
|
||||||
cs = 0;
|
|
||||||
for (i = 0; i < M20_CRCPOS; i++) {
|
|
||||||
cs = update_checkM20(cs, msg[i]);
|
|
||||||
}
|
|
||||||
cs = cs & 0xFFFF;
|
|
||||||
cs1 = (msg[M20_CRCPOS] << 8) | msg[M20_CRCPOS+1];
|
|
||||||
return (cs1 == cs);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef uint32_t SET256[8];
|
|
||||||
static SET256 sondeudp_VARSET = {0x03BBBBF0UL,0x80600000UL,0x06A001A0UL,
|
|
||||||
0x0000001CUL,0x00000000UL,0x00000000UL,0x00000000UL,
|
|
||||||
0x00000000UL};
|
|
||||||
// VARSET=SET256{4..9,11..13,15..17,19..21,23..25,53..54,63,69,71,72,85,87,89,90,98..100};
|
|
||||||
|
|
||||||
static uint8_t fixcnt[M20_FRAMELEN];
|
|
||||||
static uint8_t fixbytes[M20_FRAMELEN];
|
|
||||||
|
|
||||||
static int32_t getint32(uint8_t *data) {
|
|
||||||
return (int32_t)( data[3]|(data[2]<<8)|(data[1]<<16)|(data[0]<<24) );
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t getint24(uint8_t *data) {
|
|
||||||
return (int32_t)(data[2]|(data[1]<<8)|(data[0]<<16) );
|
|
||||||
}
|
|
||||||
|
|
||||||
static int16_t getint16(uint8_t *data) {
|
|
||||||
return (int16_t)(data[1]|((uint16_t)data[0]<<8));
|
|
||||||
}
|
|
||||||
|
|
||||||
static char dez(uint8_t nr) {
|
|
||||||
nr = nr%10;
|
|
||||||
return '0'+nr;
|
|
||||||
}
|
|
||||||
static char hex(uint8_t nr) {
|
|
||||||
nr = nr&0x0f;
|
|
||||||
if(nr<10) return '0'+nr;
|
|
||||||
else return 'A'+nr-10;
|
|
||||||
}
|
|
||||||
const static float DEGMUL = 1.0/0xB60B60;
|
|
||||||
#define VMUL 0.005
|
|
||||||
#define VMUL_M20 0.01
|
|
||||||
#ifndef PI
|
|
||||||
#define PI (3.1415926535897932384626433832795)
|
|
||||||
#endif
|
|
||||||
#define RAD (PI/180)
|
|
||||||
|
|
||||||
|
|
||||||
// ret: 1=frame ok; 2=frame with errors; 0=ignored frame (m20dop-alternativ)
|
|
||||||
int M20::decodeframeM20(uint8_t *data) {
|
|
||||||
int repairstep = 16;
|
|
||||||
int repl = 0;
|
|
||||||
bool crcok;
|
|
||||||
// error correction, inspired by oe5dxl's sondeudp
|
|
||||||
do {
|
|
||||||
crcok = checkM20crc(data);
|
|
||||||
if(crcok) break;
|
|
||||||
repl = 0;
|
|
||||||
for(int i=0; i<M20_CRCPOS; i++) {
|
|
||||||
if( ((sondeudp_VARSET[i/32]&(1<<(i%32))) != 1) && (fixcnt[i]>=repairstep) ) {
|
|
||||||
repl++;
|
|
||||||
data[i] = fixbytes[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
repairstep >>= 1;
|
|
||||||
} while(repairstep>0);
|
|
||||||
if(crcok) {
|
|
||||||
for(int i=0; i<M20_CRCPOS; i++) {
|
|
||||||
if(fixbytes[i]==data[i] &&fixcnt[i]<255) fixcnt[i]++;
|
|
||||||
else { fixcnt[i]=0; fixbytes[i]=data[i]; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Serial.println(crcok?"CRC OK":"CRC NOT OK");
|
|
||||||
//M20 0x20
|
|
||||||
if(data[1]==0x20 && data[2]==0x20) {
|
|
||||||
Serial.println("Decoding...");
|
|
||||||
// Its a M20
|
|
||||||
// getid...
|
|
||||||
char ids[11]={'M','E','0','0','0','0','0','0','0','0','0'};
|
|
||||||
/*
|
|
||||||
ids[0] = 'M';
|
|
||||||
ids[1] = 'E';
|
|
||||||
ids[2] = hex(data[95]/16);
|
|
||||||
ids[3] = hex(data[95]);
|
|
||||||
ids[4] = hex(data[93]);
|
|
||||||
uint32_t id = data[96] + data[97]*256;
|
|
||||||
ids[5] = hex(id/4096);
|
|
||||||
ids[6] = hex(id/256);
|
|
||||||
ids[7] = hex(id/16);
|
|
||||||
ids[8] = hex(id);
|
|
||||||
ids[9] = 0;
|
|
||||||
strncpy(sonde.si()->id, ids, 10);
|
|
||||||
ids[0] = hex(data[95]/16);
|
|
||||||
ids[1] = dez((data[95]&0x0f)/10);
|
|
||||||
ids[2] = dez((data[95]&0x0f));
|
|
||||||
ids[3] = dez(data[93]);
|
|
||||||
ids[4] = dez(id>>13);
|
|
||||||
id &= 0x1fff;
|
|
||||||
ids[5] = dez(id/1000);
|
|
||||||
ids[6] = dez((id/100)%10);
|
|
||||||
ids[7] = dez((id/10)%10);
|
|
||||||
ids[8] = dez(id%10);
|
|
||||||
*/
|
|
||||||
uint32_t id = data[96] + data[97]*256;
|
|
||||||
id &= 0x1fff;
|
|
||||||
strncpy(sonde.si()->ser, ids, 10);
|
|
||||||
sonde.si()->validID = true;
|
|
||||||
Serial.printf("ID is %s [%02x %02x %d]\n", ids, data[95], data[93], id);
|
|
||||||
// ID printed on sonde is ...-.-abbbb, with a=id>>13, bbbb=id&0x1fff in decimal
|
|
||||||
// position data
|
|
||||||
// 0x1C 4 byte
|
|
||||||
// DEGMUL like M10
|
|
||||||
sonde.si()->lat = getint32(data+28) * DEGMUL;
|
|
||||||
//0x20 4 byte
|
|
||||||
sonde.si()->lon = getint32(data+32) * DEGMUL;
|
|
||||||
//0x08 3 byte
|
|
||||||
sonde.si()->alt = getint24(data+8) * 0.01;
|
|
||||||
//0x0B 2 byte
|
|
||||||
//VMUL_M20 specific
|
|
||||||
float ve = getint16(data+11)*VMUL_M20;
|
|
||||||
//0x0D 2 byte
|
|
||||||
float vn = getint16(data+13)*VMUL_M20;
|
|
||||||
//0x18 2 byte
|
|
||||||
sonde.si()->vs = getint16(data+24) * VMUL_M20;
|
|
||||||
sonde.si()->hs = sqrt(ve*ve+vn*vn);
|
|
||||||
float dir = atan2(vn, ve)*(1.0/RAD);
|
|
||||||
if(dir<0) dir+=360;
|
|
||||||
sonde.si()->dir = dir;
|
|
||||||
sonde.si()->validPos = 0x3f;
|
|
||||||
/*
|
|
||||||
uint32_t gpstime = getint32(data+10);
|
|
||||||
uint16_t gpsweek = getint16(data+32);
|
|
||||||
// UTC is GPSTIME - 18s (24*60*60-18 = 86382)
|
|
||||||
// one week = 7*24*60*60 = 604800 seconds
|
|
||||||
// unix epoch starts jan 1st 1970 0:00
|
|
||||||
// gps time starts jan 6, 1980 0:00. thats 315964800 epoch seconds.
|
|
||||||
// subtracting 86400 yields 315878400UL
|
|
||||||
sonde.si()->time = (gpstime/1000) + 86382 + gpsweek*604800 + 315878400UL;
|
|
||||||
*/
|
|
||||||
//0x0F 3 byte
|
|
||||||
uint32_t gpstime = getint24(data+15);
|
|
||||||
uint16_t gpsweek = getint16(data+26);
|
|
||||||
sonde.si()->time = gpstime + 86382 + gpsweek*604800 + 315878400UL;
|
|
||||||
|
|
||||||
sonde.si()->validTime = true;
|
|
||||||
} else {
|
|
||||||
Serial.printf("data is %02x %02x %02x\n", data[0], data[1], data[2]);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return crcok?1:2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t rxdata;
|
|
||||||
static bool rxsearching=true;
|
|
||||||
|
|
||||||
// search for
|
|
||||||
// //101001100110011010011010011001100110100110101010100110101001
|
|
||||||
// //1010011001100110100110100110 0110.0110 1001.1010 1010.1001 1010.1001 => 0x669AA9A9
|
|
||||||
void M20::processM20data(uint8_t dt)
|
|
||||||
{
|
|
||||||
for(int i=0; i<8; i++) {
|
|
||||||
uint8_t d = (dt&0x80)?1:0;
|
|
||||||
dt <<= 1;
|
|
||||||
rxdata = (rxdata<<1) | d;
|
|
||||||
//uint8_t value = ((rxdata>>1)^rxdata)&0x01;
|
|
||||||
//if((rxbitc&1)==1) { rxbyte = (rxbyte>>1) + ((value)<<8); } // mancester decoded data
|
|
||||||
//rxbyte = (rxbyte>>1) | (d<<8);
|
|
||||||
if( (rxbitc&1)==0 ) {
|
|
||||||
// "bit1"
|
|
||||||
rxbyte = (rxbyte<<1) | d;
|
|
||||||
} else {
|
|
||||||
// "bit2" ==> 01 or 10 => 1, otherweise => 0
|
|
||||||
rxbyte = rxbyte ^ d;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
if(rxsearching) {
|
|
||||||
if( rxdata == 0xcccca64c || rxdata == 0x333359b3 ) {
|
|
||||||
rxsearching = false;
|
|
||||||
rxbitc = 0;
|
|
||||||
rxp = 0;
|
|
||||||
#if 1
|
|
||||||
int rssi=sx1278.getRSSI();
|
|
||||||
int fei=sx1278.getFEI();
|
|
||||||
int afc=sx1278.getAFC();
|
|
||||||
Serial.print("Test: RSSI="); Serial.print(rssi);
|
|
||||||
Serial.print(" FEI="); Serial.print(fei);
|
|
||||||
Serial.print(" AFC="); Serial.println(afc);
|
|
||||||
sonde.si()->rssi = rssi;
|
|
||||||
sonde.si()->afc = afc;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
rxbitc = (rxbitc+1)%16; // 16;
|
|
||||||
if(rxbitc == 0) { // got 8 data bit
|
|
||||||
//Serial.printf("%03x ",rxbyte);
|
|
||||||
dataptr[rxp++] = rxbyte&0xff; // (rxbyte>>1)&0xff;
|
|
||||||
#if 0
|
|
||||||
if(rxp==7 && dataptr[6] != 0x65) {
|
|
||||||
Serial.printf("wrong start: %02x\n",dataptr[6]);
|
|
||||||
rxsearching = true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if(rxp>=M20_FRAMELEN) {
|
|
||||||
rxsearching = true;
|
|
||||||
haveNewFrame = decodeframeM20(dataptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int M20::receive() {
|
|
||||||
unsigned long t0 = millis();
|
|
||||||
Serial.printf("M20::receive() start at %ld\n",t0);
|
|
||||||
while( millis() - t0 < 1000 ) {
|
|
||||||
uint8_t value = sx1278.readRegister(REG_IRQ_FLAGS2);
|
|
||||||
if ( bitRead(value, 7) ) {
|
|
||||||
Serial.println("FIFO full");
|
|
||||||
}
|
|
||||||
if ( bitRead(value, 4) ) {
|
|
||||||
Serial.println("FIFO overflow");
|
|
||||||
}
|
|
||||||
if ( bitRead(value, 2) == 1 ) {
|
|
||||||
Serial.println("FIFO: ready()");
|
|
||||||
sx1278.clearIRQFlags();
|
|
||||||
}
|
|
||||||
if(bitRead(value, 6) == 0) { // while FIFO not empty
|
|
||||||
byte data = sx1278.readRegister(REG_FIFO);
|
|
||||||
//Serial.printf("%02x",data);
|
|
||||||
processM20data(data);
|
|
||||||
value = sx1278.readRegister(REG_IRQ_FLAGS2);
|
|
||||||
} else {
|
|
||||||
if(headerDetected) {
|
|
||||||
t0 = millis(); // restart timer... don't time out if header detected...
|
|
||||||
headerDetected = 0;
|
|
||||||
}
|
|
||||||
if(haveNewFrame) {
|
|
||||||
Serial.printf("M20::receive(): new frame complete after %ldms\n", millis()-t0);
|
|
||||||
printRaw(dataptr, M20_FRAMELEN);
|
|
||||||
int retval = haveNewFrame==1 ? RX_OK: RX_ERROR;
|
|
||||||
haveNewFrame = 0;
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
delay(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Serial.printf("M20::receive() timed out\n");
|
|
||||||
return RX_TIMEOUT; // TODO RX_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define M20MAXLEN (240)
|
|
||||||
int M20::waitRXcomplete() {
|
|
||||||
// called after complete...
|
|
||||||
#if 0
|
|
||||||
Serial.printf("decoding frame %d\n", lastFrame);
|
|
||||||
print_frame(lastFrame==1?data1:data2, 240);
|
|
||||||
SondeInfo *si = sonde.sondeList+rxtask.receiveSonde;
|
|
||||||
si->lat = gpx.lat;
|
|
||||||
si->lon = gpx.lon;
|
|
||||||
si->alt = gpx.alt;
|
|
||||||
si->vs = gpx.vU;
|
|
||||||
si->hs = gpx.vH;
|
|
||||||
si->dir = gpx.vD;
|
|
||||||
si->validPos = 0x3f;
|
|
||||||
memcpy(si->id, gpx.id, 9);
|
|
||||||
si->validID = true;
|
|
||||||
|
|
||||||
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("M20::waitRXcomplete returning %d (%s)\n", res, RXstr[res]);
|
|
||||||
return res;
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
int oldwaitRXcomplete() {
|
|
||||||
Serial.println("M20: 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, M20MAXLEN);
|
|
||||||
//for(int i=0; i<M20MAXLEN; i++) { data[i] = reverse(data[i]); }
|
|
||||||
//printRaw(data, MAXLEN);
|
|
||||||
//for(int i=0; i<M20MAXLEN; i++) { data[i] = data[i] ^ scramble[i&0x3F]; }
|
|
||||||
//printRaw(data, MAXLEN);
|
|
||||||
//int res = decode41(data, M20MAXLEN);
|
|
||||||
#endif
|
|
||||||
int res=0;
|
|
||||||
return res==0 ? RX_OK : RX_ERROR;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
M20 m20 = M20();
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
* M20.h
|
|
||||||
* Functions for decoding Meteomodem M20 sondes with SX127x chips
|
|
||||||
* Copyright (C) 2019 Hansi Reiser, dl9rdz
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef M20_h
|
|
||||||
#define M20_h
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <Arduino.h>
|
|
||||||
#ifndef inttypes_h
|
|
||||||
#include <inttypes.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
struct CONTEXTR9 {
|
|
||||||
char calibdata[512];
|
|
||||||
uint32_t calibok;
|
|
||||||
char mesok;
|
|
||||||
char posok;
|
|
||||||
char framesent;
|
|
||||||
double lat;
|
|
||||||
double lon;
|
|
||||||
double heig;
|
|
||||||
double speed;
|
|
||||||
double dir;
|
|
||||||
double climb;
|
|
||||||
double lastlat;
|
|
||||||
double laslong;
|
|
||||||
double lastalt;
|
|
||||||
double lastspeed;
|
|
||||||
double lastdir;
|
|
||||||
double lastclb;
|
|
||||||
float hrmsc;
|
|
||||||
float vrmsc;
|
|
||||||
double hp;
|
|
||||||
double hyg;
|
|
||||||
double temp;
|
|
||||||
double ozontemp;
|
|
||||||
double ozon;
|
|
||||||
uint32_t goodsats;
|
|
||||||
uint32_t timems;
|
|
||||||
uint32_t framenum;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Main class */
|
|
||||||
class M20
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
void printRaw(uint8_t *data, int len);
|
|
||||||
void processM20data(uint8_t data);
|
|
||||||
int decodeframeM20(uint8_t *data);
|
|
||||||
#if 0
|
|
||||||
void stobyte92(uint8_t byte);
|
|
||||||
void dogps(const uint8_t *sf, int sf_len,
|
|
||||||
struct CONTEXTR9 * cont, uint32_t * timems,
|
|
||||||
uint32_t * gpstime);
|
|
||||||
uint32_t bits2val(const uint8_t *bits, int len);
|
|
||||||
int bitsToBytes(uint8_t *bits, uint8_t *bytes, int len);
|
|
||||||
int decode92(byte *data, int maxlen);
|
|
||||||
|
|
||||||
uint8_t hamming_conf[ 7*8]; // 7*8=56
|
|
||||||
uint8_t hamming_dat1[13*8]; // 13*8=104
|
|
||||||
uint8_t hamming_dat2[13*8];
|
|
||||||
|
|
||||||
uint8_t block_conf[ 7*4]; // 7*4=28
|
|
||||||
uint8_t block_dat1[13*4]; // 13*4=52
|
|
||||||
uint8_t block_dat2[13*4];
|
|
||||||
|
|
||||||
uint8_t H[4][8] = // extended Hamming(8,4) particy check matrix
|
|
||||||
{{ 0, 1, 1, 1, 1, 0, 0, 0},
|
|
||||||
{ 1, 0, 1, 1, 0, 1, 0, 0},
|
|
||||||
{ 1, 1, 0, 1, 0, 0, 1, 0},
|
|
||||||
{ 1, 1, 1, 0, 0, 0, 0, 1}};
|
|
||||||
uint8_t He[8] = { 0x7, 0xB, 0xD, 0xE, 0x8, 0x4, 0x2, 0x1}; // Spalten von H:
|
|
||||||
// 1-bit-error-Syndrome
|
|
||||||
boolean initialized = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
public:
|
|
||||||
M20();
|
|
||||||
int setup(float frequency);
|
|
||||||
int receive();
|
|
||||||
int waitRXcomplete();
|
|
||||||
|
|
||||||
//int use_ecc = 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern M20 m20;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -30,7 +30,7 @@ extern SemaphoreHandle_t axpSemaphore;
|
|||||||
|
|
||||||
SPIClass spiDisp(HSPI);
|
SPIClass spiDisp(HSPI);
|
||||||
|
|
||||||
const char *sondeTypeStr[NSondeTypes] = { "DFM6", "DFM9", "RS41", "RS92", "M10 ", "M20 " };
|
const char *sondeTypeStr[NSondeTypes] = { "DFM6", "DFM9", "RS41", "RS92", "M10 " };
|
||||||
|
|
||||||
byte myIP_tiles[8*11];
|
byte myIP_tiles[8*11];
|
||||||
static uint8_t ap_tile[8]={0x00,0x04,0x22,0x92, 0x92, 0x22, 0x04, 0x00};
|
static uint8_t ap_tile[8]={0x00,0x04,0x22,0x92, 0x92, 0x22, 0x04, 0x00};
|
||||||
@@ -271,7 +271,7 @@ void U8x8Display::welcome() {
|
|||||||
drawString(8 - strlen(version_name) / 2, 1, version_name);
|
drawString(8 - strlen(version_name) / 2, 1, version_name);
|
||||||
//drawString(8 - strlen(version_id) / 2, 2, version_id);
|
//drawString(8 - strlen(version_id) / 2, 2, version_id);
|
||||||
setFont(FONT_SMALL);
|
setFont(FONT_SMALL);
|
||||||
drawString(0, 4, "RS41/92,DFM,M1&2");
|
drawString(0, 4, "RS41/92,DFM,M10");
|
||||||
drawString(0, 6, "by FRS2013 ");
|
drawString(0, 6, "by FRS2013 ");
|
||||||
drawString(11, 6, version_id);
|
drawString(11, 6, version_id);
|
||||||
}
|
}
|
||||||
@@ -48,7 +48,7 @@ int M10::setup(float frequency)
|
|||||||
M10_DBG(Serial.println("Setting FSJ mode FAILED"));
|
M10_DBG(Serial.println("Setting FSJ mode FAILED"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if(sx1278.setBitrate(9616)!=0) {
|
if(sx1278.setBitrate(9600)!=0) {
|
||||||
M10_DBG(Serial.println("Setting bitrate 9600bit/s FAILED"));
|
M10_DBG(Serial.println("Setting bitrate 9600bit/s FAILED"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,6 @@
|
|||||||
#include "RS92.h"
|
#include "RS92.h"
|
||||||
#include "DFM.h"
|
#include "DFM.h"
|
||||||
#include "M10.h"
|
#include "M10.h"
|
||||||
#include "M20.h"
|
|
||||||
#include "SX1278FSK.h"
|
#include "SX1278FSK.h"
|
||||||
#include "Display.h"
|
#include "Display.h"
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
@@ -437,9 +436,6 @@ void Sonde::setup() {
|
|||||||
case STYPE_M10:
|
case STYPE_M10:
|
||||||
m10.setup( sondeList[rxtask.currentSonde].freq * 1000000);
|
m10.setup( sondeList[rxtask.currentSonde].freq * 1000000);
|
||||||
break;
|
break;
|
||||||
case STYPE_M20:
|
|
||||||
m20.setup( sondeList[rxtask.currentSonde].freq * 1000000);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
// debug
|
// debug
|
||||||
float afcbw = sx1278.getAFCBandwidth();
|
float afcbw = sx1278.getAFCBandwidth();
|
||||||
@@ -462,9 +458,6 @@ void Sonde::receive() {
|
|||||||
case STYPE_M10:
|
case STYPE_M10:
|
||||||
res = m10.receive();
|
res = m10.receive();
|
||||||
break;
|
break;
|
||||||
case STYPE_M20:
|
|
||||||
res = m20.receive();
|
|
||||||
break;
|
|
||||||
case STYPE_DFM06:
|
case STYPE_DFM06:
|
||||||
case STYPE_DFM09:
|
case STYPE_DFM09:
|
||||||
res = dfm.receive();
|
res = dfm.receive();
|
||||||
@@ -557,9 +550,6 @@ rxloop:
|
|||||||
case STYPE_M10:
|
case STYPE_M10:
|
||||||
m10.waitRXcomplete();
|
m10.waitRXcomplete();
|
||||||
break;
|
break;
|
||||||
case STYPE_M20:
|
|
||||||
m20.waitRXcomplete();
|
|
||||||
break;
|
|
||||||
case STYPE_DFM06:
|
case STYPE_DFM06:
|
||||||
case STYPE_DFM09:
|
case STYPE_DFM09:
|
||||||
dfm.waitRXcomplete();
|
dfm.waitRXcomplete();
|
||||||
@@ -46,8 +46,8 @@ extern const char *RXstr[];
|
|||||||
// 01000000 => goto sonde -1
|
// 01000000 => goto sonde -1
|
||||||
// 01000001 => goto sonde +1
|
// 01000001 => goto sonde +1
|
||||||
|
|
||||||
#define NSondeTypes 6
|
#define NSondeTypes 5
|
||||||
enum SondeType { STYPE_DFM06, STYPE_DFM09, STYPE_RS41, STYPE_RS92, STYPE_M10, STYPE_M20 };
|
enum SondeType { STYPE_DFM06, STYPE_DFM09, STYPE_RS41, STYPE_RS92, STYPE_M10 };
|
||||||
extern const char *sondeTypeStr[NSondeTypes];
|
extern const char *sondeTypeStr[NSondeTypes];
|
||||||
|
|
||||||
typedef struct st_sondeinfo {
|
typedef struct st_sondeinfo {
|
||||||
Binary file not shown.
Reference in New Issue
Block a user