trennfix/sw: Added smokefix, further modularized the mm decoder
[eisenbahn.git] / trennfix / sw / mm / include / mm / mm_switch.h
CommitLineData
70095677
PH
1#ifndef MM_SWITCH_H
2#define MM_SWITCH_H
3
4#include <stdint.h>
d0047978 5#include <config/hardware.h>
70095677 6
27b551dd
PH
7#define MM_FLAVOR_DRIVE 0
8#define MM_FLAVOR_SWITCH 1
7c08d02a
PH
9
10#ifdef MM_USE_REGISTER_VARS
11
12uint8_t register shift_command asm("r2");
13uint8_t register shift_function asm("r3");
14uint8_t register shift_address asm("r4");
27b551dd
PH
15uint8_t register mm_polarity asm("r5");
16uint8_t register mm_bitno asm("r6");
27b551dd
PH
17uint8_t register mm_time_h asm("r9");
18uint8_t register mm_time_l asm("r10");
19uint8_t register mm_bit_val asm("r11");
20uint8_t register mm_flavor asm("r14");
7c08d02a
PH
21
22static void inline __attribute((unused)) mm_init(void)
23{
27b551dd
PH
24 mm_bitno = 0;
25 mm_time_h = 0;
26 mm_bit_val = 23;
27 mm_polarity = 1;
7c08d02a
PH
28}
29
30#else
31
32#define mm_init(...)
33
34#endif
35
f12652df 36#ifdef MM_USE_CALLBACK
b1a7e65e 37
70095677 38/*
f12652df 39 * mm_key_cb - Callback function!
70095677
PH
40 *
41 * This function must be defined whenever the mm_switch module is used.
42 * It will be called from interrupt context whenever a new valid command
43 * has arrived.
44 *
45 * decoder is in the range from 1 to 25. Other values will not occur.
f12652df 46 *
70095677
PH
47 * key is in the range from 0 to 8:
48 *
49 * 1 - key1 green pressed
50 * 2 - key1 red pressed
51 * 3 - key2 green pressed
52 * 4 - key2 red pressed
53 * ...
54 * 0 - all keys up
f12652df 55 *
70095677 56 */
f12652df
PH
57void mm_key_cb(uint8_t decoder, uint8_t function, uint8_t key);
58void mm_drive_cb(uint8_t decoder, uint8_t function, uint8_t command);
70095677 59
f12652df
PH
60#endif
61
62void mm_pinchange_callback(void);
63
64enum mm_recmode {
65 __MM_INIT,
66 __MM_ARMED,
67 MM_SLOW,
68 MM_FAST,
69};
70
71#ifdef MM_USE_QUEUE
72
73struct mm_command {
74 enum mm_recmode recmode; /* Only MM_FAST or MM_SLOW! */
75 uint8_t address; /* Undecoded loco/decoder address */
76 uint8_t function; /* The two function bits */
77 uint8_t command; /* Button/Speed/Functions */
78};
56b25f8b 79
f12652df 80struct mm_command *mm_get(void);
56b25f8b 81
f12652df 82#endif /* MM_USE_QUEUE */
70095677 83
70095677 84#endif