iOSのBLEコントローラアプリ「RCBController」と接続し、コントローラの操作を取得するサンプルプログラムです。 mbed HRM1017で動作を確認しています。 2014.08.20時点でのBLEライブラリに対応しました。

Dependencies:   BLE_API mbed

Fork of BLE_RCBController by Junichi Katsu

Committer:
jksoft
Date:
Wed Aug 20 13:41:01 2014 +0000
Revision:
4:ebda47d22091
Parent:
nRF51822/nordic/app_common/app_gpiote.c@1:48f6e08a3ac2
?????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 1:48f6e08a3ac2 1 /* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
jksoft 1:48f6e08a3ac2 2 *
jksoft 1:48f6e08a3ac2 3 * The information contained herein is property of Nordic Semiconductor ASA.
jksoft 1:48f6e08a3ac2 4 * Terms and conditions of usage are described in detail in NORDIC
jksoft 1:48f6e08a3ac2 5 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
jksoft 1:48f6e08a3ac2 6 *
jksoft 1:48f6e08a3ac2 7 * Licensees are granted free, non-transferable use of the information. NO
jksoft 1:48f6e08a3ac2 8 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
jksoft 1:48f6e08a3ac2 9 * the file.
jksoft 1:48f6e08a3ac2 10 *
jksoft 1:48f6e08a3ac2 11 */
jksoft 1:48f6e08a3ac2 12
jksoft 1:48f6e08a3ac2 13 #include "app_gpiote.h"
jksoft 1:48f6e08a3ac2 14 #include <stdlib.h>
jksoft 1:48f6e08a3ac2 15 #include <string.h>
jksoft 1:48f6e08a3ac2 16 #include "app_util.h"
jksoft 1:48f6e08a3ac2 17 #include "app_util_platform.h"
jksoft 1:48f6e08a3ac2 18 #include "nrf_error.h"
jksoft 1:48f6e08a3ac2 19 #include "nrf_gpio.h"
jksoft 1:48f6e08a3ac2 20
jksoft 1:48f6e08a3ac2 21
jksoft 1:48f6e08a3ac2 22 /**@brief GPIOTE user type. */
jksoft 1:48f6e08a3ac2 23 typedef struct
jksoft 1:48f6e08a3ac2 24 {
jksoft 1:48f6e08a3ac2 25 uint32_t pins_mask; /**< Mask defining which pins user wants to monitor. */
jksoft 1:48f6e08a3ac2 26 uint32_t pins_low_to_high_mask; /**< Mask defining which pins will generate events to this user when toggling low->high. */
jksoft 1:48f6e08a3ac2 27 uint32_t pins_high_to_low_mask; /**< Mask defining which pins will generate events to this user when toggling high->low. */
jksoft 1:48f6e08a3ac2 28 uint32_t sense_high_pins; /**< Mask defining which pins are configured to generate GPIOTE interrupt on transition to high level. */
jksoft 1:48f6e08a3ac2 29 app_gpiote_event_handler_t event_handler; /**< Pointer to function to be executed when an event occurs. */
jksoft 1:48f6e08a3ac2 30 } gpiote_user_t;
jksoft 1:48f6e08a3ac2 31
jksoft 1:48f6e08a3ac2 32 STATIC_ASSERT(sizeof(gpiote_user_t) <= GPIOTE_USER_NODE_SIZE);
jksoft 1:48f6e08a3ac2 33 STATIC_ASSERT(sizeof(gpiote_user_t) % 4 == 0);
jksoft 1:48f6e08a3ac2 34
jksoft 1:48f6e08a3ac2 35 static uint32_t m_enabled_users_mask; /**< Mask for tracking which users are enabled. */
jksoft 1:48f6e08a3ac2 36 static uint8_t m_user_array_size; /**< Size of user array. */
jksoft 1:48f6e08a3ac2 37 static uint8_t m_user_count; /**< Number of registered users. */
jksoft 1:48f6e08a3ac2 38 static gpiote_user_t * mp_users = NULL; /**< Array of GPIOTE users. */
jksoft 1:48f6e08a3ac2 39
jksoft 1:48f6e08a3ac2 40
jksoft 1:48f6e08a3ac2 41 /**@brief Function for toggling sense level for specified pins.
jksoft 1:48f6e08a3ac2 42 *
jksoft 1:48f6e08a3ac2 43 * @param[in] p_user Pointer to user structure.
jksoft 1:48f6e08a3ac2 44 * @param[in] pins Bitmask specifying for which pins the sense level is to be toggled.
jksoft 1:48f6e08a3ac2 45 */
jksoft 1:48f6e08a3ac2 46 static void sense_level_toggle(gpiote_user_t * p_user, uint32_t pins)
jksoft 1:48f6e08a3ac2 47 {
jksoft 1:48f6e08a3ac2 48 uint32_t pin_no;
jksoft 1:48f6e08a3ac2 49
jksoft 1:48f6e08a3ac2 50 for (pin_no = 0; pin_no < NO_OF_PINS; pin_no++)
jksoft 1:48f6e08a3ac2 51 {
jksoft 1:48f6e08a3ac2 52 uint32_t pin_mask = (1 << pin_no);
jksoft 1:48f6e08a3ac2 53
jksoft 1:48f6e08a3ac2 54 if ((pins & pin_mask) != 0)
jksoft 1:48f6e08a3ac2 55 {
jksoft 1:48f6e08a3ac2 56 uint32_t sense;
jksoft 1:48f6e08a3ac2 57
jksoft 1:48f6e08a3ac2 58 // Invert sensing.
jksoft 1:48f6e08a3ac2 59 if ((p_user->sense_high_pins & pin_mask) == 0)
jksoft 1:48f6e08a3ac2 60 {
jksoft 1:48f6e08a3ac2 61 sense = GPIO_PIN_CNF_SENSE_High << GPIO_PIN_CNF_SENSE_Pos;
jksoft 1:48f6e08a3ac2 62 p_user->sense_high_pins |= pin_mask;
jksoft 1:48f6e08a3ac2 63 }
jksoft 1:48f6e08a3ac2 64 else
jksoft 1:48f6e08a3ac2 65 {
jksoft 1:48f6e08a3ac2 66 sense = GPIO_PIN_CNF_SENSE_Low << GPIO_PIN_CNF_SENSE_Pos;
jksoft 1:48f6e08a3ac2 67 p_user->sense_high_pins &= ~pin_mask;
jksoft 1:48f6e08a3ac2 68 }
jksoft 1:48f6e08a3ac2 69
jksoft 1:48f6e08a3ac2 70 NRF_GPIO->PIN_CNF[pin_no] &= ~GPIO_PIN_CNF_SENSE_Msk;
jksoft 1:48f6e08a3ac2 71 NRF_GPIO->PIN_CNF[pin_no] |= sense;
jksoft 1:48f6e08a3ac2 72 }
jksoft 1:48f6e08a3ac2 73 }
jksoft 1:48f6e08a3ac2 74 }
jksoft 1:48f6e08a3ac2 75
jksoft 1:48f6e08a3ac2 76
jksoft 1:48f6e08a3ac2 77 /**@brief Function for handling the GPIOTE interrupt.
jksoft 1:48f6e08a3ac2 78 */
jksoft 1:48f6e08a3ac2 79 void GPIOTE_IRQHandler(void)
jksoft 1:48f6e08a3ac2 80 {
jksoft 1:48f6e08a3ac2 81 uint8_t i;
jksoft 1:48f6e08a3ac2 82 uint32_t pins_changed;
jksoft 1:48f6e08a3ac2 83 uint32_t pins_state = NRF_GPIO->IN;
jksoft 1:48f6e08a3ac2 84
jksoft 1:48f6e08a3ac2 85 // Clear event.
jksoft 1:48f6e08a3ac2 86 NRF_GPIOTE->EVENTS_PORT = 0;
jksoft 1:48f6e08a3ac2 87
jksoft 1:48f6e08a3ac2 88 // Check all users.
jksoft 1:48f6e08a3ac2 89 for (i = 0; i < m_user_count; i++)
jksoft 1:48f6e08a3ac2 90 {
jksoft 1:48f6e08a3ac2 91 gpiote_user_t * p_user = &mp_users[i];
jksoft 1:48f6e08a3ac2 92
jksoft 1:48f6e08a3ac2 93 // Check if user is enabled.
jksoft 1:48f6e08a3ac2 94 if (((1 << i) & m_enabled_users_mask) != 0)
jksoft 1:48f6e08a3ac2 95 {
jksoft 1:48f6e08a3ac2 96 uint32_t transition_pins;
jksoft 1:48f6e08a3ac2 97 uint32_t event_low_to_high;
jksoft 1:48f6e08a3ac2 98 uint32_t event_high_to_low;
jksoft 1:48f6e08a3ac2 99
jksoft 1:48f6e08a3ac2 100 // Find set of pins on which there has been a transition.
jksoft 1:48f6e08a3ac2 101 transition_pins = (pins_state ^ ~p_user->sense_high_pins) & p_user->pins_mask;
jksoft 1:48f6e08a3ac2 102
jksoft 1:48f6e08a3ac2 103 // Toggle SENSE level for all pins that have changed state.
jksoft 1:48f6e08a3ac2 104 sense_level_toggle(p_user, transition_pins);
jksoft 1:48f6e08a3ac2 105
jksoft 1:48f6e08a3ac2 106 // Second read after setting sense.
jksoft 1:48f6e08a3ac2 107 // Check if any pins have changed while serving this interrupt.
jksoft 1:48f6e08a3ac2 108 pins_changed = NRF_GPIO->IN ^ pins_state;
jksoft 1:48f6e08a3ac2 109 if (pins_changed)
jksoft 1:48f6e08a3ac2 110 {
jksoft 1:48f6e08a3ac2 111 // Transition pins detected in late stage.
jksoft 1:48f6e08a3ac2 112 uint32_t late_transition_pins;
jksoft 1:48f6e08a3ac2 113
jksoft 1:48f6e08a3ac2 114 pins_state |= pins_changed;
jksoft 1:48f6e08a3ac2 115
jksoft 1:48f6e08a3ac2 116 // Find set of pins on which there has been a transition.
jksoft 1:48f6e08a3ac2 117 late_transition_pins = (pins_state ^ ~p_user->sense_high_pins) & p_user->pins_mask;
jksoft 1:48f6e08a3ac2 118
jksoft 1:48f6e08a3ac2 119 // Toggle SENSE level for all pins that have changed state in last phase.
jksoft 1:48f6e08a3ac2 120 sense_level_toggle(p_user, late_transition_pins);
jksoft 1:48f6e08a3ac2 121
jksoft 1:48f6e08a3ac2 122 // Update pins that has changed state since the interrupt occurred.
jksoft 1:48f6e08a3ac2 123 transition_pins |= late_transition_pins;
jksoft 1:48f6e08a3ac2 124 }
jksoft 1:48f6e08a3ac2 125
jksoft 1:48f6e08a3ac2 126 // Call user event handler if an event has occurred.
jksoft 1:48f6e08a3ac2 127 event_high_to_low = (~pins_state & p_user->pins_high_to_low_mask) & transition_pins;
jksoft 1:48f6e08a3ac2 128 event_low_to_high = (pins_state & p_user->pins_low_to_high_mask) & transition_pins;
jksoft 1:48f6e08a3ac2 129
jksoft 1:48f6e08a3ac2 130 if ((event_low_to_high | event_high_to_low) != 0)
jksoft 1:48f6e08a3ac2 131 {
jksoft 1:48f6e08a3ac2 132 p_user->event_handler(event_low_to_high, event_high_to_low);
jksoft 1:48f6e08a3ac2 133 }
jksoft 1:48f6e08a3ac2 134 }
jksoft 1:48f6e08a3ac2 135 }
jksoft 1:48f6e08a3ac2 136 }
jksoft 1:48f6e08a3ac2 137
jksoft 1:48f6e08a3ac2 138
jksoft 1:48f6e08a3ac2 139 /**@brief Function for sense disabling for all pins for specified user.
jksoft 1:48f6e08a3ac2 140 *
jksoft 1:48f6e08a3ac2 141 * @param[in] user_id User id.
jksoft 1:48f6e08a3ac2 142 */
jksoft 1:48f6e08a3ac2 143 static void pins_sense_disable(app_gpiote_user_id_t user_id)
jksoft 1:48f6e08a3ac2 144 {
jksoft 1:48f6e08a3ac2 145 uint32_t pin_no;
jksoft 1:48f6e08a3ac2 146
jksoft 1:48f6e08a3ac2 147 for (pin_no = 0; pin_no < 32; pin_no++)
jksoft 1:48f6e08a3ac2 148 {
jksoft 1:48f6e08a3ac2 149 if ((mp_users[user_id].pins_mask & (1 << pin_no)) != 0)
jksoft 1:48f6e08a3ac2 150 {
jksoft 1:48f6e08a3ac2 151 NRF_GPIO->PIN_CNF[pin_no] &= ~GPIO_PIN_CNF_SENSE_Msk;
jksoft 1:48f6e08a3ac2 152 NRF_GPIO->PIN_CNF[pin_no] |= GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos;
jksoft 1:48f6e08a3ac2 153 }
jksoft 1:48f6e08a3ac2 154 }
jksoft 1:48f6e08a3ac2 155 }
jksoft 1:48f6e08a3ac2 156
jksoft 1:48f6e08a3ac2 157
jksoft 1:48f6e08a3ac2 158 uint32_t app_gpiote_init(uint8_t max_users, void * p_buffer)
jksoft 1:48f6e08a3ac2 159 {
jksoft 1:48f6e08a3ac2 160 if (p_buffer == NULL)
jksoft 1:48f6e08a3ac2 161 {
jksoft 1:48f6e08a3ac2 162 return NRF_ERROR_INVALID_PARAM;
jksoft 1:48f6e08a3ac2 163 }
jksoft 1:48f6e08a3ac2 164
jksoft 1:48f6e08a3ac2 165 // Check that buffer is correctly aligned.
jksoft 1:48f6e08a3ac2 166 if (!is_word_aligned(p_buffer))
jksoft 1:48f6e08a3ac2 167 {
jksoft 1:48f6e08a3ac2 168 return NRF_ERROR_INVALID_PARAM;
jksoft 1:48f6e08a3ac2 169 }
jksoft 1:48f6e08a3ac2 170
jksoft 1:48f6e08a3ac2 171 // Initialize file globals.
jksoft 1:48f6e08a3ac2 172 mp_users = (gpiote_user_t *)p_buffer;
jksoft 1:48f6e08a3ac2 173 m_user_array_size = max_users;
jksoft 1:48f6e08a3ac2 174 m_user_count = 0;
jksoft 1:48f6e08a3ac2 175 m_enabled_users_mask = 0;
jksoft 1:48f6e08a3ac2 176
jksoft 1:48f6e08a3ac2 177 memset(mp_users, 0, m_user_array_size * sizeof(gpiote_user_t));
jksoft 1:48f6e08a3ac2 178
jksoft 1:48f6e08a3ac2 179 // Initialize GPIOTE interrupt (will not be enabled until app_gpiote_user_enable() is called).
jksoft 1:48f6e08a3ac2 180 NRF_GPIOTE->INTENCLR = 0xFFFFFFFF;
jksoft 1:48f6e08a3ac2 181
jksoft 1:48f6e08a3ac2 182 NVIC_ClearPendingIRQ(GPIOTE_IRQn);
jksoft 1:48f6e08a3ac2 183 NVIC_SetPriority(GPIOTE_IRQn, APP_IRQ_PRIORITY_HIGH);
jksoft 1:48f6e08a3ac2 184 NVIC_EnableIRQ(GPIOTE_IRQn);
jksoft 1:48f6e08a3ac2 185
jksoft 1:48f6e08a3ac2 186 return NRF_SUCCESS;
jksoft 1:48f6e08a3ac2 187 }
jksoft 1:48f6e08a3ac2 188
jksoft 1:48f6e08a3ac2 189
jksoft 1:48f6e08a3ac2 190 uint32_t app_gpiote_user_register(app_gpiote_user_id_t * p_user_id,
jksoft 1:48f6e08a3ac2 191 uint32_t pins_low_to_high_mask,
jksoft 1:48f6e08a3ac2 192 uint32_t pins_high_to_low_mask,
jksoft 1:48f6e08a3ac2 193 app_gpiote_event_handler_t event_handler)
jksoft 1:48f6e08a3ac2 194 {
jksoft 1:48f6e08a3ac2 195 // Check state and parameters.
jksoft 1:48f6e08a3ac2 196 if (mp_users == NULL)
jksoft 1:48f6e08a3ac2 197 {
jksoft 1:48f6e08a3ac2 198 return NRF_ERROR_INVALID_STATE;
jksoft 1:48f6e08a3ac2 199 }
jksoft 1:48f6e08a3ac2 200 if (event_handler == NULL)
jksoft 1:48f6e08a3ac2 201 {
jksoft 1:48f6e08a3ac2 202 return NRF_ERROR_INVALID_PARAM;
jksoft 1:48f6e08a3ac2 203 }
jksoft 1:48f6e08a3ac2 204 if (m_user_count >= m_user_array_size)
jksoft 1:48f6e08a3ac2 205 {
jksoft 1:48f6e08a3ac2 206 return NRF_ERROR_NO_MEM;
jksoft 1:48f6e08a3ac2 207 }
jksoft 1:48f6e08a3ac2 208
jksoft 1:48f6e08a3ac2 209 // Allocate new user.
jksoft 1:48f6e08a3ac2 210 mp_users[m_user_count].pins_mask = pins_low_to_high_mask | pins_high_to_low_mask;
jksoft 1:48f6e08a3ac2 211 mp_users[m_user_count].pins_low_to_high_mask = pins_low_to_high_mask;
jksoft 1:48f6e08a3ac2 212 mp_users[m_user_count].pins_high_to_low_mask = pins_high_to_low_mask;
jksoft 1:48f6e08a3ac2 213 mp_users[m_user_count].event_handler = event_handler;
jksoft 1:48f6e08a3ac2 214
jksoft 1:48f6e08a3ac2 215 *p_user_id = m_user_count++;
jksoft 1:48f6e08a3ac2 216
jksoft 1:48f6e08a3ac2 217 // Make sure SENSE is disabled for all pins.
jksoft 1:48f6e08a3ac2 218 pins_sense_disable(*p_user_id);
jksoft 1:48f6e08a3ac2 219
jksoft 1:48f6e08a3ac2 220 return NRF_SUCCESS;
jksoft 1:48f6e08a3ac2 221 }
jksoft 1:48f6e08a3ac2 222
jksoft 1:48f6e08a3ac2 223
jksoft 1:48f6e08a3ac2 224 uint32_t app_gpiote_user_enable(app_gpiote_user_id_t user_id)
jksoft 1:48f6e08a3ac2 225 {
jksoft 1:48f6e08a3ac2 226 uint32_t pin_no;
jksoft 1:48f6e08a3ac2 227 uint32_t pins_state;
jksoft 1:48f6e08a3ac2 228
jksoft 1:48f6e08a3ac2 229 // Check state and parameters.
jksoft 1:48f6e08a3ac2 230 if (mp_users == NULL)
jksoft 1:48f6e08a3ac2 231 {
jksoft 1:48f6e08a3ac2 232 return NRF_ERROR_INVALID_STATE;
jksoft 1:48f6e08a3ac2 233 }
jksoft 1:48f6e08a3ac2 234 if (user_id >= m_user_count)
jksoft 1:48f6e08a3ac2 235 {
jksoft 1:48f6e08a3ac2 236 return NRF_ERROR_INVALID_PARAM;
jksoft 1:48f6e08a3ac2 237 }
jksoft 1:48f6e08a3ac2 238
jksoft 1:48f6e08a3ac2 239 // Clear any pending event.
jksoft 1:48f6e08a3ac2 240 NRF_GPIOTE->EVENTS_PORT = 0;
jksoft 1:48f6e08a3ac2 241 pins_state = NRF_GPIO->IN;
jksoft 1:48f6e08a3ac2 242
jksoft 1:48f6e08a3ac2 243 // Enable user.
jksoft 1:48f6e08a3ac2 244 if (m_enabled_users_mask == 0)
jksoft 1:48f6e08a3ac2 245 {
jksoft 1:48f6e08a3ac2 246 NRF_GPIOTE->INTENSET = GPIOTE_INTENSET_PORT_Msk;
jksoft 1:48f6e08a3ac2 247 }
jksoft 1:48f6e08a3ac2 248 m_enabled_users_mask |= (1 << user_id);
jksoft 1:48f6e08a3ac2 249
jksoft 1:48f6e08a3ac2 250 // Enable sensing for all pins for specified user.
jksoft 1:48f6e08a3ac2 251 mp_users[user_id].sense_high_pins = 0;
jksoft 1:48f6e08a3ac2 252 for (pin_no = 0; pin_no < 32; pin_no++)
jksoft 1:48f6e08a3ac2 253 {
jksoft 1:48f6e08a3ac2 254 uint32_t pin_mask = (1 << pin_no);
jksoft 1:48f6e08a3ac2 255
jksoft 1:48f6e08a3ac2 256 if ((mp_users[user_id].pins_mask & pin_mask) != 0)
jksoft 1:48f6e08a3ac2 257 {
jksoft 1:48f6e08a3ac2 258 uint32_t sense;
jksoft 1:48f6e08a3ac2 259
jksoft 1:48f6e08a3ac2 260 if ((pins_state & pin_mask) != 0)
jksoft 1:48f6e08a3ac2 261 {
jksoft 1:48f6e08a3ac2 262 sense = GPIO_PIN_CNF_SENSE_Low << GPIO_PIN_CNF_SENSE_Pos;
jksoft 1:48f6e08a3ac2 263 }
jksoft 1:48f6e08a3ac2 264 else
jksoft 1:48f6e08a3ac2 265 {
jksoft 1:48f6e08a3ac2 266 sense = GPIO_PIN_CNF_SENSE_High << GPIO_PIN_CNF_SENSE_Pos;
jksoft 1:48f6e08a3ac2 267 mp_users[user_id].sense_high_pins |= pin_mask;
jksoft 1:48f6e08a3ac2 268 }
jksoft 1:48f6e08a3ac2 269
jksoft 1:48f6e08a3ac2 270 NRF_GPIO->PIN_CNF[pin_no] &= ~GPIO_PIN_CNF_SENSE_Msk;
jksoft 1:48f6e08a3ac2 271 NRF_GPIO->PIN_CNF[pin_no] |= sense;
jksoft 1:48f6e08a3ac2 272 }
jksoft 1:48f6e08a3ac2 273 }
jksoft 1:48f6e08a3ac2 274
jksoft 1:48f6e08a3ac2 275 return NRF_SUCCESS;
jksoft 1:48f6e08a3ac2 276 }
jksoft 1:48f6e08a3ac2 277
jksoft 1:48f6e08a3ac2 278
jksoft 1:48f6e08a3ac2 279 uint32_t app_gpiote_user_disable(app_gpiote_user_id_t user_id)
jksoft 1:48f6e08a3ac2 280 {
jksoft 1:48f6e08a3ac2 281 // Check state and parameters.
jksoft 1:48f6e08a3ac2 282 if (mp_users == NULL)
jksoft 1:48f6e08a3ac2 283 {
jksoft 1:48f6e08a3ac2 284 return NRF_ERROR_INVALID_STATE;
jksoft 1:48f6e08a3ac2 285 }
jksoft 1:48f6e08a3ac2 286 if (user_id >= m_user_count)
jksoft 1:48f6e08a3ac2 287 {
jksoft 1:48f6e08a3ac2 288 return NRF_ERROR_INVALID_PARAM;
jksoft 1:48f6e08a3ac2 289 }
jksoft 1:48f6e08a3ac2 290
jksoft 1:48f6e08a3ac2 291 // Disable sensing for all pins for specified user.
jksoft 1:48f6e08a3ac2 292 pins_sense_disable(user_id);
jksoft 1:48f6e08a3ac2 293
jksoft 1:48f6e08a3ac2 294 // Disable user.
jksoft 1:48f6e08a3ac2 295 m_enabled_users_mask &= ~(1UL << user_id);
jksoft 1:48f6e08a3ac2 296 if (m_enabled_users_mask == 0)
jksoft 1:48f6e08a3ac2 297 {
jksoft 1:48f6e08a3ac2 298 NRF_GPIOTE->INTENCLR = GPIOTE_INTENSET_PORT_Msk;
jksoft 1:48f6e08a3ac2 299 }
jksoft 1:48f6e08a3ac2 300
jksoft 1:48f6e08a3ac2 301 return NRF_SUCCESS;
jksoft 1:48f6e08a3ac2 302 }
jksoft 1:48f6e08a3ac2 303
jksoft 1:48f6e08a3ac2 304
jksoft 1:48f6e08a3ac2 305 uint32_t app_gpiote_pins_state_get(app_gpiote_user_id_t user_id, uint32_t * p_pins)
jksoft 1:48f6e08a3ac2 306 {
jksoft 1:48f6e08a3ac2 307 gpiote_user_t * p_user;
jksoft 1:48f6e08a3ac2 308
jksoft 1:48f6e08a3ac2 309 // Check state and parameters.
jksoft 1:48f6e08a3ac2 310 if (mp_users == NULL)
jksoft 1:48f6e08a3ac2 311 {
jksoft 1:48f6e08a3ac2 312 return NRF_ERROR_INVALID_STATE;
jksoft 1:48f6e08a3ac2 313 }
jksoft 1:48f6e08a3ac2 314 if (user_id >= m_user_count)
jksoft 1:48f6e08a3ac2 315 {
jksoft 1:48f6e08a3ac2 316 return NRF_ERROR_INVALID_PARAM;
jksoft 1:48f6e08a3ac2 317 }
jksoft 1:48f6e08a3ac2 318
jksoft 1:48f6e08a3ac2 319 // Get pins.
jksoft 1:48f6e08a3ac2 320 p_user = &mp_users[user_id];
jksoft 1:48f6e08a3ac2 321 *p_pins = NRF_GPIO->IN & p_user->pins_mask;
jksoft 1:48f6e08a3ac2 322
jksoft 1:48f6e08a3ac2 323 return NRF_SUCCESS;
jksoft 1:48f6e08a3ac2 324 }
jksoft 1:48f6e08a3ac2 325
jksoft 1:48f6e08a3ac2 326 #if defined(SVCALL_AS_NORMAL_FUNCTION) || defined(SER_CONNECTIVITY)
jksoft 1:48f6e08a3ac2 327 uint32_t app_gpiote_input_event_handler_register(const uint8_t channel,
jksoft 1:48f6e08a3ac2 328 const uint32_t pin,
jksoft 1:48f6e08a3ac2 329 const uint32_t polarity,
jksoft 1:48f6e08a3ac2 330 app_gpiote_input_event_handler_t event_handler)
jksoft 1:48f6e08a3ac2 331 {
jksoft 1:48f6e08a3ac2 332 (void)sense_level_toggle(NULL, pin);
jksoft 1:48f6e08a3ac2 333 return NRF_ERROR_NOT_SUPPORTED;
jksoft 1:48f6e08a3ac2 334 }
jksoft 1:48f6e08a3ac2 335
jksoft 1:48f6e08a3ac2 336 uint32_t app_gpiote_input_event_handler_unregister(const uint8_t channel)
jksoft 1:48f6e08a3ac2 337 {
jksoft 1:48f6e08a3ac2 338 return NRF_ERROR_NOT_SUPPORTED;
jksoft 1:48f6e08a3ac2 339 }
jksoft 1:48f6e08a3ac2 340
jksoft 1:48f6e08a3ac2 341 uint32_t app_gpiote_end_irq_event_handler_register(app_gpiote_input_event_handler_t event_handler)
jksoft 1:48f6e08a3ac2 342 {
jksoft 1:48f6e08a3ac2 343 return NRF_ERROR_NOT_SUPPORTED;
jksoft 1:48f6e08a3ac2 344 }
jksoft 1:48f6e08a3ac2 345
jksoft 1:48f6e08a3ac2 346 uint32_t app_gpiote_end_irq_event_handler_unregister(void)
jksoft 1:48f6e08a3ac2 347 {
jksoft 1:48f6e08a3ac2 348 return NRF_ERROR_NOT_SUPPORTED;
jksoft 1:48f6e08a3ac2 349 }
jksoft 1:48f6e08a3ac2 350
jksoft 1:48f6e08a3ac2 351 uint32_t app_gpiote_enable_interrupts(void)
jksoft 1:48f6e08a3ac2 352 {
jksoft 1:48f6e08a3ac2 353 return NRF_ERROR_NOT_SUPPORTED;
jksoft 1:48f6e08a3ac2 354 }
jksoft 1:48f6e08a3ac2 355
jksoft 1:48f6e08a3ac2 356 uint32_t app_gpiote_disable_interrupts(void)
jksoft 1:48f6e08a3ac2 357 {
jksoft 1:48f6e08a3ac2 358 return NRF_ERROR_NOT_SUPPORTED;
jksoft 1:48f6e08a3ac2 359 }
jksoft 1:48f6e08a3ac2 360 #endif // SVCALL_AS_NORMAL_FUNCTION || SER_CONNECTIVITY