Companion: Russian UI (#7180)
[opentx.git] / radio / src / targets / horus / keys_driver.cpp
blob9879135dd7ba99bf7a35724124cea78e1561f689
1 /*
2 * Copyright (C) OpenTX
4 * Based on code named
5 * th9x - http://code.google.com/p/th9x
6 * er9x - http://code.google.com/p/er9x
7 * gruvin9x - http://code.google.com/p/gruvin9x
9 * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
21 #include "opentx.h"
23 uint32_t readKeys()
25 uint32_t result = 0;
27 #if defined(PCBX12S)
28 if (~KEYS_GPIO_REG_PGUP & KEYS_GPIO_PIN_PGUP)
29 result |= 1 << KEY_PGUP;
30 #endif
31 if (~KEYS_GPIO_REG_PGDN & KEYS_GPIO_PIN_PGDN)
32 result |= 1 << KEY_PGDN;
33 if (~KEYS_GPIO_REG_ENTER & KEYS_GPIO_PIN_ENTER)
34 result |= 1 << KEY_ENTER;
35 if (~KEYS_GPIO_REG_UP & KEYS_GPIO_PIN_UP)
36 result |= 1 << KEY_MODEL;
37 if (~KEYS_GPIO_REG_DOWN & KEYS_GPIO_PIN_DOWN)
38 result |= 1 << KEY_EXIT;
39 if (~KEYS_GPIO_REG_RIGHT & KEYS_GPIO_PIN_RIGHT)
40 result |= 1 << KEY_TELEM;
41 if (~KEYS_GPIO_REG_LEFT & KEYS_GPIO_PIN_LEFT)
42 result |= 1 << KEY_RADIO;
44 // TRACE("readKeys(): %x", result);
46 return result;
49 uint32_t readTrims()
51 uint32_t result = 0;
53 if (~TRIMS_GPIO_REG_LHL & TRIMS_GPIO_PIN_LHL)
54 result |= 0x01;
55 if (~TRIMS_GPIO_REG_LHR & TRIMS_GPIO_PIN_LHR)
56 result |= 0x02;
57 if (~TRIMS_GPIO_REG_LVD & TRIMS_GPIO_PIN_LVD)
58 result |= 0x04;
59 if (~TRIMS_GPIO_REG_LVU & TRIMS_GPIO_PIN_LVU)
60 result |= 0x08;
61 if (~TRIMS_GPIO_REG_RVD & TRIMS_GPIO_PIN_RVD)
62 result |= 0x10;
63 if (~TRIMS_GPIO_REG_RVU & TRIMS_GPIO_PIN_RVU)
64 result |= 0x20;
65 if (~TRIMS_GPIO_REG_RHL & TRIMS_GPIO_PIN_RHL)
66 result |= 0x40;
67 if (~TRIMS_GPIO_REG_RHR & TRIMS_GPIO_PIN_RHR)
68 result |= 0x80;
69 if (~TRIMS_GPIO_REG_LSD & TRIMS_GPIO_PIN_LSD)
70 result |= 0x100;
71 if (~TRIMS_GPIO_REG_LSU & TRIMS_GPIO_PIN_LSU)
72 result |= 0x200;
73 if (~TRIMS_GPIO_REG_RSD & TRIMS_GPIO_PIN_RSD)
74 result |= 0x400;
75 if (~TRIMS_GPIO_REG_RSU & TRIMS_GPIO_PIN_RSU)
76 result |= 0x800;
77 // TRACE("readTrims(): result=0x%04x", result);
79 return result;
82 bool trimDown(uint8_t idx)
84 return readTrims() & ((uint32_t)1 << idx);
87 bool keyDown()
89 return readKeys() || readTrims();
92 /* TODO common to ARM */
93 void readKeysAndTrims()
95 uint32_t i;
97 uint8_t index = 0;
98 uint32_t keys_input = readKeys();
99 for (i = 0; i < TRM_BASE; i++) {
100 keys[index++].input(keys_input & (1 << i));
103 uint32_t trims_input = readTrims();
104 for (i = 1; i <= 1 << (TRM_LAST-TRM_BASE); i <<= 1) {
105 keys[index++].input(trims_input & i);
108 if ((keys_input || trims_input) && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) {
109 // on keypress turn the light on
110 backlightOn();
114 #define ADD_2POS_CASE(x) \
115 case SW_S ## x ## 0: \
116 xxx = SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
117 break; \
118 case SW_S ## x ## 2: \
119 xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
120 break
121 #define ADD_INV_2POS_CASE(x) \
122 case SW_S ## x ## 2: \
123 xxx = SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
124 break; \
125 case SW_S ## x ## 0: \
126 xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
127 break
128 #define ADD_3POS_CASE(x, i) \
129 case SW_S ## x ## 0: \
130 xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \
131 if (IS_3POS(i)) { \
132 xxx = xxx && (~SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
134 break; \
135 case SW_S ## x ## 1: \
136 xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H) && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
137 break; \
138 case SW_S ## x ## 2: \
139 xxx = (~SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \
140 if (IS_3POS(i)) { \
141 xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
143 break
144 #define ADD_INV_3POS_CASE(x, i) \
145 case SW_S ## x ## 2: \
146 xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \
147 if (IS_3POS(i)) { \
148 xxx = xxx && (~SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
150 break; \
151 case SW_S ## x ## 1: \
152 xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H) && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
153 break; \
154 case SW_S ## x ## 0: \
155 xxx = (~SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \
156 if (IS_3POS(i)) { \
157 xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
159 break
161 #if !defined(BOOT)
162 uint32_t switchState(uint8_t index)
164 uint32_t xxx = 0;
166 switch (index) {
167 #if defined(PCBX12S)
168 ADD_3POS_CASE(A, 0);
169 ADD_3POS_CASE(B, 1);
170 ADD_3POS_CASE(C, 2);
171 ADD_3POS_CASE(D, 3);
172 ADD_3POS_CASE(E, 4);
173 ADD_INV_2POS_CASE(F);
174 ADD_3POS_CASE(G, 6);
175 ADD_2POS_CASE(H);
176 ADD_2POS_CASE(I);
177 ADD_2POS_CASE(J);
178 #else
179 ADD_3POS_CASE(A, 0);
180 ADD_INV_3POS_CASE(B, 1);
181 ADD_3POS_CASE(C, 2);
182 ADD_INV_3POS_CASE(D, 3);
183 ADD_INV_3POS_CASE(E, 4);
184 ADD_2POS_CASE(F);
185 ADD_3POS_CASE(G, 6);
186 ADD_2POS_CASE(H);
187 ADD_2POS_CASE(I);
188 ADD_2POS_CASE(J);
189 #endif
190 default:
191 break;
194 // TRACE("switch %d => %d", index, xxx);
195 return xxx;
197 #endif
199 void keysInit()
201 GPIO_InitTypeDef GPIO_InitStructure;
202 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
203 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
204 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
205 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
207 INIT_KEYS_PINS(GPIOB);
209 #if defined(KEYS_GPIOC_PINS)
210 INIT_KEYS_PINS(GPIOC);
211 #endif
213 INIT_KEYS_PINS(GPIOD);
214 INIT_KEYS_PINS(GPIOE);
215 INIT_KEYS_PINS(GPIOG);
216 INIT_KEYS_PINS(GPIOH);
217 INIT_KEYS_PINS(GPIOI);
218 INIT_KEYS_PINS(GPIOJ);