9bbd561eedf854467057c30ef32aade8668b9af9
[fw/altos] / src / kernel / ao.h
1 /*
2  * Copyright © 2009 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17  */
18
19 #ifndef _AO_H_
20 #define _AO_H_
21
22 #include <stdint.h>
23 #include <stdio.h>
24 #include <string.h>
25 #include <stddef.h>
26 #include <stdbool.h>
27 #include <ao_pins.h>
28 #include <ao_arch.h>
29
30 /* replace stdio macros with direct calls to our functions */
31 #undef putchar
32 #undef getchar
33 #define putchar(c)      ao_putchar(c)
34 #define getchar         ao_getchar
35
36 extern int ao_putchar(char c);
37 extern char ao_getchar(void);
38
39 #ifndef HAS_TASK
40 #define HAS_TASK        1
41 #endif
42
43 typedef AO_PORT_TYPE ao_port_t;
44
45 #ifndef AO_TICK_TYPE
46 #define AO_TICK_TYPE uint32_t
47 #define AO_TICK_SIGNED int32_t
48 #endif
49
50 #if HAS_TASK
51 #include <ao_task.h>
52 #else
53 #include <ao_notask.h>
54 #endif
55
56 /*
57  * ao_panic.c
58  */
59
60 #define AO_PANIC_NO_TASK        1       /* AO_NUM_TASKS is not large enough */
61 #define AO_PANIC_DMA            2       /* Attempt to start DMA while active */
62 #define AO_PANIC_MUTEX          3       /* Mis-using mutex API */
63 #define AO_PANIC_EE             4       /* Mis-using eeprom API */
64 #define AO_PANIC_LOG            5       /* Failing to read/write log data */
65 #define AO_PANIC_CMD            6       /* Too many command sets registered */
66 #define AO_PANIC_STDIO          7       /* Too many stdio handlers registered */
67 #define AO_PANIC_REBOOT         8       /* Reboot failed */
68 #define AO_PANIC_FLASH          9       /* Invalid flash part (or wrong blocksize) */
69 #define AO_PANIC_USB            10      /* Trying to send USB packet while busy */
70 #define AO_PANIC_BT             11      /* Communications with bluetooth device failed */
71 #define AO_PANIC_STACK          12      /* Stack overflow */
72 #define AO_PANIC_SPI            13      /* SPI communication failure */
73 #define AO_PANIC_CRASH          14      /* Processor crashed */
74 #define AO_PANIC_BUFIO          15      /* Mis-using bufio API */
75 #define AO_PANIC_EXTI           16      /* Mis-using exti API */
76 #define AO_PANIC_FAST_TIMER     17      /* Mis-using fast timer API */
77 #define AO_PANIC_ADC            18      /* Mis-using ADC interface */
78 #define AO_PANIC_IRQ            19      /* interrupts not blocked */
79 #define AO_PANIC_SELF_TEST_CC1120       0x40 | 1        /* Self test failure */
80 #define AO_PANIC_SELF_TEST_HMC5883      0x40 | 2        /* Self test failure */
81 #define AO_PANIC_SELF_TEST_MPU6000      0x40 | 3        /* Self test failure */
82 #define AO_PANIC_SELF_TEST_MPU9250      0x40 | 3        /* Self test failure */
83 #define AO_PANIC_SELF_TEST_BMX160       0x40 | 3        /* Self test failure */
84 #define AO_PANIC_SELF_TEST_MS5607       0x40 | 4        /* Self test failure */
85 #define AO_PANIC_SELF_TEST_ADS124S0X    0x40 | 5        /* Self test failure */
86
87 /* Stop the operating system, beeping and blinking the reason */
88 void
89 ao_panic(uint8_t reason);
90
91 /*
92  * ao_romconfig.c
93  */
94
95 #define AO_ROMCONFIG_VERSION    2
96
97 extern AO_ROMCONFIG_SYMBOL uint16_t ao_romconfig_version;
98 extern AO_ROMCONFIG_SYMBOL uint16_t ao_romconfig_check;
99 extern AO_ROMCONFIG_SYMBOL uint16_t ao_serial_number;
100 #if HAS_RADIO
101 extern AO_ROMCONFIG_SYMBOL uint32_t ao_radio_cal;
102 #endif
103
104 /*
105  * ao_timer.c
106  */
107
108 extern volatile AO_TICK_TYPE ao_tick_count;
109
110 /* Our timer runs at 100Hz */
111 #ifndef AO_HERTZ
112 #define AO_HERTZ                100
113 #endif
114 #define AO_MS_TO_TICKS(ms)      ((ms) / (1000 / AO_HERTZ))
115 #define AO_SEC_TO_TICKS(s)      ((s) * AO_HERTZ)
116
117 /* Returns the current time in ticks */
118 AO_TICK_TYPE
119 ao_time(void);
120
121 /* Returns the current time in ns */
122 uint64_t
123 ao_time_ns(void);
124
125 /* Suspend the current task until ticks time has passed */
126 void
127 ao_delay(AO_TICK_TYPE ticks);
128
129 void
130 ao_delay_until(AO_TICK_TYPE target);
131
132 /* Set the ADC interval */
133 void
134 ao_timer_set_adc_interval(uint8_t interval);
135
136 /* Initialize the timer */
137 void
138 ao_timer_init(void);
139
140 /* Initialize the hardware clock. Must be called first */
141 void
142 ao_clock_init(void);
143
144 #if AO_POWER_MANAGEMENT
145 /* Go to low power clock */
146 void
147 ao_clock_suspend(void);
148
149 /* Restart full-speed clock */
150 void
151 ao_clock_resume(void);
152 #endif
153
154 /*
155  * ao_mutex.c
156  */
157
158 #ifndef ao_mutex_get
159 uint8_t
160 ao_mutex_try(uint8_t *ao_mutex, uint8_t task_id);
161
162 void
163 ao_mutex_get(uint8_t *ao_mutex);
164
165 void
166 ao_mutex_put(uint8_t *ao_mutex);
167 #endif
168
169 /*
170  * ao_cmd.c
171  */
172
173 enum ao_cmd_status {
174         ao_cmd_success = 0,
175         ao_cmd_lex_error = 1,
176         ao_cmd_syntax_error = 2,
177 };
178
179 extern char     ao_cmd_lex_c;
180 extern enum ao_cmd_status ao_cmd_status;
181
182 void
183 ao_put_string(const char *s);
184
185 void
186 ao_cmd_readline(const char *prompt);
187
188 char
189 ao_cmd_lex(void);
190
191 void
192 ao_cmd_put8(uint8_t v);
193
194 void
195 ao_cmd_put16(uint16_t v);
196
197 uint8_t
198 ao_cmd_is_white(void);
199
200 void
201 ao_cmd_white(void);
202
203 int8_t
204 ao_cmd_hexchar(char c);
205
206 uint8_t
207 ao_cmd_hexbyte(void);
208
209 uint32_t
210 ao_cmd_hex(void);
211
212 uint32_t
213 ao_cmd_decimal(void);
214
215 /* Read a single hex nibble off stdin. */
216 uint8_t
217 ao_getnibble(void);
218
219 uint8_t
220 ao_match_word(const char *word);
221
222 struct ao_cmds {
223         void            (*func)(void);
224         const char      *help;
225 };
226
227 void
228 ao_cmd_register(const struct ao_cmds *cmds);
229
230 void
231 ao_cmd_init(void);
232
233 void
234 ao_cmd(void);
235
236 #if HAS_CMD_FILTER
237 /*
238  * Provided by an external module to filter raw command lines
239  */
240 uint8_t
241 ao_cmd_filter(void);
242 #endif
243
244 /*
245  * Various drivers
246  */
247 #if HAS_ADC
248 #include <ao_adc.h>
249 #endif
250
251 #if HAS_BEEP
252 #include <ao_beep.h>
253 #endif
254
255 #if LEDS_AVAILABLE || HAS_LED
256 #include <ao_led.h>
257 #endif
258
259 #if HAS_USB
260 #include <ao_usb.h>
261 #endif
262
263 #if HAS_EEPROM
264 #include <ao_storage.h>
265 #endif
266
267 #if HAS_LOG
268 #include <ao_log.h>
269 #endif
270
271 #if HAS_FLIGHT
272 #include <ao_flight.h>
273 #include <ao_sample.h>
274 #endif
275
276 /*
277  * ao_report.c
278  */
279
280 #define AO_RDF_INTERVAL_TICKS   AO_SEC_TO_TICKS(5)
281 #define AO_RDF_LENGTH_MS        500
282 #define AO_RDF_CONTINUITY_MS    32
283 #define AO_RDF_CONTINUITY_PAUSE 96
284 #define AO_RDF_CONTINUITY_TOTAL ((AO_RDF_CONTINUITY_PAUSE + AO_RDF_CONTINUITY_MS) * 3 + AO_RDF_CONTINUITY_PAUSE)
285
286 /* This assumes that we're generating a 1kHz tone, which
287  * modulates the carrier at 2kbps, or 250kBps
288  */
289 #define AO_MS_TO_RDF_LEN(ms) ((ms) / 4)
290
291 #define AO_RADIO_RDF_LEN        AO_MS_TO_RDF_LEN(AO_RDF_LENGTH_MS)
292 #define AO_RADIO_CONT_TONE_LEN  AO_MS_TO_RDF_LEN(AO_RDF_CONTINUITY_MS)
293 #define AO_RADIO_CONT_PAUSE_LEN AO_MS_TO_RDF_LEN(AO_RDF_CONTINUITY_PAUSE)
294 #define AO_RADIO_CONT_TOTAL_LEN AO_MS_TO_RDF_LEN(AO_RDF_CONTINUITY_TOTAL)
295
296 /* returns a value 0-3 to indicate igniter continuity */
297 uint8_t
298 ao_report_igniter(void);
299
300 void
301 ao_report_init(void);
302
303 /*
304  * ao_convert.c
305  *
306  * Given raw data, convert to SI units
307  */
308
309 #if HAS_BARO
310 /* pressure from the sensor to altitude in meters */
311 alt_t
312 ao_pres_to_altitude(pres_t pres);
313
314 pres_t
315 ao_altitude_to_pres(alt_t alt);
316
317 int16_t
318 ao_temp_to_dC(int16_t temp);
319 #endif
320
321 /*
322  * ao_convert_pa.c
323  *
324  * Convert between pressure in Pa and altitude in meters
325  */
326
327 #include <ao_data.h>
328
329 #if HAS_BARO
330 alt_t
331 ao_pa_to_altitude(pres_t pa);
332
333 int32_t
334 ao_altitude_to_pa(alt_t alt);
335 #endif
336
337 #if HAS_DBG
338 #include <ao_dbg.h>
339 #endif
340
341 #if HAS_SERIAL_0 || HAS_SERIAL_1 || HAS_SERIAL_2 || HAS_SERIAL_3
342 #include <ao_serial.h>
343 #endif
344
345 /*
346  * ao_convert_volt.c
347  *
348  * Convert ADC readings to decivolts
349  */
350
351 int16_t
352 ao_battery_decivolt(int16_t adc);
353
354 int16_t
355 ao_ignite_decivolt(int16_t adc);
356
357 /*
358  * ao_spi_slave.c
359  */
360
361 uint8_t
362 ao_spi_slave_recv(void *buf, uint16_t len);
363
364 void
365 ao_spi_slave_send(void *buf, uint16_t len);
366
367 void
368 ao_spi_slave_init(void);
369
370 /* This must be defined by the product; it will get called when chip
371  * select goes low, at which point it should use ao_spi_read and
372  * ao_spi_write to deal with the request
373  */
374
375 void
376 ao_spi_slave(void);
377
378 #include <ao_telemetry.h>
379 /*
380  * ao_gps.c
381  */
382
383 #define AO_GPS_NUM_SAT_MASK     (0xf << 0)
384 #define AO_GPS_NUM_SAT_SHIFT    (0)
385
386 #define AO_GPS_VALID            (1 << 4)
387 #define AO_GPS_RUNNING          (1 << 5)
388 #define AO_GPS_DATE_VALID       (1 << 6)
389 #define AO_GPS_COURSE_VALID     (1 << 7)
390
391 #define AO_GPS_NEW_DATA         1
392 #define AO_GPS_NEW_TRACKING     2
393
394 extern uint8_t ao_gps_new;
395 extern uint16_t ao_gps_tick;
396 extern uint8_t ao_gps_mutex;
397 extern struct ao_telemetry_location ao_gps_data;
398 extern struct ao_telemetry_satellite ao_gps_tracking_data;
399
400 struct ao_gps_orig {
401         uint8_t                 year;
402         uint8_t                 month;
403         uint8_t                 day;
404         uint8_t                 hour;
405         uint8_t                 minute;
406         uint8_t                 second;
407         uint8_t                 flags;
408         int32_t                 latitude;       /* degrees * 10⁷ */
409         int32_t                 longitude;      /* degrees * 10⁷ */
410         int16_t                 altitude;       /* m */
411         uint16_t                ground_speed;   /* cm/s */
412         uint8_t                 course;         /* degrees / 2 */
413         uint8_t                 hdop;           /* * 5 */
414         int16_t                 climb_rate;     /* cm/s */
415         uint16_t                h_error;        /* m */
416         uint16_t                v_error;        /* m */
417 };
418
419 struct ao_gps_sat_orig {
420         uint8_t         svid;
421         uint8_t         c_n_1;
422 };
423
424 #define AO_MAX_GPS_TRACKING     12
425
426 struct ao_gps_tracking_orig {
427         uint8_t                 channels;
428         struct ao_gps_sat_orig  sats[AO_MAX_GPS_TRACKING];
429 };
430
431 void
432 ao_gps_set_rate(uint8_t rate);
433
434 void
435 ao_gps(void);
436
437 void
438 ao_gps_print(struct ao_gps_orig *gps_data);
439
440 void
441 ao_gps_tracking_print(struct ao_gps_tracking_orig *gps_tracking_data);
442
443 void
444 ao_gps_show(void);
445
446 void
447 ao_gps_init(void);
448
449 /*
450  * ao_gps_report.c
451  */
452
453 void
454 ao_gps_report(void);
455
456 void
457 ao_gps_report_init(void);
458
459 /*
460  * ao_gps_report_mega.c
461  */
462
463 void
464 ao_gps_report_mega(void);
465
466 void
467 ao_gps_report_mega_init(void);
468
469 /*
470  * ao_telemetry_orig.c
471  */
472
473 #if LEGACY_MONITOR
474 struct ao_adc_orig {
475         uint16_t        tick;           /* tick when the sample was read */
476         int16_t         accel;          /* accelerometer */
477         int16_t         pres;           /* pressure sensor */
478         int16_t         temp;           /* temperature sensor */
479         int16_t         v_batt;         /* battery voltage */
480         int16_t         sense_d;        /* drogue continuity sense */
481         int16_t         sense_m;        /* main continuity sense */
482 };
483
484 struct ao_telemetry_orig {
485         uint16_t                serial;
486         uint16_t                flight;
487         uint8_t                 flight_state;
488         int16_t                 accel;
489         int16_t                 ground_accel;
490         union {
491                 struct {
492                         int16_t                 speed;
493                         int16_t                 unused;
494                 } k;
495                 int32_t         flight_vel;
496         } u;
497         int16_t                 height;
498         int16_t                 ground_pres;
499         int16_t                 accel_plus_g;
500         int16_t                 accel_minus_g;
501         struct ao_adc_orig      adc;
502         struct ao_gps_orig      gps;
503         char                    callsign[AO_MAX_CALLSIGN];
504         struct ao_gps_tracking_orig     gps_tracking;
505 };
506
507 struct ao_telemetry_tiny {
508         uint16_t                serial;
509         uint16_t                flight;
510         uint8_t                 flight_state;
511         int16_t                 height;         /* AGL in meters */
512         int16_t                 speed;          /* in m/s * 16 */
513         int16_t                 accel;          /* in m/s² * 16 */
514         int16_t                 ground_pres;    /* sensor units */
515         struct ao_adc           adc;            /* raw ADC readings */
516         char                    callsign[AO_MAX_CALLSIGN];
517 };
518
519 struct ao_telemetry_orig_recv {
520         struct ao_telemetry_orig        telemetry_orig;
521         int8_t                          rssi;
522         uint8_t                         status;
523 };
524
525 struct ao_telemetry_tiny_recv {
526         struct ao_telemetry_tiny        telemetry_tiny;
527         int8_t                          rssi;
528         uint8_t                         status;
529 };
530
531 #endif /* LEGACY_MONITOR */
532
533 /* Unfortunately, we've exposed the CC1111 rssi units as the 'usual' method
534  * for reporting RSSI. So, now we use these values everywhere
535  */
536 #define AO_RSSI_FROM_RADIO(radio)       ((int16_t) ((int8_t) (radio) >> 1) - 74)
537 #define AO_RADIO_FROM_RSSI(rssi)        (((int8_t) (rssi) + 74) << 1)
538
539 /*
540  * ao_radio_recv tacks on rssi and status bytes
541  */
542
543 struct ao_telemetry_raw_recv {
544         uint8_t                 packet[AO_MAX_TELEMETRY + 2];
545 };
546
547 /* Set delay between telemetry reports (0 to disable) */
548
549 #define AO_TELEMETRY_INTERVAL_PAD       AO_MS_TO_TICKS(1000)
550 #define AO_TELEMETRY_INTERVAL_FLIGHT    AO_MS_TO_TICKS(100)
551 #define AO_TELEMETRY_INTERVAL_RECOVER   AO_MS_TO_TICKS(1000)
552
553 void
554 ao_telemetry_reset_interval(void);
555
556 void
557 ao_telemetry_set_interval(uint16_t interval);
558
559 void
560 ao_rdf_set(uint8_t rdf);
561
562 void
563 ao_telemetry_init(void);
564
565 void
566 ao_telemetry_orig_init(void);
567
568 void
569 ao_telemetry_tiny_init(void);
570
571 /*
572  * ao_radio.c
573  */
574
575 extern uint8_t  ao_radio_dma;
576
577 extern int8_t   ao_radio_rssi;
578
579 #ifdef PKT_APPEND_STATUS_1_CRC_OK
580 #define AO_RADIO_STATUS_CRC_OK  PKT_APPEND_STATUS_1_CRC_OK
581 #else
582 #include <ao_fec.h>
583 #define AO_RADIO_STATUS_CRC_OK  AO_FEC_DECODE_CRC_OK
584 #endif
585
586 #ifndef HAS_RADIO_RECV
587 #define HAS_RADIO_RECV HAS_RADIO
588 #endif
589 #ifndef HAS_RADIO_XMIT
590 #define HAS_RADIO_XMIT HAS_RADIO
591 #endif
592
593 #define AO_RADIO_RATE_38400     0
594 #define AO_RADIO_RATE_9600      1
595 #define AO_RADIO_RATE_2400      2
596 #define AO_RADIO_RATE_MAX       AO_RADIO_RATE_2400
597
598 #if defined(HAS_RADIO) && !defined(HAS_RADIO_RATE)
599 #define HAS_RADIO_RATE  HAS_RADIO
600 #endif
601
602 #if HAS_RADIO_XMIT
603 void
604 ao_radio_send(const void *d, uint8_t size);
605 #endif
606
607 #if HAS_RADIO_RECV
608 uint8_t
609 ao_radio_recv(void *d, uint8_t size, uint8_t timeout);
610
611 void
612 ao_radio_recv_abort(void);
613 #endif
614
615 void
616 ao_radio_test(uint8_t on);
617
618 typedef int16_t (*ao_radio_fill_func)(uint8_t *buffer, int16_t len);
619
620 void
621 ao_radio_send_aprs(ao_radio_fill_func fill);
622
623 /*
624  * ao_radio_pa
625  */
626
627 #if HAS_RADIO_AMP
628 void
629 ao_radio_pa_on(void);
630
631 void
632 ao_radio_pa_off(void);
633
634 void
635 ao_radio_pa_init(void);
636 #else
637 #define ao_radio_pa_on()
638 #define ao_radio_pa_off()
639 #define ao_radio_pa_init()
640 #endif
641
642 /*
643  * Compute the packet length as follows:
644  *
645  * 2000 bps (for a 1kHz tone)
646  * so, for 'ms' milliseconds, we need
647  * 2 * ms bits, or ms / 4 bytes
648  */
649
650 void
651 ao_radio_rdf(void);
652
653 void
654 ao_radio_continuity(uint8_t c);
655
656 void
657 ao_radio_rdf_abort(void);
658
659 void
660 ao_radio_test_on(void);
661
662 void
663 ao_radio_test_off(void);
664
665 void
666 ao_radio_init(void);
667
668 /*
669  * ao_monitor.c
670  */
671
672 #if HAS_MONITOR
673
674 extern const char * const ao_state_names[];
675
676 #define AO_MONITOR_RING 8
677
678 union ao_monitor {
679         struct ao_telemetry_raw_recv    raw;
680         struct ao_telemetry_all_recv    all;
681 #if LEGACY_MONITOR
682         struct ao_telemetry_orig_recv   orig;
683         struct ao_telemetry_tiny_recv   tiny;
684 #endif
685 };
686
687 extern union ao_monitor ao_monitor_ring[AO_MONITOR_RING];
688
689 #define ao_monitor_ring_next(n) (((n) + 1) & (AO_MONITOR_RING - 1))
690 #define ao_monitor_ring_prev(n) (((n) - 1) & (AO_MONITOR_RING - 1))
691
692 extern uint8_t ao_monitoring_mutex;
693 extern uint8_t ao_monitoring;
694 extern uint8_t ao_monitor_head;
695
696 void
697 ao_monitor(void);
698
699 #define AO_MONITORING_OFF       0
700 #define AO_MONITORING_ORIG      1
701
702 void
703 ao_monitor_set(uint8_t monitoring);
704
705 void
706 ao_monitor_disable(void);
707
708 void
709 ao_monitor_enable(void);
710
711 void
712 ao_monitor_init(void);
713
714 #endif
715
716 /*
717  * ao_stdio.c
718  */
719
720 #define AO_READ_AGAIN   (-1)
721
722 struct ao_stdio {
723         int     (*_pollchar)(void);     /* Called with interrupts blocked */
724         void    (*putchar)(char c);
725         void    (*flush)(void);
726         uint8_t echo;
727 };
728
729 extern struct ao_stdio ao_stdios[];
730 extern int8_t ao_cur_stdio;
731 extern int8_t ao_num_stdios;
732
733 void
734 flush(void);
735
736 extern uint8_t ao_stdin_ready;
737
738 uint8_t
739 ao_echo(void);
740
741 int8_t
742 ao_add_stdio(int (*pollchar)(void),
743              void (*putchar)(char) ,
744              void (*flush)(void));
745
746 /*
747  * ao_ignite.c
748  */
749
750 enum ao_igniter {
751         ao_igniter_drogue = 0,
752         ao_igniter_main = 1
753 };
754
755 enum ao_igniter_status {
756         ao_igniter_unknown,     /* unknown status (ambiguous voltage) */
757         ao_igniter_ready,       /* continuity detected */
758         ao_igniter_active,      /* igniter firing */
759         ao_igniter_open,        /* open circuit detected */
760 };
761
762 struct ao_ignition {
763         uint8_t request;
764         uint8_t fired;
765         uint8_t firing;
766 };
767
768 extern const char * const ao_igniter_status_names[];
769
770 extern struct ao_ignition ao_ignition[2];
771
772 enum ao_igniter_status
773 ao_igniter_status(enum ao_igniter igniter);
774
775 extern uint8_t ao_igniter_present;
776
777 void
778 ao_ignite_set_pins(void);
779
780 void
781 ao_igniter_init(void);
782
783 /*
784  * ao_config.c
785  */
786 #include <ao_config.h>
787
788 #if AO_PYRO_NUM
789 #include <ao_pyro.h>
790 #endif
791
792 #if HAS_FORCE_FREQ
793 /*
794  * Set this to force the frequency to 434.550MHz
795  */
796 extern uint8_t ao_force_freq;
797 #endif
798
799 /*
800  * ao_rssi.c
801  */
802
803 #ifdef AO_LED_TYPE
804 void
805 ao_rssi_set(int16_t rssi_value);
806
807 void
808 ao_rssi_init(AO_LED_TYPE rssi_led);
809 #endif
810
811 /*
812  * ao_product.c
813  *
814  * values which need to be defined for
815  * each instance of a product
816  */
817
818 extern const char ao_version[];
819 extern const char ao_manufacturer[];
820 extern const char ao_product[];
821
822 /*
823  * Fifos
824  */
825
826 #define AO_FIFO_SIZE    32
827
828 struct ao_fifo {
829         uint8_t insert;
830         uint8_t remove;
831         char    fifo[AO_FIFO_SIZE];
832 };
833
834 #define ao_fifo_insert(f,c) do { \
835         (f).fifo[(f).insert] = (c); \
836         (f).insert = ((f).insert + 1) & (AO_FIFO_SIZE-1); \
837 } while(0)
838
839 #define ao_fifo_remove(f,c) do {\
840         c = (f).fifo[(f).remove]; \
841         (f).remove = ((f).remove + 1) & (AO_FIFO_SIZE-1); \
842 } while(0)
843
844 #define ao_fifo_full(f)         ((((f).insert + 1) & (AO_FIFO_SIZE-1)) == (f).remove)
845 #define ao_fifo_mostly(f)       ((((f).insert - (f).remove) & (AO_FIFO_SIZE-1)) >= (AO_FIFO_SIZE * 3 / 4))
846 #define ao_fifo_barely(f)       ((((f).insert - (f).remove) & (AO_FIFO_SIZE-1)) >= (AO_FIFO_SIZE * 1 / 4))
847 #define ao_fifo_empty(f)        ((f).insert == (f).remove)
848
849 #if PACKET_HAS_MASTER || PACKET_HAS_SLAVE
850 #include <ao_packet.h>
851 #endif
852
853 #if HAS_BTM
854 #include <ao_btm.h>
855 #endif
856
857 #if HAS_COMPANION
858 #include <ao_companion.h>
859 #endif
860
861 #if HAS_LCD
862 #include <ao_lcd.h>
863 #endif
864
865 #if HAS_AES
866 #include <ao_aes.h>
867 #endif
868
869 /*
870  * ao_log_single.c
871  */
872
873 #define AO_LOG_TELESCIENCE_START        ((uint8_t) 's')
874 #define AO_LOG_TELESCIENCE_DATA         ((uint8_t) 'd')
875
876 #define AO_LOG_TELESCIENCE_NUM_ADC      12
877
878 struct ao_log_telescience {
879         uint8_t         type;
880         uint8_t         csum;
881         uint16_t        tick;
882         uint16_t        tm_tick;
883         uint8_t         tm_state;
884         uint8_t         unused;
885         uint16_t        adc[AO_LOG_TELESCIENCE_NUM_ADC];
886 };
887
888 #define AO_LOG_SINGLE_SIZE              32
889
890 union ao_log_single {
891         struct ao_log_telescience       telescience;
892         union ao_telemetry_all          telemetry;
893         uint8_t                         bytes[AO_LOG_SINGLE_SIZE];
894 };
895
896 extern union ao_log_single      ao_log_single_write_data;
897 extern union ao_log_single      ao_log_single_read_data;
898
899 void
900 ao_log_single_extra_query(void);
901
902 void
903 ao_log_single_list(void);
904
905 void
906 ao_log_single_main(void);
907
908 uint8_t
909 ao_log_single_write(void);
910
911 uint8_t
912 ao_log_single_read(uint32_t pos);
913
914 void
915 ao_log_single_start(void);
916
917 void
918 ao_log_single_stop(void);
919
920 void
921 ao_log_single_restart(void);
922
923 void
924 ao_log_single_set(void);
925
926 void
927 ao_log_single_delete(void);
928
929 void
930 ao_log_single_init(void);
931
932 void
933 ao_log_single(void);
934
935 /*
936  * ao_pyro_slave.c
937  */
938
939 #define AO_TELEPYRO_NUM_ADC     9
940
941 /*
942  * ao_terraui.c
943  */
944
945 void
946 ao_terraui_init(void);
947
948 /*
949  * ao_battery.c
950  */
951
952 #ifdef BATTERY_PIN
953 uint16_t
954 ao_battery_get(void);
955
956 void
957 ao_battery_init(void);
958 #endif /* BATTERY_PIN */
959
960 /*
961  * ao_sqrt.c
962  */
963
964 uint32_t
965 ao_sqrt(uint32_t op);
966
967 /*
968  * ao_freq.c
969  */
970
971 int32_t ao_freq_to_set(int32_t freq, int32_t cal);
972
973 /*
974  * ao_ms5607.c
975  */
976
977 void ao_ms5607_init(void);
978
979 #include <ao_arch_funcs.h>
980
981 #endif /* _AO_H_ */