Try to cache TX SF, but doesn't quite work yet.

pull/6/head
Max-Plastix 2021-12-23 15:00:20 -08:00
rodzic bcde07abdf
commit fa2457bc29
4 zmienionych plików z 77 dodań i 34 usunięć

Wyświetl plik

@ -100,7 +100,7 @@ void gps_setup(void) {
Serial.println("Could not connect to GPS. Retrying all speeds...");
} while (1);
myGNSS.setUART1Output(COM_TYPE_NMEA); // Set the UART port to output UBX only
myGNSS.setUART1Output(COM_TYPE_NMEA); // We do want NMEA
if (0)
myGNSS.factoryReset();

Wyświetl plik

@ -79,6 +79,7 @@ RTC_DATA_ATTR int bootCount = 0;
esp_sleep_source_t wakeCause; // the reason we booted this time
char buffer[40]; // Screen buffer
char cached_sf_name[40]; // Last SF/BW Transmitted at
unsigned long int ack_req = 0;
unsigned long int ack_rx = 0;
@ -152,17 +153,21 @@ bool trySend()
if (! LMIC_queryTxReady())
return false;
// distance from last transmitted location
float dist_moved = gps_distanceBetween(last_send_lat, last_send_lon, now_lat, now_long);
#if 0
// Check if there is not a current TX/RX job running
if (LMIC.opmode & OP_TXRXPEND)
return false;
// distance from last transmitted location
float dist_moved = gps_distanceBetween(last_send_lat, last_send_lon, now_lat, now_long);
#if 0
snprintf(buffer, sizeof(buffer), "Lat: %10.6f\n", gps_latitude());
screen_print(buffer);
snprintf(buffer, sizeof(buffer), "Long: %10.6f\n", gps_longitude());
screen_print(buffer);
snprintf(buffer, sizeof(buffer), "HDOP: %4.2fm\n", gps_hdop());
screen_print(buffer);
#endif
#endif
char because = '?';
if (justSendNow)
@ -214,10 +219,13 @@ bool trySend()
}
// send it!
// Set data rate (SF) and transmit power for uplink
ttn_sf(LORAWAN_SF);
packetQueued = true;
ttn_send(txBuffer, sizeof(txBuffer), LORAWAN_PORT, confirmed);
if (!ttn_send(txBuffer, sizeof(txBuffer), LORAWAN_PORT, confirmed)) {
Serial.println("Surprise send failure!");
return false;
}
last_send_millis = now_millis;
last_send_lat = now_lat;
last_send_lon = now_long;
@ -298,14 +306,18 @@ void lora_msg_callback(uint8_t message)
}
if (EV_TXSTART == message) {
screen_print("+ ");
ttn_sf_name(buffer, sizeof(buffer));
strncpy(cached_sf_name, buffer, sizeof(cached_sf_name));
screen_print("+\a");
screen_update();
}
// We only want to say 'packetSent' for our packets (not packets needed for joining)
if (EV_TXCOMPLETE == message && packetQueued) {
// screen_print("sent.\n");
packetQueued = false;
axp.setChgLEDMode(AXP20X_LED_OFF);
if (axp192_found)
axp.setChgLEDMode(AXP20X_LED_OFF);
}
if (EV_ACK == message) {
@ -321,7 +333,7 @@ void lora_msg_callback(uint8_t message)
uint8_t port;
ttn_response(&port, data, len);
snprintf(buffer, sizeof(buffer), "Rx: %d on P%d\n", len, port);
snprintf(buffer, sizeof(buffer), "\nRx: %d on P%d\n", len, port);
screen_print(buffer);
Serial.print("Downlink on port:");
@ -341,7 +353,7 @@ void lora_msg_callback(uint8_t message)
float new_distance = (float)(data[0] << 8 | data[1]);
if (new_distance > 0.0) {
min_dist_moved = new_distance;
snprintf(buffer, sizeof(buffer), "New Dist: %.0fm\n", new_distance);
snprintf(buffer, sizeof(buffer), "\nNew Dist: %.0fm\n", new_distance);
screen_print(buffer);
}
@ -354,14 +366,14 @@ void lora_msg_callback(uint8_t message)
tx_interval_ms = new_interval * 1000;
freeze_tx_interval_ms = true;
}
snprintf(buffer, sizeof(buffer), "New Time: %.0lus\n", new_interval);
snprintf(buffer, sizeof(buffer), "\nNew Time: %.0lus\n", new_interval);
screen_print(buffer);
}
if (data[4]) {
float new_low_voltage = data[4] / 100.00 + 2.00;
battery_low_voltage = new_low_voltage;
snprintf(buffer, sizeof(buffer), "New LowBat: %.2fv\n", new_low_voltage);
snprintf(buffer, sizeof(buffer), "\nNew LowBat: %.2fv\n", new_low_voltage);
screen_print(buffer);
}
}
@ -423,6 +435,8 @@ void axp192Init() {
// Serial.println("AXP192 Begin PASS");
} else {
Serial.println("axp.begin() FAIL");
axp192_found = false;
return;
}
axp.setPowerOutPut(AXP192_LDO2, AXP202_ON); // LORA radio
@ -456,8 +470,33 @@ void axp192Init() {
axp.setShutdownTime(2); // "Power off time" = 8S
axp.setTimeOutShutdown(1); // "When key press time is longer than power off time, auto power off"
//Serial.printf("AC IN: %fv\n", axp.getAcinVoltage());
//Serial.printf("Vbus: %fv\n", axp.getVbusVoltage());
Serial.printf("Temp %0.2f°C\n", axp.getTemp());
//Serial.printf("TSTemp %f°C\n", axp.getTSTemp());
//Serial.printf("GPIO0 %fv\n", axp.getGPIO0Voltage());
//Serial.printf("GPIO1 %fv\n", axp.getGPIO1Voltage());
//Serial.printf("Batt In: %fmW\n", axp.getBattInpower());
Serial.printf("Batt: %0.3fv\n", axp.getBattVoltage()/1000.0);
Serial.printf("SysIPSOut: %fv\n", axp.getSysIPSOUTVoltage());
Serial.printf("isVBUSPlug? %s\n", axp.isVBUSPlug() ? "Yes" : "No");
Serial.printf("isChargingEnable? %s\n", axp.isChargeingEnable() ? "Yes" : "No");
Serial.printf("ChargeCurrent: %.2fmA\n", axp.getSettingChargeCurrent());
Serial.printf("ChargeControlCurrent: %d\n", axp.getChargeControlCur());
Serial.printf("Charge: %d%%\n", axp.getBattPercentage());
Serial.printf("PowerDownVoltage: %d mV\n", axp.getPowerDownVoltage());
Serial.printf("WarningLevel1: %d mV\n", axp.getVWarningLevel1());
Serial.printf("WarningLevel2: %d mV\n", axp.getVWarningLevel2());
Serial.printf("DCDC1Voltage: %d mV\n", axp.getDCDC1Voltage());
Serial.printf("DCDC2Voltage: %d mV\n", axp.getDCDC2Voltage());
Serial.printf("DCDC3Voltage: %d mV\n", axp.getDCDC3Voltage());
Serial.printf("LDO2: %d mV\n", axp.getLDO2Voltage());
Serial.printf("LDO3: %d mV\n", axp.getLDO3Voltage());
Serial.printf("LDO4: %d mV\n", axp.getLDO4Voltage());
axp.adc1Enable(AXP202_BATT_CUR_ADC1, 1); // Enable battery current measurements
// axp.enableIRQ(AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ | AXP202_BATT_REMOVED_IRQ | AXP202_BATT_CONNECT_IRQ, 1);
// axp.enableIRQ(AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ | AXP202_BATT_REMOVED_IRQ | AXP202_BATT_CONNECT_IRQ, 1);
axp.enableIRQ(0xFFFFFFFFFF, 1); // See this nerd badge? Give me all the interrupts you have.
axp.clearIRQ();
} else {
@ -548,9 +587,14 @@ void clean_shutdown (void)
{
LMIC_shutdown(); // cleanly shutdown the radio
ttn_write_prefs();
axp.setChgLEDMode(AXP20X_LED_OFF); // Surprisingly sticky if you don't set it
if (axp192_found) {
axp.setChgLEDMode(AXP20X_LED_OFF); // Surprisingly sticky if you don't set it
axp.shutdown(); // PMIC power off
axp.shutdown(); // PMIC power off
} else {
while (1)
; // ?? What to do here
}
}
void update_activity()
@ -559,10 +603,10 @@ void update_activity()
float charge_ma = axp.getBattChargeCurrent();
// float discharge_ma = axp.getBatChargeCurrent();
if (axp.isBatteryConnect() && bat_volts < battery_low_voltage && charge_ma < 99.0)
if (axp192_found && axp.isBatteryConnect() && bat_volts < battery_low_voltage && charge_ma < 99.0)
{
Serial.println("Low Battery OFF");
screen_print("Low Battery OFF\n");
screen_print("\nLow Battery OFF\n");
delay(4999); // Give some time to read the screen
clean_shutdown();
}
@ -645,7 +689,7 @@ void loop() {
if (axp.isPEKLongtPressIRQ()) // They want to turn OFF
{
screen_print("POWER OFF...\n");
screen_print("\nPOWER OFF...\n");
delay(4000); // Give some time to read the screen
clean_shutdown();
}
@ -669,7 +713,7 @@ void loop() {
// held long enough
Serial.println("Long press!");
screen_print("Discarding prefs!\n");
screen_print("\nFlushing Prefs!\n");
ttn_erase_prefs();
delay(5000); // Give some time to read the screen
ESP.restart();
@ -684,9 +728,10 @@ void loop() {
if (trySend()) {
// Good send
axp.setChgLEDMode(AXP20X_LED_LOW_LEVEL);
if (axp192_found)
axp.setChgLEDMode(AXP20X_LED_LOW_LEVEL);
} else {
// Nothing sent.
// Do NOT delay() here.. the LoRa receiver and join housekeeping also needs to run!
}
}
}

Wyświetl plik

@ -65,18 +65,13 @@ void _screen_header() {
display->drawString(display->getWidth() - SATELLITE_IMAGE_WIDTH - 4, 2, itoa(gps_sats(), buffer, 10));
display->drawXbm(display->getWidth() - SATELLITE_IMAGE_WIDTH, 0, SATELLITE_IMAGE_WIDTH, SATELLITE_IMAGE_HEIGHT, SATELLITE_IMAGE);
// Second row. So dirty; don't judge:
// void ttn_sf_name(char *, size_t);
extern float min_dist_moved;
extern unsigned long int tx_interval_ms;
// Second status row:
snprintf(buffer, sizeof(buffer), "%lus %.0fm", tx_interval_ms / 1000, min_dist_moved);
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->drawString(0, 12, buffer);
ttn_sf_name(buffer, sizeof(buffer));
display->setTextAlignment(TEXT_ALIGN_RIGHT);
display->drawString(display->getWidth(), 12, buffer);
display->drawString(display->getWidth(), 12, cached_sf_name);
display->drawHorizontalLine(0, SCREEN_HEADER_HEIGHT, display->getWidth());
}

Wyświetl plik

@ -230,7 +230,6 @@ static void initCount() {
}
}
void ttn_sf_name (char *b, size_t len) {
u1_t sf = getSf(LMIC.rps) + 6; // 1 == SF7
u1_t bw = getBw(LMIC.rps);
@ -454,21 +453,25 @@ void ttn_erase_prefs() {
}
}
void ttn_send(uint8_t * data, uint8_t data_size, uint8_t port, bool confirmed){
boolean ttn_send(uint8_t * data, uint8_t data_size, uint8_t port, bool confirmed){
ttn_set_cnt(); // we are about to send using the current packet count
// Check if there is not a current TX/RX job running
if (LMIC.opmode & OP_TXRXPEND) {
_ttn_callback(EV_PENDING);
return;
return false;
}
// Set data rate (SF) for Uplink, as it might have changed during last Tx
ttn_sf(LORAWAN_SF);
// Prepare upstream data transmission at the next possible time.
// Parameters are port, data, length, confirmed
LMIC_setTxData2(port, data, data_size, confirmed ? 1 : 0);
_ttn_callback(EV_QUEUED);
count++;
return true;
}
void ttn_loop() {