diff --git a/RX_FSK/RX_FSK.ino b/RX_FSK/RX_FSK.ino index 98b7eed..f061b08 100644 --- a/RX_FSK/RX_FSK.ino +++ b/RX_FSK/RX_FSK.ino @@ -1924,17 +1924,46 @@ void setup() // Display backlight on M5 Core2 axp.setPowerOutPut(AXP192_DCDC3, AXP202_ON); axp.setDCDC3Voltage(3300); + // SetBusPowerMode(0): + // #define AXP192_GPIO0_CTL (0x90) + // #define AXP192_GPIO0_VOL (0x91) + // #define AXP202_LDO234_DC23_CTL (0x12) + + // The axp class lacks a functino to set GPIO0 VDO to 3.3V (as is done by original M5Stack software) + // so do this manually (default value 2.8V did not have the expected effect :)) + // data = Read8bit(0x91); + // write1Byte(0x91, (data & 0X0F) | 0XF0); + uint8_t reg; + Wire.beginTransmission((uint8_t)AXP192_SLAVE_ADDRESS); + Wire.write(AXP192_GPIO0_VOL); + Wire.endTransmission(); + Wire.requestFrom(AXP192_SLAVE_ADDRESS, 1); + reg = Wire.read(); + reg = (reg&0x0F) | 0xF0; + Wire.beginTransmission((uint8_t)AXP192_SLAVE_ADDRESS); + Wire.write(AXP192_GPIO0_VOL); + Wire.write(reg); + Wire.endTransmission(); + // data = Read8bit(0x90); + // Write1Byte(0x90, (data & 0XF8) | 0X02) + axp.setGPIOMode(AXP_GPIO_0, AXP_IO_LDO_MODE); // disable AXP supply from VBUS pmu_irq = 2; // IRQ pin is not connected on Core2 + // data = Read8bit(0x12); //read reg 0x12 + // Write1Byte(0x12, data | 0x40); // enable 3,3V => 5V booster + // this is done below anyway: axp.setPowerOutPut(AXP192_EXTEN, AXP202_ON); + + axp.adc1Enable(AXP202_ACIN_VOL_ADC1, 1); + axp.adc1Enable(AXP202_ACIN_CUR_ADC1, 1); } else { // GPS on T-Beam, buzzer on M5 Core2 axp.setPowerOutPut(AXP192_LDO3, AXP202_ON); + axp.adc1Enable(AXP202_VBUS_VOL_ADC1, 1); + axp.adc1Enable(AXP202_VBUS_CUR_ADC1, 1); } axp.setPowerOutPut(AXP192_DCDC2, AXP202_ON); axp.setPowerOutPut(AXP192_EXTEN, AXP202_ON); axp.setPowerOutPut(AXP192_DCDC1, AXP202_ON); axp.setDCDC1Voltage(3300); - axp.adc1Enable(AXP202_VBUS_VOL_ADC1, 1); - axp.adc1Enable(AXP202_VBUS_CUR_ADC1, 1); axp.adc1Enable(AXP202_BATT_CUR_ADC1, 1); if (sonde.config.button2_axp ) { if (pmu_irq != 2) { diff --git a/RX_FSK/src/Display.cpp b/RX_FSK/src/Display.cpp index 056c440..706e8f0 100644 --- a/RX_FSK/src/Display.cpp +++ b/RX_FSK/src/Display.cpp @@ -1693,11 +1693,19 @@ void Display::drawBatt(DispEntry *de) { snprintf(buf, 30, "%.2f%s", val, de->extra+1); break; case 'U': - val = axp.getVbusVoltage(); + if(sonde.config.type == TYPE_M5_CORE2) { + val = axp.getAcinVoltage(); + } else { + val = axp.getVbusVoltage(); + } snprintf(buf, 30, "%.2f%s", val/1000, de->extra+1); break; case 'I': - val = axp.getVbusCurrent(); + if(sonde.config.type == TYPE_M5_CORE2) { + val = axp.getAcinCurrent(); + } else { + val = axp.getVbusCurrent(); + } snprintf(buf, 30, "%.2f%s", val, de->extra+1); break; case 'T': diff --git a/RX_FSK/src/nav_gps_vel.cpp b/RX_FSK/src/nav_gps_vel.cpp index 6d4f547..174ec5b 100644 --- a/RX_FSK/src/nav_gps_vel.cpp +++ b/RX_FSK/src/nav_gps_vel.cpp @@ -85,6 +85,15 @@ static EPHEM_t *te; #define fread(buffer, siz, els, file) (file.read((uint8_t *)buffer, (siz)*(els))/siz) #define fgetc(file) (char)file.read() +int readDbl(File *fp, double *dbl) { + uint8_t buf[20]; + int l = fp->read(buf, 19); + if(l!=19) return -1; + if (buf[15] == 'D') buf[15] = 'E'; + buf[19] = 0; + sscanf((char *)buf, "%lf", dbl); + return 0; +} EPHEM_t *read_RNXpephs(const char *file) { int l, i; @@ -137,56 +146,84 @@ EPHEM_t *read_RNXpephs(const char *file) { strncpy(ephem.epoch+2, str, 15); ephem.epoch[16] = '\0'; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.af0 = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.af1 = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.af2 = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.af0 = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.af1 = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.af2 = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.af0 = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.af1 = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.af2 = dbl; while ((c=fgetc(fp)) != '\n') { if (c == EOF) break; } l = fread(buf, 3, 1, fp); if (l != 1) break; buf[ 3] = 0; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.iode = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.crs = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.delta_n = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.M0 = dbl; + if(readDbl(&fp, &dbl)<0) break; //ephem.iode = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.crs = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.delta_n = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.M0 = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.iode = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.crs = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.delta_n = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.M0 = dbl; while ((c=fgetc(fp)) != '\n') { if (c == EOF) break; } l = fread(buf, 3, 1, fp); if (l != 1) break; buf[ 3] = 0; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.cuc = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.e = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.cus = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.sqrta = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.cuc = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.e = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.cus = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.sqrta = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.cuc = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.e = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.cus = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.sqrta = dbl; while ((c=fgetc(fp)) != '\n') { if (c == EOF) break; } l = fread(buf, 3, 1, fp); if (l != 1) break; buf[ 3] = 0; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.toe = dbl; - ephem.toc = ephem.toe; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.cic = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.Omega0 = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.cis = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.toe = dbl; ephem.toc = ephem.toe; + if(readDbl(&fp, &dbl)<0) break; ephem.cic = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.Omega0 = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.cis = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.toe = dbl; + // ephem.toc = ephem.toe; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.cic = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.Omega0 = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.cis = dbl; while ((c=fgetc(fp)) != '\n') { if (c == EOF) break; } l = fread(buf, 3, 1, fp); if (l != 1) break; buf[ 3] = 0; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.i0 = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.crc = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.w = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.OmegaDot = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.i0 = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.crc = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.w = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.OmegaDot = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.i0 = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.crc = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.w = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.OmegaDot = dbl; while ((c=fgetc(fp)) != '\n') { if (c == EOF) break; } l = fread(buf, 3, 1, fp); if (l != 1) break; buf[ 3] = 0; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.idot = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.codeL2 = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.gpsweek = (int)dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.iodc = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.idot = dbl; + if(readDbl(&fp, &dbl)<0) break; //ephem.codeL2 = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.gpsweek = (int)dbl; + if(readDbl(&fp, &dbl)<0) break; //ephem.iodc = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.idot = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.codeL2 = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.gpsweek = (int)dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.iodc = dbl; while ((c=fgetc(fp)) != '\n') { if (c == EOF) break; } l = fread(buf, 3, 1, fp); if (l != 1) break; buf[ 3] = 0; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.sva = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.health = (uint8_t)(dbl+0.1); - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.tgd = dbl; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.iodc = dbl; + if(readDbl(&fp, &dbl)<0) break; //ephem.sva = dbl; + if(readDbl(&fp, &dbl)<0) break; ephem.health = (uint8_t)(dbl+0.1); + if(readDbl(&fp, &dbl)<0) break; ephem.tgd = dbl; + if(readDbl(&fp, &dbl)<0) break; //ephem.iodc = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.sva = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.health = (uint8_t)(dbl+0.1); + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); ephem.tgd = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.iodc = dbl; while ((c=fgetc(fp)) != '\n') { if (c == EOF) break; } l = fread(buf, 3, 1, fp); if (l != 1) break; buf[ 3] = 0; - l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.ttom = dbl; + if(readDbl(&fp, &dbl)<0) break; //ephem.ttom = dbl; + //l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.ttom = dbl; String l = fp.readStringUntil('\n'); /* // die letzten beiden Felder (spare) sind manchmal leer (statt 0.00); manchmal fehlt sogar das drittletzte Feld l = fread(buf, 19, 1, fp); if (l != 1) break; if (buf[15] == 'D') buf[15] = 'E'; buf[19] = 0; sscanf(buf, "%lf", &dbl); //ephem.fit = dbl;