altos: Shuffle LCO functions around, add telelco first cut
authorKeith Packard <keithp@keithp.com>
Thu, 30 Aug 2012 21:16:52 +0000 (16:16 -0500)
committerKeith Packard <keithp@keithp.com>
Thu, 30 Aug 2012 21:16:52 +0000 (16:16 -0500)
Pull LCO functions shared between LCO UI and command line into
ao_lco_funcs.c.

Import bits for telelco.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/drivers/ao_lco_cmd.c
src/drivers/ao_lco_func.c [new file with mode: 0644]
src/drivers/ao_lco_func.h [new file with mode: 0644]
src/telelco-v0.1/Makefile [new file with mode: 0644]
src/telelco-v0.1/ao_lco.c [new file with mode: 0644]
src/telelco-v0.1/ao_lco.h [new file with mode: 0644]
src/telelco-v0.1/ao_pins.h [new file with mode: 0644]
src/telelco-v0.1/ao_telelco.c [new file with mode: 0644]

index b49c9dba256a5383cbef56bf2e4d72ebfc2e123a..9c35b3240e92e651dbbc51502046cc6e6a137274 100644 (file)
 #include <ao.h>
 #include <ao_pad.h>
 #include <ao_lco_cmd.h>
+#include <ao_lco_func.h>
 #include <ao_radio_cmac.h>
 
-static __xdata struct ao_pad_command   command;
-static __xdata struct ao_pad_query     query;
-static __pdata uint16_t        launch_box;
-static __pdata uint8_t launch_channels;
+static __pdata uint16_t        lco_box;
+static __pdata uint8_t lco_channels;
 static __pdata uint16_t        tick_offset;
 
 static void
-launch_args(void) __reentrant
+lco_args(void) __reentrant
 {
        ao_cmd_decimal();
-       launch_box = ao_cmd_lex_i;
+       lco_box = ao_cmd_lex_i;
        ao_cmd_hex();
-       launch_channels = ao_cmd_lex_i;
+       lco_channels = ao_cmd_lex_i;
 }
 
+static struct ao_pad_query     ao_pad_query;
+static uint16_t                        tick_offset;
+
 static int8_t
-launch_query(void)
+lco_query(void)
 {
        uint8_t i;
        int8_t  r = AO_RADIO_CMAC_OK;
 
-       tick_offset = ao_time();
        for (i = 0; i < 10; i++) {
                printf ("."); flush();
-               command.tick = ao_time();
-               command.box = launch_box;
-               command.cmd = AO_LAUNCH_QUERY;
-               command.channels = launch_channels;
-               ao_radio_cmac_send(&command, sizeof (command));
-               r = ao_radio_cmac_recv(&query, sizeof (query), AO_MS_TO_TICKS(500));
+               r = ao_lco_query(lco_box, &ao_pad_query, &tick_offset);
                if (r == AO_RADIO_CMAC_OK)
                        break;
        }
-       tick_offset -= query.tick;
        printf("\n"); flush();
        return r;
 }
 
 static void
