summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorroot <root@new-selene.erebei.org>2015-12-01 02:11:23 +0000
committerroot <root@new-selene.erebei.org>2015-12-01 02:11:23 +0000
commitb4775420082f46cac862c8c55f23a68a2e96019d (patch)
tree85ceb94ed1b4bff4bc6197567bcda81bfff29749 /app
parentb55240eb43a92c552003b8b324a385e041f84f12 (diff)
downloadcandlestick-b4775420082f46cac862c8c55f23a68a2e96019d.tar.gz
candlestick-b4775420082f46cac862c8c55f23a68a2e96019d.tar.bz2
candlestick-b4775420082f46cac862c8c55f23a68a2e96019d.zip
fish
Diffstat (limited to 'app')
-rw-r--r--app/adc.c51
-rw-r--r--app/key.c61
-rw-r--r--app/keyboard.c129
-rw-r--r--app/map.c410
-rw-r--r--app/state.c72
5 files changed, 723 insertions, 0 deletions
diff --git a/app/adc.c b/app/adc.c
new file mode 100644
index 0000000..1565af5
--- /dev/null
+++ b/app/adc.c
@@ -0,0 +1,51 @@
+#include "project.h"
+
+int host_has_power;
+
+void
+adc_tick (void)
+{
+ uint16_t v;
+
+ if (adc_eoc (ADC1))
+ {
+ v = adc_read_regular (ADC1);
+
+ host_has_power = ! !(v > 1000);
+
+ }
+
+ adc_start_conversion_direct (ADC1);
+}
+
+
+
+static uint8_t channels[] = { ADC_CHANNEL0 };
+
+#define n_channels (sizeof(channels)/sizeof(channels[0]))
+
+void
+adc_init (void)
+{
+
+ rcc_periph_clock_enable (RCC_ADC1);
+
+ //gpio_mode_setup(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_DOWN, GPIO0);
+ gpio_set_mode (GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_ANALOG, GPIO0);
+
+ adc_off (ADC1);
+ adc_disable_scan_mode (ADC1);
+ adc_set_single_conversion_mode (ADC1);
+ adc_disable_external_trigger_regular (ADC1);
+ adc_set_right_aligned (ADC1);
+ adc_set_sample_time_on_all_channels (ADC1, ADC_SMPR_SMP_28DOT5CYC);
+
+ adc_power_on (ADC1);
+
+ adc_reset_calibration (ADC1);
+ adc_calibration (ADC1);
+ adc_set_regular_sequence (ADC1, n_channels, channels);
+ adc_start_conversion_direct (ADC1);
+
+ host_has_power = 0;
+}
diff --git a/app/key.c b/app/key.c
new file mode 100644
index 0000000..6449216
--- /dev/null
+++ b/app/key.c
@@ -0,0 +1,61 @@
+#include "project.h"
+
+
+int have_key;
+
+static size_t key_len;
+
+static uint8_t key[512];
+
+
+void
+key_wipe (void)
+{
+ have_key = 0;
+ locked = 0;
+ memset (key, 0, sizeof (key));
+}
+
+
+void
+key_set (char *in, size_t len)
+{
+ if (len > sizeof (key))
+ len = sizeof (key);
+ memcpy (key, in, len);
+ key_len = len;
+ locked = 0;
+ have_key = 1;
+}
+
+
+void
+key_send (void)
+{
+ size_t i;
+ if (!have_key)
+ {
+ send_str ("*no key*\n");
+ return;
+ }
+ if (locked)
+ {
+ send_str ("*locked*\n");
+ return;
+ }
+
+ for (i = 0; i < key_len; ++i)
+ {
+ send_ascii (key[i]);
+ }
+
+ locked++;
+}
+
+
+void
+key_init (void)
+{
+ key_wipe ();
+ have_key = 0;
+}
diff --git a/app/keyboard.c b/app/keyboard.c
new file mode 100644
index 0000000..e3e3465
--- /dev/null
+++ b/app/keyboard.c
@@ -0,0 +1,129 @@
+#include "project.h"
+
+static const uint8_t keyboard_report_descriptor[] = {
+ 0x05, 0x01, /* Usage Page (Generic Desktop) */
+ 0x09, 0x06, /* Usage (Keyboard) */
+ 0xA1, 0x01, /* Collection (Application) */
+ 0x05, 0x07, /* Usage page (Key Codes) */
+ 0x19, 0xE0, /* Usage minimum (224) */
+ 0x29, 0xE7, /* Usage maximum (231) */
+ 0x15, 0x00, /* Logical minimum (0) */
+ 0x25, 0x01, /* Logical maximum (1) */
+ 0x75, 0x01, /* Report size (1) */
+ 0x95, 0x08, /* Report count (8) */
+ 0x81, 0x02, /* Input (data, variable, absolute) */
+ 0x95, 0x01, /* Report count (1) */
+ 0x75, 0x08, /* Report size (8) */
+ 0x81, 0x01, /* Input (constant) */
+ 0x95, 0x06, /* Report count (6) */
+ 0x75, 0x08, /* Report size (8) */
+ 0x15, 0x00, /* Logical minimum (0) */
+ //0x25, 0x65, /* Logical maximum (101) */
+ 0x26, 0xff, 0x00, /* Logical maximum (255) */
+ //0x26, 0x7f, 0x00, /* Logical maximum (255) */
+ 0x05, 0x07, /* Usage page (key codes) */
+ 0x19, 0x00, /* Usage minimum (0) */
+ 0x2A, 0xff, 0x00, /* Usage maximum (255) */
+// 0x29, 0x65, /* Usage maximum (101) */
+// 0x2A, 0xff, 0x03, /* Usage maximum (1023) */
+ 0x81, 0x00, /* Input (data, array) */
+ 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
+ 0x09, 0x80, /* USAGE (System Control) */
+ 0xA1, 0x01, /* COLLECTION (Application) */
+ 0x75, 0x02, /* REPORT_SIZE (2) */
+ 0x95, 0x01, /* REPORT_COUNT (1) */
+ 0x15, 0x01, /* LOGICAL_MIN (1) */
+ 0x25, 0x03, /* LOGICAL_MAX (3) */
+ 0x09, 0x82, /* USAGE (System Sleep) */
+ 0x09, 0x81, /* USAGE (System Power Down) */
+ 0x09, 0x83, /* USAGE (System Wake Up) */
+ 0x81, 0x60, /* INPUT (Data Ary Abs NPrf Null) */
+ 0x75, 0x06, /* REPORT_SIZE (6) */
+ 0x81, 0x03, /* INPUT (Cnst Var Abs) */
+ 0xc0, /* END COLLECTION */
+ 0xC0 /* End Collection */
+};
+
+
+static const struct
+{
+ struct usb_hid_descriptor hid_descriptor;
+ struct
+ {
+ uint8_t bReportDescriptorType;
+ uint16_t wDescriptorLength;
+ } __attribute__ ((packed)) hid_report;
+} __attribute__ ((packed)) keyboard_function =
+{
+ .hid_descriptor =
+ {
+ .bLength = sizeof (keyboard_function),.bDescriptorType =
+ USB_DT_HID,.bcdHID = 0x0100,.bCountryCode = 0,.bNumDescriptors = 1,}
+ ,.hid_report =
+ {
+ .bReportDescriptorType = USB_DT_REPORT,.wDescriptorLength =
+ sizeof (keyboard_report_descriptor),}
+,};
+
+const struct usb_endpoint_descriptor keyboard_endpoint = {
+ .bLength = USB_DT_ENDPOINT_SIZE,
+ .bDescriptorType = USB_DT_ENDPOINT,
+ .bEndpointAddress = 0x81,
+ .bmAttributes = USB_ENDPOINT_ATTR_INTERRUPT,
+ .wMaxPacketSize = 9,
+ .bInterval = 0x1 //0x20,
+};
+
+const struct usb_interface_descriptor keyboard_iface = {
+ .bLength = USB_DT_INTERFACE_SIZE,
+ .bDescriptorType = USB_DT_INTERFACE,
+ .bInterfaceNumber = 0,
+ .bAlternateSetting = 0,
+ .bNumEndpoints = 1,
+ .bInterfaceClass = USB_CLASS_HID,
+ .bInterfaceSubClass = 1, /* boot */
+ .bInterfaceProtocol = 1, /* keyboard */
+ .iInterface = 5,
+ .endpoint = &keyboard_endpoint,
+ .extra = &keyboard_function,
+ .extralen = sizeof (keyboard_function),
+};
+
+
+void
+keyboard_get_descriptor (uint8_t ** buf, uint16_t * len)
+{
+
+ /* Handle the HID report descriptor. */
+ *buf = (uint8_t *) keyboard_report_descriptor;
+ *len = sizeof (keyboard_report_descriptor);
+}
+
+void
+keyboard_keypress (int m, int k)
+{
+ uint8_t buf[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+
+ buf[0] = m;
+ buf[2] = k;
+ usbd_ep_write_packet (usbd_dev, 0x81, buf, 9);
+
+ delay_ms (10);
+
+ buf[0] = m;
+ buf[2] = 0;
+ usbd_ep_write_packet (usbd_dev, 0x81, buf, 9);
+
+ delay_ms (10);
+
+ if (m)
+ {
+ buf[0] = 0;
+ buf[2] = 0;
+ usbd_ep_write_packet (usbd_dev, 0x81, buf, 9);
+
+ delay_ms (10);
+ }
+
+}
diff --git a/app/map.c b/app/map.c
new file mode 100644
index 0000000..d63c171
--- /dev/null
+++ b/app/map.c
@@ -0,0 +1,410 @@
+#include "project.h"
+
+
+void
+send_ascii (unsigned char a)
+{
+ switch (a)
+ {
+#if 0
+ case '\0':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\001':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\002':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\003':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\004':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\005':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\006':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\a':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\b':
+ keyboard_keypress (0x00, 0x00);
+ break;
+#endif
+ case '\t':
+ keyboard_keypress (0x00, 0x2b);
+ break;
+#if 0
+ case '\n':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\v':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\f':
+ keyboard_keypress (0x00, 0x00);
+ break;
+#endif
+ case '\n':
+ case '\r':
+ keyboard_keypress (0x00, 0x28);
+ break;
+#if 0
+ case '\016':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\017':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\020':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\021':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\022':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\023':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\024':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\025':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\026':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\027':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\030':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\031':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\032':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\033':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\034':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\035':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\036':
+ keyboard_keypress (0x00, 0x00);
+ break;
+ case '\037':
+ keyboard_keypress (0x00, 0x00);
+ break;
+#endif
+ case ' ':
+ keyboard_keypress (0x00, 0x2c);
+ break;
+ case '!':
+ keyboard_keypress (0x02, 0x1e);
+ break;
+ case '"':
+ keyboard_keypress (0x02, 0x34);
+ break;
+ case '#':
+ keyboard_keypress (0x02, 0x20);
+ break;
+ case '$':
+ keyboard_keypress (0x02, 0x21);
+ break;
+ case '%':
+ keyboard_keypress (0x02, 0x22);
+ break;
+ case '&':
+ keyboard_keypress (0x02, 0x23);
+ break;
+ case '\047':
+ keyboard_keypress (0x00, 0x34);
+ break;
+ case '(':
+ keyboard_keypress (0x02, 0x26);
+ break;
+ case ')':
+ keyboard_keypress (0x02, 0x27);
+ break;
+ case '*':
+ keyboard_keypress (0x02, 0x25);
+ break;
+ case '+':
+ keyboard_keypress (0x02, 0x2e);
+ break;
+ case ',':
+ keyboard_keypress (0x00, 0x36);
+ break;
+ case '-':
+ keyboard_keypress (0x00, 0x2d);
+ break;
+ case '.':
+ keyboard_keypress (0x00, 0x37);
+ break;
+ case '/':
+ keyboard_keypress (0x00, 0x38);
+ break;
+ case '0':
+ keyboard_keypress (0x00, 0x27);
+ break;
+ case '1':
+ keyboard_keypress (0x00, 0x1e);
+ break;
+ case '2':
+ keyboard_keypress (0x00, 0x1f);
+ break;
+ case '3':
+ keyboard_keypress (0x00, 0x20);
+ break;
+ case '4':
+ keyboard_keypress (0x00, 0x21);
+ break;
+ case '5':
+ keyboard_keypress (0x00, 0x22);
+ break;
+ case '6':
+ keyboard_keypress (0x00, 0x23);
+ break;
+ case '7':
+ keyboard_keypress (0x00, 0x24);
+ break;
+ case '8':
+ keyboard_keypress (0x00, 0x25);
+ break;
+ case '9':
+ keyboard_keypress (0x00, 0x26);
+ break;
+ case ':':
+ keyboard_keypress (0x02, 0x33);
+ break;
+ case ';':
+ keyboard_keypress (0x00, 0x33);
+ break;
+ case '<':
+ keyboard_keypress (0x02, 0x36);
+ break;
+ case '=':
+ keyboard_keypress (0x00, 0x2e);
+ break;
+ case '>':
+ keyboard_keypress (0x02, 0x37);
+ break;
+ case '?':
+ keyboard_keypress (0x02, 0x38);
+ break;
+ case '@':
+ keyboard_keypress (0x02, 0x1f);
+ break;
+ case 'A':
+ keyboard_keypress (0x02, 0x04);
+ break;
+ case 'B':
+ keyboard_keypress (0x02, 0x05);
+ break;
+ case 'C':
+ keyboard_keypress (0x02, 0x06);
+ break;
+ case 'D':
+ keyboard_keypress (0x02, 0x07);
+ break;
+ case 'E':
+ keyboard_keypress (0x02, 0x08);
+ break;
+ case 'F':
+ keyboard_keypress (0x02, 0x09);
+ break;
+ case 'G':
+ keyboard_keypress (0x02, 0x0a);
+ break;
+ case 'H':
+ keyboard_keypress (0x02, 0x0b);
+ break;
+ case 'I':
+ keyboard_keypress (0x02, 0x0c);
+ break;
+ case 'J':
+ keyboard_keypress (0x02, 0x0d);
+ break;
+ case 'K':
+ keyboard_keypress (0x02, 0x0e);
+ break;
+ case 'L':
+ keyboard_keypress (0x02, 0x0f);
+ break;
+ case 'M':
+ keyboard_keypress (0x02, 0x10);
+ break;
+ case 'N':
+ keyboard_keypress (0x02, 0x11);
+ break;
+ case 'O':
+ keyboard_keypress (0x02, 0x12);
+ break;
+ case 'P':
+ keyboard_keypress (0x02, 0x13);
+ break;
+ case 'Q':
+ keyboard_keypress (0x02, 0x14);
+ break;
+ case 'R':
+ keyboard_keypress (0x02, 0x15);
+ break;
+ case 'S':
+ keyboard_keypress (0x02, 0x16);
+ break;
+ case 'T':
+ keyboard_keypress (0x02, 0x17);
+ break;
+ case 'U':
+ keyboard_keypress (0x02, 0x18);
+ break;
+ case 'V':
+ keyboard_keypress (0x02, 0x19);
+ break;
+ case 'W':
+ keyboard_keypress (0x02, 0x1a);
+ break;
+ case 'X':
+ keyboard_keypress (0x02, 0x1b);
+ break;
+ case 'Y':
+ keyboard_keypress (0x02, 0x1c);
+ break;
+ case 'Z':
+ keyboard_keypress (0x02, 0x1d);
+ break;
+ case '[':
+ keyboard_keypress (0x00, 0x2f);
+ break;
+ case '\\':
+ keyboard_keypress (0x00, 0x64);
+ break;
+ case ']':
+ keyboard_keypress (0x00, 0x30);
+ break;
+ case '^':
+ keyboard_keypress (0x02, 0x23);
+ break;
+ case '_':
+ keyboard_keypress (0x02, 0x2d);
+ break;
+ case '`':
+ keyboard_keypress (0x00, 0x32);
+ break;
+ case 'a':
+ keyboard_keypress (0x00, 0x04);
+ break;
+ case 'b':
+ keyboard_keypress (0x00, 0x05);
+ break;
+ case 'c':
+ keyboard_keypress (0x00, 0x06);
+ break;
+ case 'd':
+ keyboard_keypress (0x00, 0x07);
+ break;
+ case 'e':
+ keyboard_keypress (0x00, 0x08);
+ break;
+ case 'f':
+ keyboard_keypress (0x00, 0x09);
+ break;
+ case 'g':
+ keyboard_keypress (0x00, 0x0a);
+ break;
+ case 'h':
+ keyboard_keypress (0x00, 0x0b);
+ break;
+ case 'i':
+ keyboard_keypress (0x00, 0x0c);
+ break;
+ case 'j':
+ keyboard_keypress (0x00, 0x0d);
+ break;
+ case 'k':
+ keyboard_keypress (0x00, 0x0e);
+ break;
+ case 'l':
+ keyboard_keypress (0x00, 0x0f);
+ break;
+ case 'm':
+ keyboard_keypress (0x00, 0x10);
+ break;
+ case 'n':
+ keyboard_keypress (0x00, 0x11);
+ break;
+ case 'o':
+ keyboard_keypress (0x00, 0x12);
+ break;
+ case 'p':
+ keyboard_keypress (0x00, 0x13);
+ break;
+ case 'q':
+ keyboard_keypress (0x00, 0x14);
+ break;
+ case 'r':
+ keyboard_keypress (0x00, 0x15);
+ break;
+ case 's':
+ keyboard_keypress (0x00, 0x16);
+ break;
+ case 't':
+ keyboard_keypress (0x00, 0x17);
+ break;
+ case 'u':
+ keyboard_keypress (0x00, 0x18);
+ break;
+ case 'v':
+ keyboard_keypress (0x00, 0x19);
+ break;
+ case 'w':
+ keyboard_keypress (0x00, 0x1a);
+ break;
+ case 'x':
+ keyboard_keypress (0x00, 0x1b);
+ break;
+ case 'y':
+ keyboard_keypress (0x00, 0x1c);
+ break;
+ case 'z':
+ keyboard_keypress (0x00, 0x1d);
+ break;
+ case '{':
+ keyboard_keypress (0x02, 0x2f);
+ break;
+ case '|':
+ keyboard_keypress (0x02, 0x64);
+ break;
+ case '}':
+ keyboard_keypress (0x02, 0x30);
+ break;
+ case '~':
+ keyboard_keypress (0x02, 0x32);
+ break;
+#if 0
+ case '\177':
+ keyboard_keypress (0x00, 0x00);
+ break;
+#endif
+ }
+}
+
+void
+send_str (const char *c)
+{
+ while (*c)
+ send_ascii (*(c++));
+}
diff --git a/app/state.c b/app/state.c
new file mode 100644
index 0000000..8ba1b3d
--- /dev/null
+++ b/app/state.c
@@ -0,0 +1,72 @@
+#include "project.h"
+
+uint32_t up_time, down_time;
+int locked;
+
+
+
+
+void
+state_show (void)
+{
+#ifndef SLIM
+ char buf[17];
+ uint32_t t;
+ int d, h, m, s;
+
+ t = up_time ? up_time : down_time;
+
+ d = t / 86400;
+ t -= d * 86400;
+ h = t / 3600;
+ t -= h * 3600;
+ m = t / 60;
+ t -= m * 60;
+ s = t;
+
+
+ snprintf (buf, sizeof (buf), "%4s%3d %02d:%02d:%02d",
+ up_time ? "up" : "down", d, h, m, s);
+
+ lcd_write (buf, 0, 0);
+
+ lcd_write (have_key ? " Key " : "No Key", 0, 1);
+
+ lcd_write (locked ? " Locked " : "UnLocked", 8, 1);
+#endif
+
+}
+
+
+void
+state_tick (void)
+{
+
+ if (host_has_power && usb_running)
+ {
+ down_time = 0;
+ up_time++;
+ }
+ else
+ {
+ down_time++;
+ up_time = 0;
+ locked = 0;
+ }
+
+ if ((down_time > RETENTION_TIME) && have_key)
+ {
+ key_wipe ();
+ }
+
+ state_show ();
+}
+
+
+void
+state_init (void)
+{
+ down_time = 0;
+ up_time = 0;
+ locked = 0;
+}