Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /* mbed Microcontroller Library
sahilmgandhi 18:6a4db94011d3 2 * Copyright (c) 2016 u-blox
sahilmgandhi 18:6a4db94011d3 3 *
sahilmgandhi 18:6a4db94011d3 4 * Licensed under the Apache License, Version 2.0 (the "License");
sahilmgandhi 18:6a4db94011d3 5 * you may not use this file except in compliance with the License.
sahilmgandhi 18:6a4db94011d3 6 * You may obtain a copy of the License at
sahilmgandhi 18:6a4db94011d3 7 *
sahilmgandhi 18:6a4db94011d3 8 * http://www.apache.org/licenses/LICENSE-2.0
sahilmgandhi 18:6a4db94011d3 9 *
sahilmgandhi 18:6a4db94011d3 10 * Unless required by applicable law or agreed to in writing, software
sahilmgandhi 18:6a4db94011d3 11 * distributed under the License is distributed on an "AS IS" BASIS,
sahilmgandhi 18:6a4db94011d3 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sahilmgandhi 18:6a4db94011d3 13 * See the License for the specific language governing permissions and
sahilmgandhi 18:6a4db94011d3 14 * limitations under the License.
sahilmgandhi 18:6a4db94011d3 15 */
sahilmgandhi 18:6a4db94011d3 16
sahilmgandhi 18:6a4db94011d3 17 /* TODO: this needs testing */
sahilmgandhi 18:6a4db94011d3 18
sahilmgandhi 18:6a4db94011d3 19 #include <stddef.h>
sahilmgandhi 18:6a4db94011d3 20 #include "cmsis.h"
sahilmgandhi 18:6a4db94011d3 21
sahilmgandhi 18:6a4db94011d3 22 #include "gpio_irq_api.h"
sahilmgandhi 18:6a4db94011d3 23 #include "mbed_error.h"
sahilmgandhi 18:6a4db94011d3 24
sahilmgandhi 18:6a4db94011d3 25 /* ----------------------------------------------------------------
sahilmgandhi 18:6a4db94011d3 26 * MACROS
sahilmgandhi 18:6a4db94011d3 27 * ----------------------------------------------------------------*/
sahilmgandhi 18:6a4db94011d3 28
sahilmgandhi 18:6a4db94011d3 29 /* ----------------------------------------------------------------
sahilmgandhi 18:6a4db94011d3 30 * TYPES
sahilmgandhi 18:6a4db94011d3 31 * ----------------------------------------------------------------*/
sahilmgandhi 18:6a4db94011d3 32
sahilmgandhi 18:6a4db94011d3 33 /* ----------------------------------------------------------------
sahilmgandhi 18:6a4db94011d3 34 * GLOBAL VARIABLES
sahilmgandhi 18:6a4db94011d3 35 * ----------------------------------------------------------------*/
sahilmgandhi 18:6a4db94011d3 36
sahilmgandhi 18:6a4db94011d3 37 /* Each GPIO pin is given an ID, if the ID is 0 the pin can be ignored. */
sahilmgandhi 18:6a4db94011d3 38 static uint8_t channel_ids[20] = {0};
sahilmgandhi 18:6a4db94011d3 39 static gpio_irq_handler irq_handler;
sahilmgandhi 18:6a4db94011d3 40
sahilmgandhi 18:6a4db94011d3 41 static bool initialised = false;
sahilmgandhi 18:6a4db94011d3 42
sahilmgandhi 18:6a4db94011d3 43 /* ----------------------------------------------------------------
sahilmgandhi 18:6a4db94011d3 44 * FUNCTION PROTOTYPES
sahilmgandhi 18:6a4db94011d3 45 * ----------------------------------------------------------------*/
sahilmgandhi 18:6a4db94011d3 46
sahilmgandhi 18:6a4db94011d3 47 /* ----------------------------------------------------------------
sahilmgandhi 18:6a4db94011d3 48 * NON-API FUNCTIONS
sahilmgandhi 18:6a4db94011d3 49 * ----------------------------------------------------------------*/
sahilmgandhi 18:6a4db94011d3 50
sahilmgandhi 18:6a4db94011d3 51 void IRQ5_GPIO_Handler()
sahilmgandhi 18:6a4db94011d3 52 {
sahilmgandhi 18:6a4db94011d3 53 if (initialised) {
sahilmgandhi 18:6a4db94011d3 54 for (uint8_t i = 0; i < sizeof (channel_ids) / sizeof (channel_ids[0]); i++) {
sahilmgandhi 18:6a4db94011d3 55 uint8_t id = channel_ids[i];
sahilmgandhi 18:6a4db94011d3 56 uint32_t mask = 1 << id;
sahilmgandhi 18:6a4db94011d3 57
sahilmgandhi 18:6a4db94011d3 58 if (id != 0) {
sahilmgandhi 18:6a4db94011d3 59 if (GPIO_IRQ | mask) {
sahilmgandhi 18:6a4db94011d3 60 if (GPIO_INT_RISE | mask) {
sahilmgandhi 18:6a4db94011d3 61 irq_handler(id, IRQ_RISE);
sahilmgandhi 18:6a4db94011d3 62 } else if (GPIO_INT_FALL | mask) {
sahilmgandhi 18:6a4db94011d3 63 irq_handler(id, IRQ_FALL);
sahilmgandhi 18:6a4db94011d3 64 }
sahilmgandhi 18:6a4db94011d3 65 }
sahilmgandhi 18:6a4db94011d3 66 }
sahilmgandhi 18:6a4db94011d3 67 }
sahilmgandhi 18:6a4db94011d3 68 }
sahilmgandhi 18:6a4db94011d3 69
sahilmgandhi 18:6a4db94011d3 70 /* Clear all the interrupt bits (rather than wasting time on
sahilmgandhi 18:6a4db94011d3 71 * each individual one), or we might get stuck if a spurious
sahilmgandhi 18:6a4db94011d3 72 * one should arrive. */
sahilmgandhi 18:6a4db94011d3 73 GPIO_INT_CLR = 0xFFFFFFFF;
sahilmgandhi 18:6a4db94011d3 74 }
sahilmgandhi 18:6a4db94011d3 75
sahilmgandhi 18:6a4db94011d3 76 /* ----------------------------------------------------------------
sahilmgandhi 18:6a4db94011d3 77 * MBED API CALLS
sahilmgandhi 18:6a4db94011d3 78 * ----------------------------------------------------------------*/
sahilmgandhi 18:6a4db94011d3 79
sahilmgandhi 18:6a4db94011d3 80 int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
sahilmgandhi 18:6a4db94011d3 81 {
sahilmgandhi 18:6a4db94011d3 82 bool return_value = -1;
sahilmgandhi 18:6a4db94011d3 83
sahilmgandhi 18:6a4db94011d3 84 if (initialised) {
sahilmgandhi 18:6a4db94011d3 85 return_value = 0;
sahilmgandhi 18:6a4db94011d3 86 } else {
sahilmgandhi 18:6a4db94011d3 87 if (pin != NC) {
sahilmgandhi 18:6a4db94011d3 88 MBED_ASSERT (pin < NUM_PINS);
sahilmgandhi 18:6a4db94011d3 89
sahilmgandhi 18:6a4db94011d3 90 irq_handler = handler;
sahilmgandhi 18:6a4db94011d3 91 obj->ch = pin;
sahilmgandhi 18:6a4db94011d3 92 channel_ids[pin] = id;
sahilmgandhi 18:6a4db94011d3 93
sahilmgandhi 18:6a4db94011d3 94 uint32_t mask = 1 << obj->ch;
sahilmgandhi 18:6a4db94011d3 95
sahilmgandhi 18:6a4db94011d3 96 /* Remove any existing setting */
sahilmgandhi 18:6a4db94011d3 97 GPIO_INT_RISE_BITCLR &= ~mask;
sahilmgandhi 18:6a4db94011d3 98 GPIO_INT_FALL_BITCLR &= ~mask;
sahilmgandhi 18:6a4db94011d3 99 GPIO_INT_LOW_BITCLR &= ~mask;
sahilmgandhi 18:6a4db94011d3 100 GPIO_INT_HIGH_BITCLR &= ~mask;
sahilmgandhi 18:6a4db94011d3 101
sahilmgandhi 18:6a4db94011d3 102 initialised = true;
sahilmgandhi 18:6a4db94011d3 103 NVIC_EnableIRQ (GPIO_IRQn);
sahilmgandhi 18:6a4db94011d3 104
sahilmgandhi 18:6a4db94011d3 105 return_value = 0;
sahilmgandhi 18:6a4db94011d3 106 }
sahilmgandhi 18:6a4db94011d3 107 }
sahilmgandhi 18:6a4db94011d3 108
sahilmgandhi 18:6a4db94011d3 109 return return_value;
sahilmgandhi 18:6a4db94011d3 110 }
sahilmgandhi 18:6a4db94011d3 111
sahilmgandhi 18:6a4db94011d3 112 void gpio_irq_free(gpio_irq_t *obj)
sahilmgandhi 18:6a4db94011d3 113 {
sahilmgandhi 18:6a4db94011d3 114 channel_ids[obj->ch] = 0;
sahilmgandhi 18:6a4db94011d3 115 }
sahilmgandhi 18:6a4db94011d3 116
sahilmgandhi 18:6a4db94011d3 117 void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
sahilmgandhi 18:6a4db94011d3 118 {
sahilmgandhi 18:6a4db94011d3 119 uint32_t mask = 1 << obj->ch;
sahilmgandhi 18:6a4db94011d3 120
sahilmgandhi 18:6a4db94011d3 121 if (enable) {
sahilmgandhi 18:6a4db94011d3 122 if (event == IRQ_RISE) {
sahilmgandhi 18:6a4db94011d3 123 GPIO_INT_RISE_BITSET |= mask;
sahilmgandhi 18:6a4db94011d3 124 } else if (event == IRQ_FALL) {
sahilmgandhi 18:6a4db94011d3 125 GPIO_INT_FALL_BITSET |= mask;
sahilmgandhi 18:6a4db94011d3 126 }
sahilmgandhi 18:6a4db94011d3 127 }
sahilmgandhi 18:6a4db94011d3 128 else
sahilmgandhi 18:6a4db94011d3 129 {
sahilmgandhi 18:6a4db94011d3 130 if (event == IRQ_RISE) {
sahilmgandhi 18:6a4db94011d3 131 GPIO_INT_RISE_BITSET &= ~mask;
sahilmgandhi 18:6a4db94011d3 132 } else if (event == IRQ_FALL) {
sahilmgandhi 18:6a4db94011d3 133 GPIO_INT_FALL_BITSET &= ~mask;
sahilmgandhi 18:6a4db94011d3 134 }
sahilmgandhi 18:6a4db94011d3 135 }
sahilmgandhi 18:6a4db94011d3 136 }
sahilmgandhi 18:6a4db94011d3 137
sahilmgandhi 18:6a4db94011d3 138 void gpio_irq_enable(gpio_irq_t *obj)
sahilmgandhi 18:6a4db94011d3 139 {
sahilmgandhi 18:6a4db94011d3 140 (void) obj;
sahilmgandhi 18:6a4db94011d3 141 NVIC_EnableIRQ (GPIO_IRQn);
sahilmgandhi 18:6a4db94011d3 142 }
sahilmgandhi 18:6a4db94011d3 143
sahilmgandhi 18:6a4db94011d3 144 void gpio_irq_disable(gpio_irq_t *obj)
sahilmgandhi 18:6a4db94011d3 145 {
sahilmgandhi 18:6a4db94011d3 146 (void) obj;
sahilmgandhi 18:6a4db94011d3 147 NVIC_DisableIRQ (GPIO_IRQn);
sahilmgandhi 18:6a4db94011d3 148 }