-launch_report_cmd(void) __reentrant
+lco_arm(void)
+{
+       ao_lco_arm(lco_box, lco_channels, tick_offset);
+}
+
+static void
+lco_ignite(void)
+{
+       ao_lco_ignite(lco_box, lco_channels, tick_offset);
+}
+
+static void
+lco_report_cmd(void) __reentrant
 {
        int8_t          r;
        uint8_t         c;
 
-       launch_args();
+       lco_args();
        if (ao_cmd_status != ao_cmd_success)
                return;
-       r = launch_query();
+       r = lco_query();
        switch (r) {
        case AO_RADIO_CMAC_OK:
-               switch (query.arm_status) {
-               case ao_igniter_ready:
-               case ao_igniter_active:
+               switch (ao_pad_query.arm_status) {
+               case AO_PAD_ARM_STATUS_ARMED:
                        printf ("Armed: ");
                        break;
-               default:
+               case AO_PAD_ARM_STATUS_DISARMED:
                        printf("Disarmed: ");
+                       break;
+               case AO_PAD_ARM_STATUS_UNKNOWN:
+               default:
+                       printf("Unknown: ");
+                       break;
                }
                for (c = 0; c < AO_PAD_MAX_CHANNELS; c++) {
-                       if (query.channels & (1 << c)) {
+                       if (ao_pad_query.channels & (1 << c)) {
                                printf (" pad %d ", c);
-                               switch (query.igniter_status[c]) {
+                               switch (ao_pad_query.igniter_status[c]) {
                                default:
                                        printf("unknown, ");
                                        break;
@@ -106,39 +117,19 @@ launch_report_cmd(void) __reentrant
 }
 
 static void
-launch_arm(void) __reentrant
-{
-       command.tick = ao_time() - tick_offset;
-       command.box = launch_box;
-       command.cmd = AO_LAUNCH_ARM;
-       command.channels = launch_channels;
-       ao_radio_cmac_send(&command, sizeof (command));
-}
-
-static void
-launch_ignite(void) __reentrant
-{
-       command.tick = ao_time() - tick_offset;
-       command.box = launch_box;
-       command.cmd = AO_LAUNCH_FIRE;
-       command.channels = 0;
-       ao_radio_cmac_send(&command, sizeof (command));
-}
-
-static void
-launch_fire_cmd(void) __reentrant
+lco_fire_cmd(void) __reentrant
 {
        static __xdata struct ao_pad_command    command;
        uint8_t         secs;
        uint8_t         i;
        int8_t          r;
 
-       launch_args();
+       lco_args();
        ao_cmd_decimal();
        secs = ao_cmd_lex_i;
        if (ao_cmd_status != ao_cmd_success)
                return;
-       r = launch_query();
+       r = lco_query();
        if (r != AO_RADIO_CMAC_OK) {
                printf("query failed %d\n", r);
                return;
@@ -146,7 +137,7 @@ launch_fire_cmd(void) __reentrant
 
        for (i = 0; i < 4; i++) {
                printf("arm %d\n", i); flush();
-               launch_arm();
+               lco_arm();
        }
 
        secs = secs * 10 - 5;
@@ -154,40 +145,40 @@ launch_fire_cmd(void) __reentrant
                secs = 100;
        for (i = 0; i < secs; i++) {
                printf("fire %d\n", i); flush();
-               launch_ignite();
+               lco_ignite();
                ao_delay(AO_MS_TO_TICKS(100));
        }
 }
 
 static void
-launch_arm_cmd(void) __reentrant
+lco_arm_cmd(void) __reentrant
 {
        uint8_t i;
        int8_t  r;
-       launch_args();
-       r = launch_query();
+       lco_args();
+       r = lco_query();
        if (r != AO_RADIO_CMAC_OK) {
                printf("query failed %d\n", r);
                return;
        }
        for (i = 0; i < 4; i++)
-               launch_arm();
+               lco_arm();
 }
 
 static void
-launch_ignite_cmd(void) __reentrant
+lco_ignite_cmd(void) __reentrant
 {
        uint8_t i;
-       launch_args();
+       lco_args();
        for (i = 0; i < 4; i++)
-               launch_ignite();
+               lco_ignite();
 }
 
 static __code struct ao_cmds ao_lco_cmds[] = {
-       { launch_report_cmd,    "l <box> <channel>\0Get remote launch status" },
-       { launch_fire_cmd,      "F <box> <channel> <secs>\0Fire remote igniter" },
-       { launch_arm_cmd,       "a <box> <channel>\0Arm remote igniter" },
-       { launch_ignite_cmd,    "i <box> <channel>\0Pulse remote igniter" },
+       { lco_report_cmd,       "l <box> <channel>\0Get remote status" },
+       { lco_fire_cmd,         "F <box> <channel> <secs>\0Fire remote igniters" },
+       { lco_arm_cmd,          "a <box> <channel>\0Arm remote igniter" },
+       { lco_ignite_cmd,       "i <box> <channel>\0Pulse remote igniter" },
        { 0, NULL },
 };
 
diff --git a/src/drivers/ao_lco_func.c b/src/drivers/ao_lco_func.c
new file mode 100644 (file)
index 0000000..152b5d1
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright © 2012 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_pad.h>
+#include <ao_radio_cmac.h>
+#include <ao_lco_func.h>
+
+static __xdata struct ao_pad_command   command;
+static __xdata uint8_t                 ao_lco_mutex;
+
+int8_t
+ao_lco_query(uint16_t box, struct ao_pad_query *query, uint16_t *tick_offset)
+{
+       uint8_t         i;
+       int8_t          r;
+       uint16_t        time;
+
+       ao_mutex_get(&ao_lco_mutex);
+       time = ao_time();
+       command.tick = time;
+       command.box = box;
+       command.cmd = AO_LAUNCH_QUERY;
+       command.channels = 0;
+       ao_radio_cmac_send(&command, sizeof (command));
+       r = ao_radio_cmac_recv(query, sizeof (*query), AO_MS_TO_TICKS(500));
+       if (r == AO_RADIO_CMAC_OK)
+               *tick_offset = time - query->tick;
+       ao_mutex_put(&ao_lco_mutex);
+       return r;
+}
+
+void
+ao_lco_arm(uint16_t box, uint8_t channels, uint16_t tick_offset)
+{
+       ao_mutex_get(&ao_lco_mutex);
+       command.tick = ao_time() - tick_offset;
+       command.box = box;
+       command.cmd = AO_LAUNCH_ARM;
+       command.channels = channels;
+       ao_radio_cmac_send(&command, sizeof (command));
+       ao_mutex_put(&ao_lco_mutex);
+}
+
+void
+ao_lco_ignite(uint16_t box, uint8_t channels, uint16_t tick_offset)
+{
+       ao_mutex_get(&ao_lco_mutex);
+       command.tick = ao_time() - tick_offset;
+       command.box = box;
+       command.cmd = AO_LAUNCH_FIRE;
+       command.channels = channels;
+       ao_radio_cmac_send(&command, sizeof (command));
+       ao_mutex_put(&ao_lco_mutex);
+}
+
diff --git a/src/drivers/ao_lco_func.h b/src/drivers/ao_lco_func.h
new file mode 100644 (file)
index 0000000..dccf602
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright © 2012 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_LCO_FUNC_H_
+#define _AO_LCO_FUNC_H_
+
+#include <ao_pad.h>
+
+int8_t
+ao_lco_query(uint16_t box, struct ao_pad_query *query, uint16_t *tick_offset);
+
+void
+ao_lco_arm(uint16_t box, uint8_t channels, uint16_t tick_offset);
+
+void
+ao_lco_ignite(uint16_t box, uint8_t channels, uint16_t tick_offset);
+
+#endif /* _AO_LCO_FUNC_H_ */
diff --git a/src/telelco-v0.1/Makefile b/src/telelco-v0.1/Makefile
new file mode 100644 (file)
index 0000000..32115c4
--- /dev/null
@@ -0,0 +1,97 @@
+#
+# AltOS build for TeleLCO
+#
+#
+
+include ../stm/Makefile.defs
+
+INC = \
+       ao.h \
+       ao_arch.h \
+       ao_arch_funcs.h \
+       ao_companion.h \
+       ao_data.h \
+       ao_sample.h \
+       ao_pins.h \
+       ao_product.h \
+       ao_cc_spi.h \
+       ao_seven_segment.h \
+       ao_lco.h \
+       ao_lco_cmd.h \
+       ao_lco_func.h \
+       ao_radio_spi.h \
+       ao_radio_cmac.h \
+       stm32l.h
+
+#
+# Common AltOS sources
+#
+
+#PROFILE=ao_profile.c
+#PROFILE_DEF=-DAO_PROFILE=1
+
+ALTOS_SRC = \
+       ao_interrupt.c \
+       ao_product.c \
+       ao_romconfig.c \
+       ao_cmd.c \
+       ao_config.c \
+       ao_task.c \
+       ao_led.c \
+       ao_stdio.c \
+       ao_panic.c \
+       ao_timer.c \
+       ao_mutex.c \
+       ao_freq.c \
+       ao_dma_stm.c \
+       ao_spi_stm.c \
+       ao_beep_stm.c \
+       ao_storage.c \
+       ao_eeprom_stm.c \
+       ao_lcd_stm.c \
+       ao_usb_stm.c \
+       ao_exti_stm.c \
+       ao_radio_master.c \
+       ao_seven_segment.c \
+       ao_quadrature.c \
+       ao_button.c \
+       ao_event.c \
+       ao_lco.c \
+       ao_lco_cmd.c \
+       ao_lco_func.c \
+       ao_radio_cmac_cmd.c
+
+PRODUCT=TeleLCO-v0.1
+PRODUCT_DEF=-DMEGAMETRUM
+IDPRODUCT=0x0023
+
+CFLAGS = $(PRODUCT_DEF) $(STM_CFLAGS) $(PROFILE_DEF) -Os -g
+
+PROGNAME=telelco-v0.1
+PROG=$(PROGNAME)-$(VERSION).elf
+
+SRC=$(ALTOS_SRC) ao_telelco.c
+OBJ=$(SRC:.c=.o)
+
+all: $(PROG)
+
+$(PROG): Makefile $(OBJ) altos.ld
+       $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ) $(SAT_CLIB) -lgcc
+
+../altitude.h: make-altitude
+       nickle $< > $@
+
+$(OBJ): $(INC)
+
+ao_product.h: ao-make-product.5c ../Version
+       $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@
+
+distclean:     clean
+
+clean:
+       rm -f *.o $(PROGNAME)-*.elf
+       rm -f ao_product.h
+
+install:
+
+uninstall:
diff --git a/src/telelco-v0.1/ao_lco.c b/src/telelco-v0.1/ao_lco.c
new file mode 100644 (file)
index 0000000..7ecee19
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ * Copyright © 2012 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_lco.h>
+#include <ao_event.h>
+#include <ao_seven_segment.h>
+#include <ao_quadrature.h>
+#include <ao_lco_func.h>
+#include <ao_radio_cmac.h>
+
+#if 1
+#define PRINTD(...) do { printf ("\r%5u %s: ", ao_tick_count, __func__); printf(__VA_ARGS__); flush(); } while(0)
+#else
+#define PRINTD(...) 
+#endif
+
+#define AO_LCO_PAD_DIGIT       0
+#define AO_LCO_BOX_DIGIT_1     1
+#define AO_LCO_BOX_DIGIT_10    2
+
+#define AO_NUM_BOX             10
+
+static uint8_t ao_lco_mutex;
+static uint8_t ao_lco_pad;
+static uint8_t ao_lco_box;
+static uint8_t ao_lco_armed;
+static uint8_t ao_lco_firing;
+static uint8_t ao_lco_valid;
+
+static void
+ao_lco_set_pad(void)
+{
+       ao_seven_segment_set(AO_LCO_PAD_DIGIT, ao_lco_pad);
+}
+
+static void
+ao_lco_set_box(void)
+{
+       ao_seven_segment_set(AO_LCO_BOX_DIGIT_1, ao_lco_box % 10);
+       ao_seven_segment_set(AO_LCO_BOX_DIGIT_10, ao_lco_box / 10);
+}
+
+static void
+ao_lco_input(void)
+{
+       static struct ao_event  event;
+
+       ao_lco_set_pad();
+       ao_lco_set_box();
+       for (;;) {
+               ao_event_get(&event);
+               PRINTD("event type %d unit %d value %d\n",
+                      event.type, event.unit, event.value);
+               switch (event.type) {
+               case AO_EVENT_QUADRATURE:
+                       switch (event.unit) {
+                       case AO_QUADRATURE_PAD:
+                               if (!ao_lco_armed) {
+                                       ao_lco_pad = event.value & 3;
+                                       ao_lco_valid = 0;
+                                       ao_quadrature_count[AO_QUADRATURE_PAD] = ao_lco_pad;
+                                       ao_lco_set_pad();
+                               }
+                               break;
+                       case AO_QUADRATURE_BOX:
+                               if (!ao_lco_armed) {
+                                       ao_lco_box = event.value;
+                                       ao_lco_valid = 0;
+                                       while (ao_lco_box >= AO_NUM_BOX)
+                                               ao_lco_box -= AO_NUM_BOX;
+                                       while (ao_lco_box < 0)
+                                               ao_lco_box += AO_NUM_BOX;
+                                       ao_quadrature_count[AO_QUADRATURE_PAD] = ao_lco_box;
+                                       ao_lco_set_box();
+                               }
+                               break;
+                       }
+                       break;
+               case AO_EVENT_BUTTON:
+                       switch (event.unit) {
+                       case AO_BUTTON_ARM:
+                               ao_lco_armed = event.value;
+                               PRINTD("Armed %d\n", ao_lco_armed);
+                               ao_wakeup(&ao_lco_armed);
+                               break;
+                       case AO_BUTTON_FIRE:
+                               if (ao_lco_armed) {
+                                       ao_lco_firing = event.value;
+                                       PRINTD("Firing %d\n", ao_lco_firing);
+                                       ao_wakeup(&ao_lco_armed);
+                               }
+                               break;
+                       }
+                       break;
+               }
+       }
+}
+
+static AO_LED_TYPE     continuity_led[AO_LED_CONTINUITY_NUM] = {
+#ifdef AO_LED_CONTINUITY_0
+       AO_LED_CONTINUITY_0,
+#endif
+#ifdef AO_LED_CONTINUITY_1
+       AO_LED_CONTINUITY_1,
+#endif
+#ifdef AO_LED_CONTINUITY_2
+       AO_LED_CONTINUITY_2,
+#endif
+#ifdef AO_LED_CONTINUITY_3
+       AO_LED_CONTINUITY_3,
+#endif
+#ifdef AO_LED_CONTINUITY_4
+       AO_LED_CONTINUITY_4,
+#endif
+#ifdef AO_LED_CONTINUITY_5
+       AO_LED_CONTINUITY_5,
+#endif
+#ifdef AO_LED_CONTINUITY_6
+       AO_LED_CONTINUITY_6,
+#endif
+#ifdef AO_LED_CONTINUITY_7
+       AO_LED_CONTINUITY_7,
+#endif
+};
+
+static uint16_t        ao_lco_tick_offset;
+
+static void
+ao_lco_update(void)
+{
+       int8_t                  r;
+       uint8_t                 c;
+       struct ao_pad_query     query;
+
+       r = ao_lco_query(ao_lco_box, &query, &ao_lco_tick_offset);
+       if (r != AO_RADIO_CMAC_OK) {
+               PRINTD("lco_query return %d\n", r);
+               return;
+       }
+
+#if 0
+       PRINTD("lco_query success arm_status %d i0 %d i1 %d i2 %d i3 %d\n",
+              query.arm_status,
+              query.igniter_status[0],
+              query.igniter_status[1],
+              query.igniter_status[2],
+              query.igniter_status[3]);
+#endif
+
+       ao_lco_valid = 1;
+       if (query.arm_status)
+               ao_led_on(AO_LED_REMOTE_ARM);
+       else
+               ao_led_off(AO_LED_REMOTE_ARM);
+       for (c = 0; c < AO_LED_CONTINUITY_NUM; c++) {
+               uint8_t status;
+
+               if (query.channels & (1 << c))
+                       status = query.igniter_status[c];
+               else
+                       status = AO_PAD_IGNITER_STATUS_NO_IGNITER_RELAY_OPEN;
+               if (status == AO_PAD_IGNITER_STATUS_GOOD_IGNITER_RELAY_OPEN)
+                       ao_led_on(continuity_led[c]);
+               else
+                       ao_led_off(continuity_led[c]);
+       }
+}
+
+static void
+ao_lco_monitor(void)
+{
+       uint16_t                delay;
+
+       for (;;) {
+               if (ao_lco_armed && ao_lco_firing) {
+                       PRINTD("Firing box %d pad %d: valid %d\n",
+                              ao_lco_box, ao_lco_pad, ao_lco_valid);
+                       if (!ao_lco_valid)
+                               ao_lco_update();
+                       if (ao_lco_valid)
+                               ao_lco_ignite(ao_lco_box, ao_lco_pad, ao_lco_tick_offset);
+               } else {
+                       ao_lco_update();
+               }
+               if (ao_lco_armed && ao_lco_firing)
+                       delay = AO_MS_TO_TICKS(100);
+               else
+                       delay = AO_SEC_TO_TICKS(1);
+               ao_alarm(delay);
+               ao_sleep(&ao_lco_armed);
+               ao_clear_alarm();
+       }
+}
+
+static void
+ao_lco_arm_warn(void)
+{
+       for (;;) {
+               while (!ao_lco_armed)
+                       ao_sleep(&ao_lco_armed);
+               ao_beep_for(AO_BEEP_MID, AO_MS_TO_TICKS(200));
+               ao_delay(AO_MS_TO_TICKS(200));
+       }
+}
+
+static struct ao_task ao_lco_input_task;
+static struct ao_task ao_lco_monitor_task;
+static struct ao_task ao_lco_arm_warn_task;
+
+void
+ao_lco_init(void)
+{
+       ao_add_task(&ao_lco_input_task, ao_lco_input, "lco input");
+       ao_add_task(&ao_lco_monitor_task, ao_lco_monitor, "lco monitor");
+       ao_add_task(&ao_lco_arm_warn_task, ao_lco_arm_warn, "lco arm warn");
+}
diff --git a/src/telelco-v0.1/ao_lco.h b/src/telelco-v0.1/ao_lco.h
new file mode 100644 (file)
index 0000000..253f970
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright © 2012 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_LCO_H_
+#define _AO_LCO_H_
+
+void
+ao_lco_init(void);
+
+#endif /* _AO_LCO_H_ */
diff --git a/src/telelco-v0.1/ao_pins.h b/src/telelco-v0.1/ao_pins.h
new file mode 100644 (file)
index 0000000..60cf018
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * Copyright © 2012 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_
+
+/* 8MHz High speed external crystal */
+#define AO_HSE                 8000000
+
+/* PLLVCO = 96MHz (so that USB will work) */
+#define AO_PLLMUL              12
+#define AO_RCC_CFGR_PLLMUL     (STM_RCC_CFGR_PLLMUL_12)
+
+/* SYSCLK = 32MHz (no need to go faster than CPU) */
+#define AO_PLLDIV              3
+#define AO_RCC_CFGR_PLLDIV     (STM_RCC_CFGR_PLLDIV_3)
+
+/* HCLK = 32MHz (CPU clock) */
+#define AO_AHB_PRESCALER       1
+#define AO_RCC_CFGR_HPRE_DIV   STM_RCC_CFGR_HPRE_DIV_1
+
+/* Run APB1 at 16MHz (HCLK/2) */
+#define AO_APB1_PRESCALER      2
+#define AO_RCC_CFGR_PPRE1_DIV  STM_RCC_CFGR_PPRE2_DIV_2
+
+/* Run APB2 at 16MHz (HCLK/2) */
+#define AO_APB2_PRESCALER      2
+#define AO_RCC_CFGR_PPRE2_DIV  STM_RCC_CFGR_PPRE2_DIV_2
+
+#define HAS_EEPROM             1
+#define USE_INTERNAL_FLASH     1
+#define HAS_USB                        1
+#define HAS_BEEP               1
+#define HAS_RADIO              1
+#define HAS_TELEMETRY          0
+#define HAS_AES                        1
+
+#define HAS_SPI_1              1
+#define SPI_1_PA5_PA6_PA7      1
+#define SPI_1_PB3_PB4_PB5      0
+#define SPI_1_PE13_PE14_PE15   0
+
+#define HAS_SPI_2              1
+#define SPI_2_PB13_PB14_PB15   1
+#define SPI_2_PD1_PD3_PD4      0
+#define SPI_2_GPIO             (&stm_gpiob)
+#define SPI_2_SCK              13
+#define SPI_2_MISO             14
+#define SPI_2_MOSI             15
+
+#define HAS_I2C_1              0
+
+#define HAS_I2C_2              0
+
+#define PACKET_HAS_SLAVE       0
+#define PACKET_HAS_MASTER      0
+
+/*
+ * Radio is a cc1111 connected via SPI
+ */
+#define AO_RADIO_CAL_DEFAULT   1186611
+
+#define AO_RADIO_SPI_BUS       AO_SPI_2_PB13_PB14_PB15
+#define AO_RADIO_CS_PORT       (&stm_gpiob)
+#define AO_RADIO_CS_PIN                12
+
+#define AO_RADIO_INT_PORT      (&stm_gpioc)
+#define AO_RADIO_INT_PIN       14
+
+#define LOW_LEVEL_DEBUG                0
+
+#define LED_PORT_ENABLE                STM_RCC_AHBENR_GPIOCEN
+#define LED_PORT               (&stm_gpioc)
+#define LED_PIN_RED            7
+#define LED_PIN_GREEN          8
+#define LED_PIN_CONTINUITY_3   9
+#define LED_PIN_CONTINUITY_2   10
+#define LED_PIN_CONTINUITY_1   11
+#define LED_PIN_CONTINUITY_0   12
+#define LED_PIN_REMOTE_ARM     13
+#define AO_LED_RED             (1 << LED_PIN_RED)
+#define AO_LED_GREEN           (1 << LED_PIN_GREEN)
+#define AO_LED_CONTINUITY_3    (1 << LED_PIN_CONTINUITY_3)
+#define AO_LED_CONTINUITY_2    (1 << LED_PIN_CONTINUITY_2)
+#define AO_LED_CONTINUITY_1    (1 << LED_PIN_CONTINUITY_1)
+#define AO_LED_CONTINUITY_0    (1 << LED_PIN_CONTINUITY_0)
+
+#define AO_LED_CONTINUITY_NUM  4
+
+#define AO_LED_REMOTE_ARM      (1 << LED_PIN_REMOTE_ARM)
+
+#define LEDS_AVAILABLE         (AO_LED_RED |           \
+                                AO_LED_GREEN |         \
+                                AO_LED_CONTINUITY_3 |  \
+                                AO_LED_CONTINUITY_2 |  \
+                                AO_LED_CONTINUITY_1 |  \
+                                AO_LED_CONTINUITY_0 |  \
+                                AO_LED_REMOTE_ARM)
+
+/* LCD displays */
+
+#define AO_LCD_STM_SEG_ENABLED_0 (             \
+               (1 << 0) | /* PA1 */            \
+               (1 << 1) | /* PA2 */            \
+               (1 << 2) | /* PA3 */            \
+               (1 << 3) | /* PA6 */            \
+               (1 << 4) | /* PA7 */            \
+               (1 << 5) | /* PB0 */            \
+               (1 << 6) | /* PB1 */            \
+               (1 << 7) | /* PB3 */            \
+               (0 << 8) | /* PB4 */            \
+               (0 << 9) | /* PB5 */            \
+               (0 << 10) | /* PB10 */          \
+               (0 << 11) | /* PB11 */          \
+               (0 << 12) | /* PB12 */          \
+               (0 << 13) | /* PB13 */          \
+               (0 << 14) | /* PB14 */          \
+               (0 << 15) | /* PB15 */          \
+               (0 << 16) | /* PB8 */           \
+               (0 << 17) | /* PA15 */          \
+               (0 << 18) | /* PC0 */           \
+               (0 << 19) | /* PC1 */           \
+               (0 << 20) | /* PC2 */           \
+               (0 << 21) | /* PC3 */           \
+               (0 << 22) | /* PC4 */           \
+               (0 << 23) | /* PC5 */           \
+               (0 << 24) | /* PC6 */           \
+               (0 << 25) | /* PC7 */           \
+               (0 << 26) | /* PC8 */           \
+               (0 << 27) | /* PC9 */           \
+               (0 << 28) | /* PC10 or PD8 */   \
+               (0 << 29) | /* PC11 or PD9 */   \
+               (0 << 30) | /* PC12 or PD10 */  \
+               (0 << 31))  /* PD2 or PD11 */
+
+#define AO_LCD_STM_SEG_ENABLED_1 (             \
+               (0 << 0) | /* PD12 */           \
+               (0 << 1) | /* PD13 */           \
+               (0 << 2) | /* PD14 */           \
+               (0 << 3) | /* PD15 */           \
+               (0 << 4) | /* PE0 */            \
+               (0 << 5) | /* PE1 */            \
+               (0 << 6) | /* PE2 */            \
+               (0 << 7))  /* PE3 */
+
+#define AO_LCD_STM_COM_ENABLED (               \
+               (1 << 0) | /* PA8 */            \
+               (1 << 1) | /* PA9 */            \
+               (1 << 2) | /* PA10 */           \
+               (0 << 3) | /* PB9 */            \
+               (0 << 4) | /* PC10 */           \
+               (0 << 5) | /* PC11 */           \
+               (0 << 6)) /* PC12 */
+
+#define AO_LCD_28_ON_C 0
+
+#define AO_LCD_DUTY    STM_LCD_CR_DUTY_1_4
+
+#define AO_SEGMENT_0           0
+#define AO_SEGMENT_1           5
+#define AO_SEGMENT_2           1
+#define AO_SEGMENT_3           6
+#define AO_SEGMENT_4           4
+#define AO_SEGMENT_5           2
+#define AO_SEGMENT_6           3
+#define AO_SEGMENT_7           7
+
+/*
+ * Use event queue for input devices
+ */
+
+#define AO_EVENT               1
+
+/*
+ * Knobs
+ */
+
+#define AO_QUADRATURE_COUNT    2
+#define AO_QUADRATURE_MODE     0
+
+#define AO_QUADRATURE_0_PORT   &stm_gpioc
+#define AO_QUADRATURE_0_A      3
+#define AO_QUADRATURE_0_B      2
+
+#define AO_QUADRATURE_PAD      0
+
+#define AO_QUADRATURE_1_PORT   &stm_gpioc
+#define AO_QUADRATURE_1_A      1
+#define AO_QUADRATURE_1_B      0
+
+#define AO_QUADRATURE_BOX      1
+
+/*
+ * Buttons
+ */
+
+#define AO_BUTTON_COUNT                2
+#define AO_BUTTON_MODE         AO_EXTI_MODE_PULL_UP
+
+#define AO_BUTTON_0_PORT       &stm_gpioc
+#define AO_BUTTON_0            4
+
+#define AO_BUTTON_ARM          0
+
+#define AO_BUTTON_1_PORT       &stm_gpioc
+#define AO_BUTTON_1            5
+
+#define AO_BUTTON_FIRE         1
+
+#endif /* _AO_PINS_H_ */
diff --git a/src/telelco-v0.1/ao_telelco.c b/src/telelco-v0.1/ao_telelco.c
new file mode 100644 (file)
index 0000000..080a140
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * 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_exti.h>
+#include <ao_packet.h>
+#include <ao_companion.h>
+#include <ao_profile.h>
+#include <ao_pyro.h>
+#include <ao_aes.h>
+#include <ao_seven_segment.h>
+#include <ao_quadrature.h>
+#include <ao_button.h>
+#include <ao_lco.h>
+#include <ao_lco_cmd.h>
+#include <ao_radio_cmac_cmd.h>
+
+int
+main(void)
+{
+       ao_clock_init();
+       
+       ao_led_init(LEDS_AVAILABLE);
+       ao_led_on(AO_LED_GREEN);
+       ao_timer_init();
+
+       ao_spi_init();
+       ao_dma_init();
+       ao_exti_init();
+
+       ao_beep_init();
+       ao_cmd_init();
+
+       ao_lcd_stm_init();
+       ao_seven_segment_init();
+       ao_quadrature_init();
+       ao_button_init();
+
+       ao_storage_init();
+       
+       ao_radio_init();
+
+       ao_usb_init();
+
+       ao_config_init();
+       
+       ao_quadrature_init();
+       ao_button_init();
+       ao_lco_init();
+       ao_lco_cmd_init();
+//     ao_radio_cmac_cmd_init();
+       
+       ao_start_scheduler();
+       return 0;
+}