Bluetooth Low Energy and Stepper Motor enabled device, compatible with the BlueST Protocol.
Dependencies: X_NUCLEO_IHM01A1
Bluetooth Low Energy and Stepper Motor enabled device, compatible with the BlueST Protocol.
source/main.cpp@2:b51fb6efcd55, 2018-08-06 (annotated)
- Committer:
- Davidroid
- Date:
- Mon Aug 06 09:59:56 2018 +0000
- Revision:
- 2:b51fb6efcd55
- Parent:
- 1:84935552ca4d
Correct Custom Service UUID
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Davidroid | 0:f87cdc08dcd1 | 1 | /** |
Davidroid | 0:f87cdc08dcd1 | 2 | ******************************************************************************* |
Davidroid | 0:f87cdc08dcd1 | 3 | * @file main.cpp |
Davidroid | 0:f87cdc08dcd1 | 4 | * @author Davide Aliprandi, STMicroelectronics |
Davidroid | 0:f87cdc08dcd1 | 5 | * @version V1.0.0 |
Davidroid | 0:f87cdc08dcd1 | 6 | * @date October 31st, 2017 |
Davidroid | 0:f87cdc08dcd1 | 7 | * @brief mbed test application for the STMicroelectronics X-NUCLEO-IHM01A1 |
Davidroid | 0:f87cdc08dcd1 | 8 | * Motor Control Expansion Board and the X-NUCLEO-IDB05A1 Bluetooth |
Davidroid | 0:f87cdc08dcd1 | 9 | * Low energy Expansion Board. |
Davidroid | 0:f87cdc08dcd1 | 10 | ******************************************************************************* |
Davidroid | 0:f87cdc08dcd1 | 11 | * @attention |
Davidroid | 0:f87cdc08dcd1 | 12 | * |
Davidroid | 0:f87cdc08dcd1 | 13 | * <h2><center>© COPYRIGHT(c) 2018 STMicroelectronics</center></h2> |
Davidroid | 0:f87cdc08dcd1 | 14 | * |
Davidroid | 0:f87cdc08dcd1 | 15 | * Redistribution and use in source and binary forms, with or without |
Davidroid | 0:f87cdc08dcd1 | 16 | * modification, are permitted provided that the following conditions are met: |
Davidroid | 0:f87cdc08dcd1 | 17 | * 1. Redistributions of source code must retain the above copyright notice, |
Davidroid | 0:f87cdc08dcd1 | 18 | * this list of conditions and the following disclaimer. |
Davidroid | 0:f87cdc08dcd1 | 19 | * 2. Redistributions in binary form must reproduce the above copyright |
Davidroid | 0:f87cdc08dcd1 | 20 | * notice, this list of conditions and the following disclaimer in the |
Davidroid | 0:f87cdc08dcd1 | 21 | * documentation and/or other materials provided with the distribution. |
Davidroid | 0:f87cdc08dcd1 | 22 | * 3. Neither the name of STMicroelectronics nor the names of its |
Davidroid | 0:f87cdc08dcd1 | 23 | * contributors may be used to endorse or promote products derived from |
Davidroid | 0:f87cdc08dcd1 | 24 | * this software without specific prior written permission. |
Davidroid | 0:f87cdc08dcd1 | 25 | * |
Davidroid | 0:f87cdc08dcd1 | 26 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
Davidroid | 0:f87cdc08dcd1 | 27 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
Davidroid | 0:f87cdc08dcd1 | 28 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
Davidroid | 0:f87cdc08dcd1 | 29 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS |
Davidroid | 0:f87cdc08dcd1 | 30 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
Davidroid | 0:f87cdc08dcd1 | 31 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
Davidroid | 0:f87cdc08dcd1 | 32 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
Davidroid | 0:f87cdc08dcd1 | 33 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
Davidroid | 0:f87cdc08dcd1 | 34 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
Davidroid | 0:f87cdc08dcd1 | 35 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
Davidroid | 0:f87cdc08dcd1 | 36 | * POSSIBILITY OF SUCH DAMAGE. |
Davidroid | 0:f87cdc08dcd1 | 37 | * |
Davidroid | 0:f87cdc08dcd1 | 38 | ******************************************************************************* |
Davidroid | 0:f87cdc08dcd1 | 39 | */ |
Davidroid | 0:f87cdc08dcd1 | 40 | |
Davidroid | 0:f87cdc08dcd1 | 41 | |
Davidroid | 0:f87cdc08dcd1 | 42 | /* Includes ------------------------------------------------------------------*/ |
Davidroid | 0:f87cdc08dcd1 | 43 | |
Davidroid | 0:f87cdc08dcd1 | 44 | /* mbed specific header files. */ |
Davidroid | 0:f87cdc08dcd1 | 45 | #include <events/mbed_events.h> |
Davidroid | 0:f87cdc08dcd1 | 46 | #include <mbed.h> |
Davidroid | 0:f87cdc08dcd1 | 47 | #include "ble/BLE.h" |
Davidroid | 0:f87cdc08dcd1 | 48 | #include "CustomService.h" |
Davidroid | 0:f87cdc08dcd1 | 49 | |
Davidroid | 0:f87cdc08dcd1 | 50 | /* Helper header files. */ |
Davidroid | 0:f87cdc08dcd1 | 51 | #include "DevSPI.h" |
Davidroid | 0:f87cdc08dcd1 | 52 | |
Davidroid | 0:f87cdc08dcd1 | 53 | /* Component specific header files. */ |
Davidroid | 0:f87cdc08dcd1 | 54 | #include "L6474.h" |
Davidroid | 0:f87cdc08dcd1 | 55 | |
Davidroid | 0:f87cdc08dcd1 | 56 | |
Davidroid | 0:f87cdc08dcd1 | 57 | /* Definitions ---------------------------------------------------------------*/ |
Davidroid | 0:f87cdc08dcd1 | 58 | |
Davidroid | 0:f87cdc08dcd1 | 59 | #define BLE_ADVERTISING_INTERVAL_ms 1000 |
Davidroid | 0:f87cdc08dcd1 | 60 | #define DELAY_1 100 |
Davidroid | 0:f87cdc08dcd1 | 61 | |
Davidroid | 0:f87cdc08dcd1 | 62 | |
Davidroid | 0:f87cdc08dcd1 | 63 | /* Variables -----------------------------------------------------------------*/ |
Davidroid | 0:f87cdc08dcd1 | 64 | |
Davidroid | 0:f87cdc08dcd1 | 65 | /* Blinky LED to indicate system aliveness. */ |
Davidroid | 0:f87cdc08dcd1 | 66 | //DigitalOut alivenessLED(LED1, 0); //Conflicts with SPI CLK on D13 |
Davidroid | 0:f87cdc08dcd1 | 67 | |
Davidroid | 0:f87cdc08dcd1 | 68 | /* Bluetooth. */ |
Davidroid | 1:84935552ca4d | 69 | const static char DEVICE_NAME[] = "MOTOR_DEVICE"; |
Davidroid | 0:f87cdc08dcd1 | 70 | const static uint8_t MANUFACTURER_SPECIFIC_DATA[]= {0x01,0x80,0x00,0x00,0x20,0x00}; |
Davidroid | 0:f87cdc08dcd1 | 71 | static EventQueue event_queue(/* event count */ 10 * EVENTS_EVENT_SIZE); |
Davidroid | 0:f87cdc08dcd1 | 72 | CustomService *custom_service; |
Davidroid | 0:f87cdc08dcd1 | 73 | |
Davidroid | 0:f87cdc08dcd1 | 74 | /* Initialization parameters. */ |
Davidroid | 0:f87cdc08dcd1 | 75 | L6474_init_t init = { |
Davidroid | 0:f87cdc08dcd1 | 76 | 160, /* Acceleration rate in pps^2. Range: (0..+inf). */ |
Davidroid | 0:f87cdc08dcd1 | 77 | 160, /* Deceleration rate in pps^2. Range: (0..+inf). */ |
Davidroid | 0:f87cdc08dcd1 | 78 | 1600, /* Maximum speed in pps. Range: (30..10000]. */ |
Davidroid | 0:f87cdc08dcd1 | 79 | 800, /* Minimum speed in pps. Range: [30..10000). */ |
Davidroid | 0:f87cdc08dcd1 | 80 | 250, /* Torque regulation current in mA. Range: 31.25mA to 4000mA. */ |
Davidroid | 0:f87cdc08dcd1 | 81 | L6474_OCD_TH_750mA, /* Overcurrent threshold (OCD_TH register). */ |
Davidroid | 0:f87cdc08dcd1 | 82 | L6474_CONFIG_OC_SD_ENABLE, /* Overcurrent shutwdown (OC_SD field of CONFIG register). */ |
Davidroid | 0:f87cdc08dcd1 | 83 | L6474_CONFIG_EN_TQREG_TVAL_USED, /* Torque regulation method (EN_TQREG field of CONFIG register). */ |
Davidroid | 0:f87cdc08dcd1 | 84 | L6474_STEP_SEL_1_8, /* Step selection (STEP_SEL field of STEP_MODE register). */ |
Davidroid | 0:f87cdc08dcd1 | 85 | L6474_SYNC_SEL_1_2, /* Sync selection (SYNC_SEL field of STEP_MODE register). */ |
Davidroid | 0:f87cdc08dcd1 | 86 | L6474_FAST_STEP_12us, /* Fall time value (T_FAST field of T_FAST register). Range: 2us to 32us. */ |
Davidroid | 0:f87cdc08dcd1 | 87 | L6474_TOFF_FAST_8us, /* Maximum fast decay time (T_OFF field of T_FAST register). Range: 2us to 32us. */ |
Davidroid | 0:f87cdc08dcd1 | 88 | 3, /* Minimum ON time in us (TON_MIN register). Range: 0.5us to 64us. */ |
Davidroid | 0:f87cdc08dcd1 | 89 | 21, /* Minimum OFF time in us (TOFF_MIN register). Range: 0.5us to 64us. */ |
Davidroid | 0:f87cdc08dcd1 | 90 | L6474_CONFIG_TOFF_044us, /* Target Swicthing Period (field TOFF of CONFIG register). */ |
Davidroid | 0:f87cdc08dcd1 | 91 | L6474_CONFIG_SR_320V_us, /* Slew rate (POW_SR field of CONFIG register). */ |
Davidroid | 0:f87cdc08dcd1 | 92 | L6474_CONFIG_INT_16MHZ, /* Clock setting (OSC_CLK_SEL field of CONFIG register). */ |
Davidroid | 0:f87cdc08dcd1 | 93 | L6474_ALARM_EN_OVERCURRENT | |
Davidroid | 0:f87cdc08dcd1 | 94 | L6474_ALARM_EN_THERMAL_SHUTDOWN | |
Davidroid | 0:f87cdc08dcd1 | 95 | L6474_ALARM_EN_THERMAL_WARNING | |
Davidroid | 0:f87cdc08dcd1 | 96 | L6474_ALARM_EN_UNDERVOLTAGE | |
Davidroid | 0:f87cdc08dcd1 | 97 | L6474_ALARM_EN_SW_TURN_ON | |
Davidroid | 0:f87cdc08dcd1 | 98 | L6474_ALARM_EN_WRONG_NPERF_CMD /* Alarm (ALARM_EN register). */ |
Davidroid | 0:f87cdc08dcd1 | 99 | }; |
Davidroid | 0:f87cdc08dcd1 | 100 | |
Davidroid | 0:f87cdc08dcd1 | 101 | /* Motor Control Component. */ |
Davidroid | 0:f87cdc08dcd1 | 102 | L6474 *motor; |
Davidroid | 0:f87cdc08dcd1 | 103 | |
Davidroid | 0:f87cdc08dcd1 | 104 | /* Button event. */ |
Davidroid | 0:f87cdc08dcd1 | 105 | InterruptIn event(USER_BUTTON); |
Davidroid | 0:f87cdc08dcd1 | 106 | |
Davidroid | 0:f87cdc08dcd1 | 107 | |
Davidroid | 0:f87cdc08dcd1 | 108 | /* Bluetooth related functions -----------------------------------------------*/ |
Davidroid | 0:f87cdc08dcd1 | 109 | |
Davidroid | 0:f87cdc08dcd1 | 110 | void on_disconnection_callback(const Gap::DisconnectionCallbackParams_t *params) |
Davidroid | 0:f87cdc08dcd1 | 111 | { |
Davidroid | 0:f87cdc08dcd1 | 112 | (void) params; |
Davidroid | 0:f87cdc08dcd1 | 113 | BLE::Instance().gap().startAdvertising(); |
Davidroid | 0:f87cdc08dcd1 | 114 | } |
Davidroid | 0:f87cdc08dcd1 | 115 | |
Davidroid | 0:f87cdc08dcd1 | 116 | void aliveness_callback(void) |
Davidroid | 0:f87cdc08dcd1 | 117 | { |
Davidroid | 0:f87cdc08dcd1 | 118 | //alivenessLED = !alivenessLED; /* Do blinky to indicate system aliveness. */ |
Davidroid | 0:f87cdc08dcd1 | 119 | } |
Davidroid | 0:f87cdc08dcd1 | 120 | |
Davidroid | 0:f87cdc08dcd1 | 121 | /** |
Davidroid | 0:f87cdc08dcd1 | 122 | * This callback allows the custom service to read updates from the |
Davidroid | 0:f87cdc08dcd1 | 123 | * characteristic. |
Davidroid | 0:f87cdc08dcd1 | 124 | * |
Davidroid | 0:f87cdc08dcd1 | 125 | * @param[in] params |
Davidroid | 0:f87cdc08dcd1 | 126 | * Information about the characterisitc being updated. |
Davidroid | 0:f87cdc08dcd1 | 127 | */ |
Davidroid | 0:f87cdc08dcd1 | 128 | void on_data_read_callback(const GattReadCallbackParams *params) { |
Davidroid | 0:f87cdc08dcd1 | 129 | static uint16_t time_stamp = 0; |
Davidroid | 0:f87cdc08dcd1 | 130 | |
Davidroid | 0:f87cdc08dcd1 | 131 | if (params->handle == custom_service->getValueHandle()) { |
Davidroid | 0:f87cdc08dcd1 | 132 | /* Getting motor's state. */ |
Davidroid | 0:f87cdc08dcd1 | 133 | uint8_t state = (uint8_t) (motor->get_device_state() == INACTIVE ? CustomService::MOTOR_INACTIVE : CustomService::MOTOR_RUNNING); |
Davidroid | 0:f87cdc08dcd1 | 134 | |
Davidroid | 0:f87cdc08dcd1 | 135 | /* Sending data via bluetooth. */ |
Davidroid | 0:f87cdc08dcd1 | 136 | if (BLE::Instance().getGapState().connected) { |
Davidroid | 0:f87cdc08dcd1 | 137 | event_queue.call(Callback<void(uint16_t, uint8_t)>(custom_service, &CustomService::send_state), time_stamp++, state); |
Davidroid | 0:f87cdc08dcd1 | 138 | } |
Davidroid | 0:f87cdc08dcd1 | 139 | } |
Davidroid | 0:f87cdc08dcd1 | 140 | } |
Davidroid | 1:84935552ca4d | 141 | |
Davidroid | 0:f87cdc08dcd1 | 142 | /** |
Davidroid | 0:f87cdc08dcd1 | 143 | * This callback allows the custom service to write updates to the |
Davidroid | 0:f87cdc08dcd1 | 144 | * characteristic. |
Davidroid | 0:f87cdc08dcd1 | 145 | * |
Davidroid | 0:f87cdc08dcd1 | 146 | * @param[in] params |
Davidroid | 0:f87cdc08dcd1 | 147 | * Information about the characterisitc being updated. |
Davidroid | 0:f87cdc08dcd1 | 148 | */ |
Davidroid | 0:f87cdc08dcd1 | 149 | void on_data_written_callback(const GattWriteCallbackParams *params) { |
Davidroid | 2:b51fb6efcd55 | 150 | uint32_t steps = 3000; |
Davidroid | 0:f87cdc08dcd1 | 151 | |
Davidroid | 0:f87cdc08dcd1 | 152 | if (params->handle == custom_service->getValueHandle()) { |
Davidroid | 0:f87cdc08dcd1 | 153 | //printf("--> COMMAND: %d\r\n", ((uint8_t *) (params->data))[0]); |
Davidroid | 0:f87cdc08dcd1 | 154 | switch ((CustomService::motor_command_t) ((uint8_t *) (params->data))[0]) |
Davidroid | 0:f87cdc08dcd1 | 155 | { |
Davidroid | 0:f87cdc08dcd1 | 156 | //Stops running with HiZ |
Davidroid | 0:f87cdc08dcd1 | 157 | case CustomService::MOTOR_STOP_RUNNING_WITHOUT_TORQUE: |
Davidroid | 2:b51fb6efcd55 | 158 | //printf("--> %d %d\r\n", params->len, ((uint8_t *) (params->data))[0]); |
Davidroid | 0:f87cdc08dcd1 | 159 | motor->hard_hiz(); |
Davidroid | 0:f87cdc08dcd1 | 160 | motor->wait_while_active(); |
Davidroid | 0:f87cdc08dcd1 | 161 | break; |
Davidroid | 0:f87cdc08dcd1 | 162 | //Stops running with torque applied |
Davidroid | 0:f87cdc08dcd1 | 163 | case CustomService::MOTOR_STOP_RUNNING_WITH_TORQUE: |
Davidroid | 2:b51fb6efcd55 | 164 | //printf("--> %d %d\r\n", params->len, ((uint8_t *) (params->data))[0]); |
Davidroid | 0:f87cdc08dcd1 | 165 | motor->hard_stop(); |
Davidroid | 0:f87cdc08dcd1 | 166 | motor->enable(); |
Davidroid | 0:f87cdc08dcd1 | 167 | motor->wait_while_active(); |
Davidroid | 0:f87cdc08dcd1 | 168 | break; |
Davidroid | 0:f87cdc08dcd1 | 169 | //Runs forward indefinitely |
Davidroid | 0:f87cdc08dcd1 | 170 | case CustomService::MOTOR_RUN_FORWARD: |
Davidroid | 2:b51fb6efcd55 | 171 | //printf("--> %d %d\r\n", params->len, ((uint8_t *) (params->data))[0]); |
Davidroid | 0:f87cdc08dcd1 | 172 | motor->run(StepperMotor::FWD); |
Davidroid | 0:f87cdc08dcd1 | 173 | break; |
Davidroid | 0:f87cdc08dcd1 | 174 | //Runs backward indefinitely |
Davidroid | 0:f87cdc08dcd1 | 175 | case CustomService::MOTOR_RUN_BACKWARD: |
Davidroid | 2:b51fb6efcd55 | 176 | //printf("--> %d %d\r\n", params->len, ((uint8_t *) (params->data))[0]); |
Davidroid | 0:f87cdc08dcd1 | 177 | motor->run(StepperMotor::BWD); |
Davidroid | 0:f87cdc08dcd1 | 178 | break; |
Davidroid | 0:f87cdc08dcd1 | 179 | //Moves steps forward |
Davidroid | 0:f87cdc08dcd1 | 180 | case CustomService::MOTOR_MOVE_STEPS_FORWARD: |
Davidroid | 0:f87cdc08dcd1 | 181 | steps = ((((uint8_t *) (params->data))[1]) | |
Davidroid | 0:f87cdc08dcd1 | 182 | (((uint8_t *) (params->data))[2] << 8 ) | |
Davidroid | 0:f87cdc08dcd1 | 183 | (((uint8_t *) (params->data))[3] << 16) | |
Davidroid | 0:f87cdc08dcd1 | 184 | (((uint8_t *) (params->data))[4] << 24)); |
Davidroid | 2:b51fb6efcd55 | 185 | //printf("--> %d %d %d", params->len, ((uint8_t *) (params->data))[0], steps); |
Davidroid | 0:f87cdc08dcd1 | 186 | motor->move(StepperMotor::FWD, steps); |
Davidroid | 0:f87cdc08dcd1 | 187 | motor->wait_while_active(); |
Davidroid | 0:f87cdc08dcd1 | 188 | break; |
Davidroid | 0:f87cdc08dcd1 | 189 | //Moves steps backward |
Davidroid | 0:f87cdc08dcd1 | 190 | case CustomService::MOTOR_MOVE_STEPS_BACKWARD: |
Davidroid | 0:f87cdc08dcd1 | 191 | steps = ((((uint8_t *) (params->data))[1]) | |
Davidroid | 0:f87cdc08dcd1 | 192 | (((uint8_t *) (params->data))[2] << 8 ) | |
Davidroid | 0:f87cdc08dcd1 | 193 | (((uint8_t *) (params->data))[3] << 16) | |
Davidroid | 0:f87cdc08dcd1 | 194 | (((uint8_t *) (params->data))[4] << 24)); |
Davidroid | 2:b51fb6efcd55 | 195 | //printf("--> %d %d %d", params->len, ((uint8_t *) (params->data))[0], steps); |
Davidroid | 0:f87cdc08dcd1 | 196 | motor->move(StepperMotor::BWD, steps); |
Davidroid | 0:f87cdc08dcd1 | 197 | motor->wait_while_active(); |
Davidroid | 0:f87cdc08dcd1 | 198 | break; |
Davidroid | 0:f87cdc08dcd1 | 199 | //Other |
Davidroid | 0:f87cdc08dcd1 | 200 | default: |
Davidroid | 0:f87cdc08dcd1 | 201 | break; |
Davidroid | 0:f87cdc08dcd1 | 202 | } |
Davidroid | 0:f87cdc08dcd1 | 203 | } |
Davidroid | 0:f87cdc08dcd1 | 204 | } |
Davidroid | 0:f87cdc08dcd1 | 205 | |
Davidroid | 0:f87cdc08dcd1 | 206 | /** |
Davidroid | 0:f87cdc08dcd1 | 207 | * This function is called when the ble initialization process has failled. |
Davidroid | 0:f87cdc08dcd1 | 208 | */ |
Davidroid | 0:f87cdc08dcd1 | 209 | void on_ble_init_error_callback(BLE &ble, ble_error_t error) |
Davidroid | 0:f87cdc08dcd1 | 210 | { |
Davidroid | 0:f87cdc08dcd1 | 211 | /* Initialization error handling should go here */ |
Davidroid | 0:f87cdc08dcd1 | 212 | } |
Davidroid | 0:f87cdc08dcd1 | 213 | |
Davidroid | 0:f87cdc08dcd1 | 214 | /** |
Davidroid | 0:f87cdc08dcd1 | 215 | * Callback triggered when the ble initialization process has finished. |
Davidroid | 0:f87cdc08dcd1 | 216 | */ |
Davidroid | 0:f87cdc08dcd1 | 217 | void ble_init_complete(BLE::InitializationCompleteCallbackContext *params) |
Davidroid | 0:f87cdc08dcd1 | 218 | { |
Davidroid | 0:f87cdc08dcd1 | 219 | BLE& ble = params->ble; |
Davidroid | 0:f87cdc08dcd1 | 220 | ble_error_t error = params->error; |
Davidroid | 0:f87cdc08dcd1 | 221 | |
Davidroid | 0:f87cdc08dcd1 | 222 | if (error != BLE_ERROR_NONE) { |
Davidroid | 0:f87cdc08dcd1 | 223 | /* In case of error, forward the error handling to on_ble_init_error_callback */ |
Davidroid | 0:f87cdc08dcd1 | 224 | on_ble_init_error_callback(ble, error); |
Davidroid | 0:f87cdc08dcd1 | 225 | return; |
Davidroid | 0:f87cdc08dcd1 | 226 | } |
Davidroid | 0:f87cdc08dcd1 | 227 | |
Davidroid | 0:f87cdc08dcd1 | 228 | /* Ensure that it is the default instance of BLE */ |
Davidroid | 0:f87cdc08dcd1 | 229 | if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
Davidroid | 0:f87cdc08dcd1 | 230 | return; |
Davidroid | 0:f87cdc08dcd1 | 231 | } |
Davidroid | 0:f87cdc08dcd1 | 232 | |
Davidroid | 0:f87cdc08dcd1 | 233 | ble.gap().onDisconnection(on_disconnection_callback); |
Davidroid | 0:f87cdc08dcd1 | 234 | ble.gattServer().onDataWritten(on_data_written_callback); |
Davidroid | 0:f87cdc08dcd1 | 235 | ble.gattServer().onDataRead(on_data_read_callback); |
Davidroid | 0:f87cdc08dcd1 | 236 | |
Davidroid | 0:f87cdc08dcd1 | 237 | custom_service = new CustomService(ble); |
Davidroid | 0:f87cdc08dcd1 | 238 | |
Davidroid | 0:f87cdc08dcd1 | 239 | /* Setup advertising data. */ |
Davidroid | 0:f87cdc08dcd1 | 240 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
Davidroid | 2:b51fb6efcd55 | 241 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (uint8_t *) CUSTOM_SERVICE_UUID, sizeof(CUSTOM_SERVICE_UUID)); |
Davidroid | 0:f87cdc08dcd1 | 242 | ble.gap().accumulateScanResponse(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, MANUFACTURER_SPECIFIC_DATA, sizeof(MANUFACTURER_SPECIFIC_DATA)); |
Davidroid | 1:84935552ca4d | 243 | ble.gap().accumulateScanResponse(GapAdvertisingData::COMPLETE_LOCAL_NAME, (const uint8_t *) DEVICE_NAME, sizeof(DEVICE_NAME) - 1); |
Davidroid | 0:f87cdc08dcd1 | 244 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
Davidroid | 0:f87cdc08dcd1 | 245 | ble.gap().setAdvertisingInterval(BLE_ADVERTISING_INTERVAL_ms); |
Davidroid | 0:f87cdc08dcd1 | 246 | ble.gap().startAdvertising(); |
Davidroid | 0:f87cdc08dcd1 | 247 | } |
Davidroid | 0:f87cdc08dcd1 | 248 | |
Davidroid | 0:f87cdc08dcd1 | 249 | void schedule_ble_events_processing(BLE::OnEventsToProcessCallbackContext* context) { |
Davidroid | 0:f87cdc08dcd1 | 250 | BLE &ble = BLE::Instance(); |
Davidroid | 0:f87cdc08dcd1 | 251 | event_queue.call(Callback<void()>(&ble, &BLE::processEvents)); |
Davidroid | 0:f87cdc08dcd1 | 252 | } |
Davidroid | 0:f87cdc08dcd1 | 253 | |
Davidroid | 0:f87cdc08dcd1 | 254 | |
Davidroid | 0:f87cdc08dcd1 | 255 | /* Custom service related functions ------------------------------------------*/ |
Davidroid | 0:f87cdc08dcd1 | 256 | |
Davidroid | 0:f87cdc08dcd1 | 257 | /** |
Davidroid | 0:f87cdc08dcd1 | 258 | * @brief This is an example of user handler for the flag interrupt. |
Davidroid | 0:f87cdc08dcd1 | 259 | * @param None |
Davidroid | 0:f87cdc08dcd1 | 260 | * @retval None |
Davidroid | 0:f87cdc08dcd1 | 261 | * @note If needed, implement it, and then attach and enable it: |
Davidroid | 0:f87cdc08dcd1 | 262 | * + motor->attach_flag_irq(&flag_irq_handler); |
Davidroid | 0:f87cdc08dcd1 | 263 | * + motor->enable_flag_irq(); |
Davidroid | 0:f87cdc08dcd1 | 264 | * To disable it: |
Davidroid | 0:f87cdc08dcd1 | 265 | * + motor->disble_flag_irq(); |
Davidroid | 0:f87cdc08dcd1 | 266 | */ |
Davidroid | 0:f87cdc08dcd1 | 267 | void flag_irq_handler(void) |
Davidroid | 0:f87cdc08dcd1 | 268 | { |
Davidroid | 0:f87cdc08dcd1 | 269 | /* Set ISR flag. */ |
Davidroid | 0:f87cdc08dcd1 | 270 | motor->isr_flag = TRUE; |
Davidroid | 0:f87cdc08dcd1 | 271 | |
Davidroid | 0:f87cdc08dcd1 | 272 | /* Get the value of the status register. */ |
Davidroid | 0:f87cdc08dcd1 | 273 | unsigned int status = motor->get_status(); |
Davidroid | 0:f87cdc08dcd1 | 274 | |
Davidroid | 0:f87cdc08dcd1 | 275 | /* Check NOTPERF_CMD flag: if set, the command received by SPI can't be performed. */ |
Davidroid | 0:f87cdc08dcd1 | 276 | /* This often occures when a command is sent to the L6474 while it is not in HiZ state. */ |
Davidroid | 0:f87cdc08dcd1 | 277 | if ((status & L6474_STATUS_NOTPERF_CMD) == L6474_STATUS_NOTPERF_CMD) { |
Davidroid | 0:f87cdc08dcd1 | 278 | printf(" WARNING: \"FLAG\" interrupt triggered. Non-performable command detected when updating L6474's registers while not in HiZ state.\r\n"); |
Davidroid | 0:f87cdc08dcd1 | 279 | } |
Davidroid | 0:f87cdc08dcd1 | 280 | |
Davidroid | 0:f87cdc08dcd1 | 281 | /* Reset ISR flag. */ |
Davidroid | 0:f87cdc08dcd1 | 282 | motor->isr_flag = FALSE; |
Davidroid | 0:f87cdc08dcd1 | 283 | } |
Davidroid | 0:f87cdc08dcd1 | 284 | |
Davidroid | 0:f87cdc08dcd1 | 285 | |
Davidroid | 0:f87cdc08dcd1 | 286 | /* Motor related functions ------------------------------------------*/ |
Davidroid | 0:f87cdc08dcd1 | 287 | |
Davidroid | 0:f87cdc08dcd1 | 288 | void motor_run_callback(void) |
Davidroid | 0:f87cdc08dcd1 | 289 | { |
Davidroid | 0:f87cdc08dcd1 | 290 | motor->run(StepperMotor::FWD); |
Davidroid | 0:f87cdc08dcd1 | 291 | } |
Davidroid | 0:f87cdc08dcd1 | 292 | |
Davidroid | 0:f87cdc08dcd1 | 293 | void motor_stop_callback(void) |
Davidroid | 0:f87cdc08dcd1 | 294 | { |
Davidroid | 0:f87cdc08dcd1 | 295 | motor->hard_hiz(); |
Davidroid | 0:f87cdc08dcd1 | 296 | motor->wait_while_active(); |
Davidroid | 0:f87cdc08dcd1 | 297 | } |
Davidroid | 0:f87cdc08dcd1 | 298 | |
Davidroid | 0:f87cdc08dcd1 | 299 | |
Davidroid | 0:f87cdc08dcd1 | 300 | /* Main function -------------------------------------------------------------*/ |
Davidroid | 0:f87cdc08dcd1 | 301 | |
Davidroid | 0:f87cdc08dcd1 | 302 | int main() |
Davidroid | 0:f87cdc08dcd1 | 303 | { |
Davidroid | 0:f87cdc08dcd1 | 304 | /*----- Initialization. -----*/ |
Davidroid | 0:f87cdc08dcd1 | 305 | |
Davidroid | 0:f87cdc08dcd1 | 306 | /* Printing to the console. */ |
Davidroid | 0:f87cdc08dcd1 | 307 | printf("Motor Node Application Example\r\n\n"); |
Davidroid | 0:f87cdc08dcd1 | 308 | |
Davidroid | 0:f87cdc08dcd1 | 309 | /* Aliveness callback. */ |
Davidroid | 0:f87cdc08dcd1 | 310 | //event_queue.call_every(500, aliveness_callback); |
Davidroid | 0:f87cdc08dcd1 | 311 | |
Davidroid | 0:f87cdc08dcd1 | 312 | /* Bluetooth. */ |
Davidroid | 0:f87cdc08dcd1 | 313 | BLE &ble = BLE::Instance(); |
Davidroid | 0:f87cdc08dcd1 | 314 | ble.onEventsToProcess(schedule_ble_events_processing); |
Davidroid | 0:f87cdc08dcd1 | 315 | ble.init(ble_init_complete); |
Davidroid | 0:f87cdc08dcd1 | 316 | |
Davidroid | 0:f87cdc08dcd1 | 317 | /* Initializing SPI bus. */ |
Davidroid | 0:f87cdc08dcd1 | 318 | DevSPI dev_spi(D11, D12, D13); |
Davidroid | 0:f87cdc08dcd1 | 319 | |
Davidroid | 0:f87cdc08dcd1 | 320 | /* Initializing Motor Control Component. */ |
Davidroid | 0:f87cdc08dcd1 | 321 | /* D7 conflicts with BNRG_RST (when motor changes direction 0-1 BLE resets). */ |
Davidroid | 0:f87cdc08dcd1 | 322 | /* Used Morpho PB_2 and made HW wiring. */ |
Davidroid | 0:f87cdc08dcd1 | 323 | motor = new L6474(D2, D8, PB_2, D9, D10, dev_spi); |
Davidroid | 0:f87cdc08dcd1 | 324 | if (motor->init(&init) != COMPONENT_OK) { |
Davidroid | 0:f87cdc08dcd1 | 325 | exit(EXIT_FAILURE); |
Davidroid | 0:f87cdc08dcd1 | 326 | } |
Davidroid | 0:f87cdc08dcd1 | 327 | |
Davidroid | 0:f87cdc08dcd1 | 328 | /* Attaching and enabling interrupt handlers. */ |
Davidroid | 0:f87cdc08dcd1 | 329 | motor->attach_flag_irq(&flag_irq_handler); |
Davidroid | 0:f87cdc08dcd1 | 330 | motor->enable_flag_irq(); |
Davidroid | 0:f87cdc08dcd1 | 331 | event.fall(motor_run_callback); |
Davidroid | 0:f87cdc08dcd1 | 332 | event.rise(motor_stop_callback); |
Davidroid | 0:f87cdc08dcd1 | 333 | |
Davidroid | 0:f87cdc08dcd1 | 334 | /* Stopping with HiZ. */ |
Davidroid | 0:f87cdc08dcd1 | 335 | motor->hard_hiz(); |
Davidroid | 0:f87cdc08dcd1 | 336 | motor->wait_while_active(); |
Davidroid | 0:f87cdc08dcd1 | 337 | |
Davidroid | 0:f87cdc08dcd1 | 338 | /* Start. */ |
Davidroid | 0:f87cdc08dcd1 | 339 | event_queue.dispatch_forever(); |
Davidroid | 0:f87cdc08dcd1 | 340 | |
Davidroid | 0:f87cdc08dcd1 | 341 | return 0; |
Davidroid | 0:f87cdc08dcd1 | 342 | } |