altos: Add telerepeat-v1.0
authorKeith Packard <keithp@keithp.com>
Mon, 18 Aug 2014 04:03:12 +0000 (21:03 -0700)
committerKeith Packard <keithp@keithp.com>
Mon, 18 Aug 2014 04:03:12 +0000 (21:03 -0700)
This uses TeleBT hardware to provide a telemetry repeater, receiving
packets on one frequency and re-transmitting them on another.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/Makefile
src/kernel/ao_config.c
src/kernel/ao_config.h
src/kernel/ao_forward.c [new file with mode: 0644]
src/kernel/ao_forward.h [new file with mode: 0644]
src/telerepeat-v1.0/Makefile [new file with mode: 0644]
src/telerepeat-v1.0/ao_pins.h [new file with mode: 0644]
src/telerepeat-v1.0/ao_telerepeat.c [new file with mode: 0644]

index 7f09db02a84f0940633c8ae33e8304b87fc9ed72..20126de6771b336f1e54b631496e7a7ab07952c2 100644 (file)
@@ -22,7 +22,8 @@ SDCCDIRS=\
        telemini-v1.0 telemini-v2.0 \
        telebt-v1.0 \
        teleterra-v0.2 teleshield-v0.1 \
-       telefire-v0.1 telefire-v0.2
+       telefire-v0.1 telefire-v0.2 \
+       telerepeat-v1.0
 
 ARMM3DIRS=\
        easymega-v1.0 easymega-v1.0/flash-loader \
index d1b931221ae395094e79d34b67ec500fb60c17f4..6b8a1813509e5bb5634cef96e0d6e7456bce22bb 100644 (file)
@@ -93,10 +93,18 @@ ao_config_put(void)
 #endif
 
 #if HAS_RADIO
+
+#if HAS_RADIO_FORWARD
+__xdata uint32_t       ao_send_radio_setting;
+#endif
+
 void
 ao_config_set_radio(void)
 {
        ao_config.radio_setting = ao_freq_to_set(ao_config.frequency, ao_config.radio_cal);
+#if HAS_RADIO_FORWARD
+       ao_send_radio_setting = ao_freq_to_set(ao_config.send_frequency, ao_config.radio_cal);
+#endif
 }
 #endif /* HAS_RADIO */
 
@@ -207,6 +215,10 @@ _ao_config_get(void)
 #if HAS_RADIO_RATE
                if (minor < 20)
                        ao_config.radio_rate = AO_CONFIG_DEFAULT_RADIO_RATE;
+#endif
+#if HAS_RADIO_FORWARD
+               if (minor < 21)
+                       ao_config.send_frequency = 434550;
 #endif
                ao_config.minor = AO_CONFIG_MINOR;
                ao_config_dirty = 1;
@@ -302,6 +314,31 @@ ao_config_frequency_set(void) __reentrant
 
 #endif
 
+#if HAS_RADIO_FORWARD
+void
+ao_config_send_frequency_show(void) __reentrant
+{
+       printf("Send frequency: %ld\n",
+              ao_config.send_frequency);
+}
+
+void
+ao_config_send_frequency_set(void) __reentrant
+{
+       ao_cmd_decimal();
+       if (ao_cmd_status != ao_cmd_success)
+               return;
+       _ao_config_edit_start();
+       ao_config.send_frequency = ao_cmd_lex_u32;
+       ao_config_set_radio();
+       _ao_config_edit_finish();
+#if HAS_RADIO_RECV
+       ao_radio_recv_abort();
+#endif
+}
+
+#endif
+
 #if HAS_FLIGHT
 
 void
