summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ao_radio_cmac.c4
-rw-r--r--src/cc1111/ao_packet_master.c5
-rw-r--r--src/cc1111/ao_pins.h5
-rw-r--r--src/cc1111/ao_radio.c5
-rw-r--r--src/core/ao.h11
-rw-r--r--src/core/ao_log_telem.c2
-rw-r--r--src/core/ao_monitor.c151
-rw-r--r--src/product/ao_telebt.c2
-rw-r--r--src/product/ao_teledongle.c2
-rw-r--r--src/product/ao_teleterra_0_2.c2
-rw-r--r--src/product/ao_tidongle.c2
-rw-r--r--src/teleterra-v0.2/ao_pins.h3
12 files changed, 96 insertions, 98 deletions
diff --git a/src/ao_radio_cmac.c b/src/ao_radio_cmac.c
index 41fbbe1f..e263f0db 100644
--- a/src/ao_radio_cmac.c
+++ b/src/ao_radio_cmac.c
@@ -78,7 +78,7 @@ radio_cmac_send(uint8_t len) __reentrant
ao_config_get();
#if HAS_MONITOR
- ao_set_monitor(0);
+ ao_monitor_set(0);
#endif
ao_mutex_get(&ao_aes_mutex);
@@ -107,7 +107,7 @@ radio_cmac_recv(uint8_t len, uint16_t timeout) __reentrant
len = round_len(len);
#if HAS_MONITOR
- ao_set_monitor(0);
+ ao_monitor_set(0);
#endif
if (timeout)
ao_alarm(timeout);
diff --git a/src/cc1111/ao_packet_master.c b/src/cc1111/ao_packet_master.c
index ab19f979..66f94288 100644
--- a/src/cc1111/ao_packet_master.c
+++ b/src/cc1111/ao_packet_master.c
@@ -114,7 +114,7 @@ ao_packet_forward(void) __reentrant
flush();
#if HAS_MONITOR
- ao_set_monitor(0);
+ ao_monitor_disable();
#endif
ao_add_task(&ao_packet_task, ao_packet_master, "master");
ao_add_task(&ao_packet_echo_task, ao_packet_echo, "echo");
@@ -132,6 +132,9 @@ ao_packet_forward(void) __reentrant
ao_wakeup(&ao_stdin_ready);
ao_delay(AO_MS_TO_TICKS(10));
}
+#if HAS_MONITOR
+ ao_monitor_enable();
+#endif
}
diff --git a/src/cc1111/ao_pins.h b/src/cc1111/ao_pins.h
index 7c5b4574..2b6232a4 100644
--- a/src/cc1111/ao_pins.h
+++ b/src/cc1111/ao_pins.h
@@ -107,6 +107,7 @@
#define PACKET_HAS_SLAVE 0
#define AO_LED_RED 1
#define AO_LED_GREEN 2
+ #define AO_MONITOR_LED AO_LED_GREEN
#define LEDS_AVAILABLE (AO_LED_RED|AO_LED_GREEN)
#define SPI_CS_ON_P1 1
#define SPI_CS_ON_P0 0
@@ -218,6 +219,7 @@
#define PACKET_HAS_SLAVE 0
#define AO_LED_RED 2
#define AO_LED_GREEN 1
+ #define AO_MONITOR_LED AO_LED_GREEN
#define LEDS_AVAILABLE (AO_LED_RED|AO_LED_GREEN)
#define SPI_CS_ON_P1 0
#define SPI_CS_ON_P0 1
@@ -245,6 +247,7 @@
#define PACKET_HAS_MASTER 1
#define PACKET_HAS_SLAVE 0
#define AO_LED_RED 2
+ #define AO_MONITOR_LED AO_LED_RED
#define LEDS_AVAILABLE (AO_LED_RED)
#define SPI_CS_ON_P1 0
#define SPI_CS_ON_P0 1
@@ -274,6 +277,7 @@
#define PACKET_HAS_SLAVE 0
#define AO_LED_RED 2
#define AO_LED_GREEN 1
+ #define AO_MONITOR_LED AO_LED_RED
#define LEDS_AVAILABLE (AO_LED_RED|AO_LED_GREEN)
#define SPI_CS_ON_P1 1
#define SPI_CS_ON_P0 0
@@ -312,6 +316,7 @@
#define PACKET_HAS_SLAVE 0
#define AO_LED_RED 1
#define AO_LED_GREEN 2
+ #define AO_MONITOR_LED AO_LED_RED
#define LEDS_AVAILABLE (AO_LED_RED|AO_LED_GREEN)
#define SPI_CS_ON_P1 1
#define SPI_CS_ON_P0 0
diff --git a/src/cc1111/ao_radio.c b/src/cc1111/ao_radio.c
index 75f241d4..ee506f89 100644
--- a/src/cc1111/ao_radio.c
+++ b/src/cc1111/ao_radio.c
@@ -421,7 +421,7 @@ ao_radio_test(void)
mode++;
if ((mode & 2) && !radio_on) {
#if HAS_MONITOR
- ao_set_monitor(0);
+ ao_monitor_disable();
#endif
#if PACKET_HAS_SLAVE
ao_packet_slave_stop();
@@ -439,6 +439,9 @@ ao_radio_test(void)
ao_radio_idle();
ao_radio_put();
radio_on = 0;
+#if HAS_MONITOR
+ ao_monitor_enable();
+#endif
}
}
diff --git a/src/core/ao.h b/src/core/ao.h
index cbe2f8dc..f57398ce 100644
--- a/src/core/ao.h
+++ b/src/core/ao.h
@@ -1406,13 +1406,18 @@ ao_monitor(void);
#define AO_MONITORING_OFF 0
#define AO_MONITORING_ORIG 1
-#define AO_MONITORING_TINY 2
void
-ao_set_monitor(uint8_t monitoring);
+ao_monitor_set(uint8_t monitoring);
void
-ao_monitor_init(uint8_t led, uint8_t monitoring) __reentrant;
+ao_monitor_disable(void);
+
+void
+ao_monitor_enable(void);
+
+void
+ao_monitor_init(void) __reentrant;
/*
* ao_stdio.c
diff --git a/src/core/ao_log_telem.c b/src/core/ao_log_telem.c
index 096ad919..9e1b06d3 100644
--- a/src/core/ao_log_telem.c
+++ b/src/core/ao_log_telem.c
@@ -90,6 +90,8 @@ ao_log_single(void)
ao_log_running = 1;
ao_log_single_restart();
ao_flight_state = ao_flight_startup;
+ ao_monitor_set(sizeof(struct ao_telemetry_generic));
+
for (;;) {
while (!ao_log_running)
ao_sleep(&ao_log_running);
diff --git a/src/core/ao_monitor.c b/src/core/ao_monitor.c
index f7795fe4..7960208e 100644
--- a/src/core/ao_monitor.c
+++ b/src/core/ao_monitor.c
@@ -30,13 +30,35 @@
#define HAS_MONIOTOR_PUT 1
#endif
+#ifndef AO_MONITOR_LED
+#error Must define AO_MONITOR_LED
+#endif
+
__data uint8_t ao_monitoring;
-__pdata uint8_t ao_monitor_led;
+static __data uint8_t ao_monitor_disabled;
+static __data uint8_t ao_internal_monitoring;
+static __data uint8_t ao_external_monitoring;
__xdata union ao_monitor ao_monitor_ring[AO_MONITOR_RING];
__data uint8_t ao_monitor_head;
+static void
+_ao_monitor_adjust(void)
+{
+ if (ao_monitoring)
+ ao_radio_recv_abort();
+ if (ao_monitor_disabled)
+ ao_monitoring = 0;
+ else {
+ if (ao_external_monitoring)
+ ao_monitoring = ao_external_monitoring;
+ else
+ ao_monitoring = ao_internal_monitoring;
+ }
+ ao_wakeup(DATA_TO_XDATA(&ao_monitoring));
+}
+
void
ao_monitor_get(void)
{
@@ -51,9 +73,6 @@ ao_monitor_get(void)
case AO_MONITORING_ORIG:
size = sizeof (struct ao_telemetry_orig_recv);
break;
- case AO_MONITORING_TINY:
- size = sizeof (struct ao_telemetry_tiny_recv);
- break;
#endif
default:
if (ao_monitoring > AO_MAX_TELEMETRY)
@@ -68,16 +87,21 @@ ao_monitor_get(void)
}
}
+#if AO_MONITOR_LED
+__xdata struct ao_task ao_monitor_blink_task;
+
void
ao_monitor_blink(void)
{
for (;;) {
ao_sleep(DATA_TO_XDATA(&ao_monitor_head));
- ao_led_for(ao_monitor_led, AO_MS_TO_TICKS(100));
+ ao_led_for(AO_MONITOR_LED, AO_MS_TO_TICKS(100));
}
}
+#endif
#if HAS_MONITOR_PUT
+
void
ao_monitor_put(void)
{
@@ -96,11 +120,15 @@ ao_monitor_put(void)
ao_monitor_tail = ao_monitor_head;
for (;;) {
- while (ao_monitor_tail == ao_monitor_head)
+ while (!ao_external_monitoring)
+ ao_sleep(DATA_TO_XDATA(&ao_external_monitoring));
+ while (ao_monitor_tail == ao_monitor_head && ao_external_monitoring)
ao_sleep(DATA_TO_XDATA(&ao_monitor_head));
m = &ao_monitor_ring[ao_monitor_tail];
ao_monitor_tail = ao_monitor_ring_next(ao_monitor_tail);
switch (ao_monitoring) {
+ case 0:
+ break;
#if LEGACY_MONITOR
case AO_MONITORING_ORIG:
state = recv_orig.telemetry_orig.flight_state;
@@ -179,71 +207,6 @@ ao_monitor_put(void)
printf("CRC INVALID RSSI %3d\n", rssi);
}
break;
- case AO_MONITORING_TINY:
- state = recv_tiny.telemetry_tiny.flight_state;
-
- /* Typical RSSI offset for 38.4kBaud at 433 MHz is 74 */
- rssi = (int16_t) (recv_tiny.rssi >> 1) - 74;
- ao_xmemcpy(callsign, recv_tiny.telemetry_tiny.callsign, AO_MAX_CALLSIGN);
- if (state > ao_flight_invalid)
- state = ao_flight_invalid;
- if (recv_tiny.status & PKT_APPEND_STATUS_1_CRC_OK) {
- /* General header fields */
- printf(AO_TELEM_VERSION " %d "
- AO_TELEM_CALL " %s "
- AO_TELEM_SERIAL " %d "
- AO_TELEM_FLIGHT " %d "
- AO_TELEM_RSSI " %d "
- AO_TELEM_STATE " %s "
- AO_TELEM_TICK " %d ",
- AO_TELEMETRY_VERSION,
- callsign,
- recv_tiny.telemetry_tiny.serial,
- recv_tiny.telemetry_tiny.flight,
- rssi,
- ao_state_names[state],
- recv_tiny.telemetry_tiny.adc.tick);
-
- /* Raw sensor values */
- printf(AO_TELEM_RAW_BARO " %d "
- AO_TELEM_RAW_THERMO " %d "
- AO_TELEM_RAW_BATT " %d "
- AO_TELEM_RAW_DROGUE " %d "
- AO_TELEM_RAW_MAIN " %d ",
- recv_tiny.telemetry_tiny.adc.pres,
- recv_tiny.telemetry_tiny.adc.temp,
- recv_tiny.telemetry_tiny.adc.v_batt,
- recv_tiny.telemetry_tiny.adc.sense_d,
- recv_tiny.telemetry_tiny.adc.sense_m);
-
- /* Sensor calibration values */
- printf(AO_TELEM_CAL_BARO_GROUND " %d ",
- recv_tiny.telemetry_tiny.ground_pres);
-
-#if 1
- /* Kalman state values */
- printf(AO_TELEM_KALMAN_HEIGHT " %d "
- AO_TELEM_KALMAN_SPEED " %d "
- AO_TELEM_KALMAN_ACCEL " %d\n",
- recv_tiny.telemetry_tiny.height,
- recv_tiny.telemetry_tiny.speed,
- recv_tiny.telemetry_tiny.accel);
-#else
- /* Ad-hoc flight values */
- printf(AO_TELEM_ADHOC_ACCEL " %d "
- AO_TELEM_ADHOC_SPEED " %ld "
- AO_TELEM_ADHOC_BARO " %d\n",
- recv_tiny.telemetry_tiny.flight_accel,
- recv_tiny.telemetry_tiny.flight_vel,
- recv_tiny.telemetry_tiny.flight_pres);
-#endif
-#if HAS_RSSI
- ao_rssi_set(rssi);
-#endif
- } else {
- printf("CRC INVALID RSSI %3d\n", rssi);
- }
- break;
#endif /* LEGACY_MONITOR */
default:
printf ("TELEM %02x", ao_monitoring + 2);
@@ -265,43 +228,59 @@ ao_monitor_put(void)
ao_usb_flush();
}
}
+
__xdata struct ao_task ao_monitor_put_task;
#endif
__xdata struct ao_task ao_monitor_get_task;
-__xdata struct ao_task ao_monitor_blink_task;
void
-ao_set_monitor(uint8_t monitoring)
+ao_monitor_set(uint8_t monitoring)
{
- if (ao_monitoring)
- ao_radio_recv_abort();
- ao_monitoring = monitoring;
- ao_wakeup(DATA_TO_XDATA(&ao_monitoring));
+ ao_internal_monitoring = monitoring;
+ _ao_monitor_adjust();
}
+void
+ao_monitor_disable(void)
+{
+ ++ao_monitor_disabled;
+ _ao_monitor_adjust();
+}
+
+void
+ao_monitor_enable(void)
+{
+ --ao_monitor_disabled;
+ _ao_monitor_adjust();
+}
+
+#if HAS_MONITOR_PUT
static void
set_monitor(void)
{
ao_cmd_hex();
- ao_set_monitor(ao_cmd_lex_i);
+ ao_external_monitoring = ao_cmd_lex_i;
+ ao_wakeup(DATA_TO_XDATA(&ao_external_monitoring));
+ ao_wakeup(DATA_TO_XDATA(&ao_monitor_head));
+ _ao_monitor_adjust();
}
__code struct ao_cmds ao_monitor_cmds[] = {
- { set_monitor, "m <0 off, 1 full, 2 tiny>\0Enable/disable radio monitoring" },
+ { set_monitor, "m <0 off, 1 old, 20 std>\0Enable/disable radio monitoring" },
{ 0, NULL },
};
+#endif
void
-ao_monitor_init(uint8_t monitor_led, uint8_t monitoring) __reentrant
+ao_monitor_init(void) __reentrant
{
- ao_monitor_led = monitor_led;
- ao_monitoring = monitoring;
- ao_cmd_register(&ao_monitor_cmds[0]);
- ao_add_task(&ao_monitor_get_task, ao_monitor_get, "monitor_get");
#if HAS_MONITOR_PUT
+ ao_cmd_register(&ao_monitor_cmds[0]);
ao_add_task(&ao_monitor_put_task, ao_monitor_put, "monitor_put");
#endif
- if (ao_monitor_led)
- ao_add_task(&ao_monitor_blink_task, ao_monitor_blink, "monitor_blink");
+ ao_add_task(&ao_monitor_get_task, ao_monitor_get, "monitor_get");
+#if AO_MONITOR_LED
+ ao_add_task(&ao_monitor_blink_task, ao_monitor_blink, "monitor_blink");
+#endif
}
diff --git a/src/product/ao_telebt.c b/src/product/ao_telebt.c
index c4b40dfc..97c9d792 100644
--- a/src/product/ao_telebt.c
+++ b/src/product/ao_telebt.c
@@ -37,7 +37,7 @@ main(void)
ao_storage_init();
#endif
ao_usb_init();
- ao_monitor_init(AO_LED_RED, TRUE);
+ ao_monitor_init();
#if HAS_LOG
ao_report_init();
#endif
diff --git a/src/product/ao_teledongle.c b/src/product/ao_teledongle.c
index b8be9f45..49b80500 100644
--- a/src/product/ao_teledongle.c
+++ b/src/product/ao_teledongle.c
@@ -28,7 +28,7 @@ main(void)
ao_timer_init();
ao_cmd_init();
ao_usb_init();
- ao_monitor_init(AO_LED_GREEN, TRUE);
+ ao_monitor_init();
ao_rssi_init(AO_LED_RED);
ao_radio_init();
ao_packet_master_init();
diff --git a/src/product/ao_teleterra_0_2.c b/src/product/ao_teleterra_0_2.c
index 6ce29894..1a268c99 100644
--- a/src/product/ao_teleterra_0_2.c
+++ b/src/product/ao_teleterra_0_2.c
@@ -31,7 +31,7 @@ main(void)
ao_usb_init();
ao_serial_init();
ao_gps_init();
- ao_monitor_init(0, sizeof (struct ao_telemetry_generic));
+ ao_monitor_init();
ao_report_init();
ao_log_single_init();
ao_radio_init();
diff --git a/src/product/ao_tidongle.c b/src/product/ao_tidongle.c
index 5adbb05c..a504a747 100644
--- a/src/product/ao_tidongle.c
+++ b/src/product/ao_tidongle.c
@@ -30,7 +30,7 @@ main(void)
ao_timer_init();
ao_cmd_init();
ao_usb_init();
- ao_monitor_init(AO_LED_RED, TRUE);
+ ao_monitor_init();
ao_rssi_init(AO_LED_RED);
ao_radio_init();
ao_dbg_init();
diff --git a/src/teleterra-v0.2/ao_pins.h b/src/teleterra-v0.2/ao_pins.h
index 9c35b06a..72ded004 100644
--- a/src/teleterra-v0.2/ao_pins.h
+++ b/src/teleterra-v0.2/ao_pins.h
@@ -39,13 +39,14 @@
#define HAS_COMPANION 0
+ #define AO_MONITOR_LED 0
#define LEDS_AVAILABLE 0
#define HAS_EXTERNAL_TEMP 0
#define HAS_ACCEL_REF 0
#define HAS_ACCEL 0
#define HAS_IGNITE 0
#define HAS_MONITOR 1
- #define HAS_MONITOR_PUT 0
+ #define HAS_MONITOR_PUT 1
#define LEGACY_MONITOR 0
#define HAS_RSSI 0
#define HAS_AES 0