@@ -863,6 +900,10 @@ __code struct ao_config_var ao_config_vars[] = {
 #if HAS_RADIO
        { "F <freq>\0Frequency (kHz)",
          ao_config_frequency_set, ao_config_frequency_show },
+#if HAS_RADIO_FORWARD
+       { "R <freq>\0Repeater output frequency (kHz)",
+         ao_config_send_frequency_set, ao_config_send_frequency_show },
+#endif
        { "c <call>\0Callsign (8 char max)",
          ao_config_callsign_set,       ao_config_callsign_show },
        { "e <0 disable, 1 enable>\0Enable telemetry and RDF",
index 0be3e14d1ee0b8a1fc7ca7447d1dbd89169e0371..164584a53fcf042725f00be1488101644e34ae83 100644 (file)
@@ -57,7 +57,7 @@
 #endif
 
 #define AO_CONFIG_MAJOR        1
-#define AO_CONFIG_MINOR        20
+#define AO_CONFIG_MINOR        21
 
 #define AO_AES_LEN 16
 
@@ -112,8 +112,15 @@ struct ao_config {
 #if HAS_RADIO_RATE
        uint8_t         radio_rate;             /* minor version 20 */
 #endif
+#if HAS_RADIO_FORWARD
+       uint32_t        send_frequency;         /* minor version 21 */
+#endif
 };
 
+#if HAS_RADIO_FORWARD
+extern __xdata uint32_t        ao_send_radio_setting;
+#endif
+
 #define AO_IGNITE_MODE_DUAL            0
 #define AO_IGNITE_MODE_APOGEE          1
 #define AO_IGNITE_MODE_MAIN            2
diff --git a/src/kernel/ao_forward.c b/src/kernel/ao_forward.c
new file mode 100644 (file)
index 0000000..2a93718
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright © 2014 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "ao.h"
+#include "ao_telem.h"
+
+static void
+ao_monitor_forward(void)
+{
+       uint32_t                                        recv_radio_setting;
+       static __xdata struct ao_telemetry_all_recv     packet;
+
+       for (;;) {
+               while (ao_monitoring)
+                       ao_sleep(DATA_TO_XDATA(&ao_monitoring));
+
+               if (!ao_radio_recv(&packet, sizeof(packet), 0))
+                       continue;
+               if (!(packet.status & PKT_APPEND_STATUS_1_CRC_OK))
+                       continue;
+               recv_radio_setting = ao_config.radio_setting;
+               ao_config.radio_setting = ao_send_radio_setting;
+               ao_radio_send(&packet.telemetry, sizeof (packet.telemetry));
+               ao_config.radio_setting = recv_radio_setting;
+       }
+}
+
+static __xdata struct ao_task ao_monitor_forward_task;
+
+void
+ao_monitor_forward_init(void) __reentrant
+{
+       ao_add_task(&ao_monitor_forward_task, ao_monitor_forward, "monitor_forward");
+}
diff --git a/src/kernel/ao_forward.h b/src/kernel/ao_forward.h
new file mode 100644 (file)
index 0000000..1897dc0
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright © 2014 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_FORWARD_H_
+#define _AO_FORWARD_H_
+
+void
+ao_monitor_forward_init(void) __reentrant;
+
+#endif /* _AO_FORWARD_H_ */
diff --git a/src/telerepeat-v1.0/Makefile b/src/telerepeat-v1.0/Makefile
new file mode 100644 (file)
index 0000000..17f6837
--- /dev/null
@@ -0,0 +1,100 @@
+#
+# TeleRepeat build file
+#
+
+TELEREPEAT_VER=1.0
+TELEREPEAT_DEF=1_0
+
+vpath %.c ..:../kernel:../cc1111:../drivers:../product
+vpath %.h ..:../kernel:../cc1111:../drivers:../product
+vpath ao-make-product.5c ../util
+
+ifndef VERSION
+include ../Version
+endif
+
+INC = \
+       ao.h \
+       ao_pins.h \
+       ao_arch.h \
+       ao_arch_funcs.h \
+       cc1111.h \
+       ao_product.h
+
+CORE_SRC = \
+       ao_cmd.c \
+       ao_config.c \
+       ao_monitor.c \
+       ao_mutex.c \
+       ao_panic.c \
+       ao_state.c \
+       ao_stdio.c \
+       ao_task.c \
+       ao_forward.c \
+       ao_storage.c \
+       ao_freq.c
+
+CC1111_SRC = \
+       ao_dbg.c \
+       ao_adc.c \
+       ao_dma.c \
+       ao_led.c \
+       ao_packet.c \
+       ao_intflash.c \
+       ao_packet_master.c \
+       ao_radio.c \
+       ao_romconfig.c \
+       ao_serial.c \
+       ao_string.c \
+       ao_timer.c \
+       ao_usb.c \
+       _bp.c
+
+DRIVER_SRC = \
+       ao_btm.c
+
+PRODUCT_SRC = \
+       ao_telerepeat.c
+
+SRC = \
+       $(CORE_SRC) \
+       $(CC1111_SRC) \
+       $(DRIVER_SRC) \
+       $(PRODUCT_SRC)
+
+PROGNAME = telerepeat-v$(TELEREPEAT_VER)
+PROG = $(PROGNAME)-$(VERSION).ihx
+PRODUCT=TeleRepeat-v$(TELEREPEAT_VER)
+PRODUCT_DEF=-DTELEREPEAT_V_$(TELEREPEAT_DEF)
+IDPRODUCT=0x000e
+CODESIZE=0x7800
+
+include ../cc1111/Makefile.cc1111
+
+NICKLE=nickle
+CHECK_STACK=sh ../util/check-stack
+
+V=0
+# The user has explicitly enabled quiet compilation.
+ifeq ($(V),0)
+quiet = @printf "  $1 $2 $@\n"; $($1)
+endif
+# Otherwise, print the full command line.
+quiet ?= $($1)
+
+all: $(PROG)
+
+$(PROG): $(REL) Makefile
+       $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(REL)
+       $(call quiet,CHECK_STACK) ../cc1111/ao_arch.h $(PMEM) || rm $@
+
+ao_product.h: ao-make-product.5c ../Version
+       $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@
+
+distclean:     clean
+
+clean: clean-cc1111
+
+install:
+
+uninstall:
diff --git a/src/telerepeat-v1.0/ao_pins.h b/src/telerepeat-v1.0/ao_pins.h
new file mode 100644 (file)
index 0000000..2a7dbd3
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright © 2010 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_PINS_H_
+#define _AO_PINS_H_
+
+#define HAS_RADIO              1
+#define HAS_RADIO_FORWARD      1
+#define HAS_FLIGHT             0
+#define HAS_USB                        1
+#define HAS_BEEP               0
+#define HAS_SERIAL_1           1
+#define HAS_SERIAL_1_ALT_1     1
+#define HAS_SERIAL_1_ALT_2     0
+#define HAS_SERIAL_1_HW_FLOW   1
+#define USE_SERIAL_1_STDIN     1
+#define DELAY_SERIAL_1_STDIN   1
+#define HAS_DBG                        1
+#define HAS_EEPROM             1
+#define HAS_LOG                        0
+#define USE_INTERNAL_FLASH     1
+#define HAS_BTM                        1
+#define DBG_ON_P1              1
+#define DBG_ON_P0              0
+#define PACKET_HAS_MASTER      1
+#define PACKET_HAS_SLAVE       0
+#define AO_LED_RED             1
+#define AO_LED_BLUE            2
+#define LEDS_AVAILABLE         (AO_LED_RED|AO_LED_BLUE)
+#define AO_MONITOR_LED         AO_LED_RED
+#define AO_BT_LED              AO_LED_BLUE
+#define BT_LINK_ON_P2          0
+#define BT_LINK_ON_P1          1
+#define BT_LINK_PIN_INDEX      7
+#define BT_LINK_PIN            P1_7
+#define HAS_MONITOR            1
+#define HAS_MONITOR_PUT                1
+#define LEGACY_MONITOR         0
+#define HAS_TELEMETRY          0
+#define AO_RADIO_REG_TEST      1
+
+#define HAS_ADC                        1
+#define AO_PAD_ADC_BATT                0
+#define AO_ADC_PINS            (1 << AO_PAD_ADC_BATT)
+
+struct ao_adc {
+       int16_t         batt;
+};
+
+#define AO_ADC_DUMP(p)                                                 \
+       printf ("tick: %5u batt %5d\n",                                 \
+               (p)->tick,                                              \
+               (p)->adc.batt)
+
+#define FETCH_ADC() do {                                               \
+               a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.batt); \
+               a[0] = ADCL;                                            \
+               a[1] = ADCH;                                            \
+       } while (0)
+
+#if DBG_ON_P1
+
+       #define DBG_CLOCK       (1 << 4)        /* mi0 */
+       #define DBG_DATA        (1 << 5)        /* mo0 */
+       #define DBG_RESET_N     (1 << 3)        /* c0 */
+
+       #define DBG_CLOCK_PIN   (P1_4)
+       #define DBG_DATA_PIN    (P1_5)
+       #define DBG_RESET_N_PIN (P1_3)
+
+       #define DBG_PORT_NUM    1
+       #define DBG_PORT        P1
+       #define DBG_PORT_SEL    P1SEL
+       #define DBG_PORT_INP    P1INP
+       #define DBG_PORT_DIR    P1DIR
+
+#endif /* DBG_ON_P1 */
+
+#if DBG_ON_P0
+
+       #define DBG_CLOCK       (1 << 3)
+       #define DBG_DATA        (1 << 4)
+       #define DBG_RESET_N     (1 << 5)
+
+       #define DBG_CLOCK_PIN   (P0_3)
+       #define DBG_DATA_PIN    (P0_4)
+       #define DBG_RESET_N_PIN (P0_5)
+
+       #define DBG_PORT_NUM    0
+       #define DBG_PORT        P0
+       #define DBG_PORT_SEL    P0SEL
+       #define DBG_PORT_INP    P0INP
+       #define DBG_PORT_DIR    P0DIR
+
+#endif /* DBG_ON_P0 */
+
+#endif /* _AO_PINS_H_ */
diff --git a/src/telerepeat-v1.0/ao_telerepeat.c b/src/telerepeat-v1.0/ao_telerepeat.c
new file mode 100644 (file)
index 0000000..21bf8a7
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright © 2011 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "ao.h"
+#include "ao_forward.h"
+
+void
+main(void)
+{
+       ao_clock_init();
+
+       /* Turn on the LED until the system is stable */
+       ao_led_init(LEDS_AVAILABLE);
+       ao_led_on(AO_LED_RED);
+
+       ao_task_init();
+
+       ao_timer_init();
+       ao_cmd_init();
+       ao_usb_init();
+       ao_monitor_init();
+       ao_radio_init();
+       ao_packet_master_init();
+       ao_adc_init();
+       ao_btm_init();
+       ao_monitor_forward_init();
+       ao_storage_init();
+#if HAS_DBG
+       ao_dbg_init();
+#endif
+       ao_config_init();
+       ao_start_scheduler();
+}