Diseño de Firmaware Diseañado en base a los requerimientos definidos durante la etapa de analisis.

Dependencies:   BLE_API mbed

Fork of nRF51822_SimpleControls by Gustavo Belduma

Committer:
Gustavo_Eduardo338
Date:
Fri Sep 02 15:12:42 2016 +0000
Revision:
9:501a9e6710d2
Parent:
8:c4130ea78471
Simple Control Caracteristicas NRF51822

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dixysleo 0:58e350255405 1 /*
dixysleo 0:58e350255405 2 Copyright (c) 2012-2014 RedBearLab
dixysleo 0:58e350255405 3
Gustavo_Eduardo338 4:a43cbe8aed6a 4 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
Gustavo_Eduardo338 4:a43cbe8aed6a 5 and associated documentation files (the "Software"), to deal in the Software without restriction,
Gustavo_Eduardo338 4:a43cbe8aed6a 6 including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
Gustavo_Eduardo338 4:a43cbe8aed6a 7 and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
dixysleo 0:58e350255405 8 subject to the following conditions:
dixysleo 0:58e350255405 9 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
dixysleo 0:58e350255405 10
Gustavo_Eduardo338 4:a43cbe8aed6a 11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
Gustavo_Eduardo338 4:a43cbe8aed6a 12 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
Gustavo_Eduardo338 4:a43cbe8aed6a 13 PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
Gustavo_Eduardo338 4:a43cbe8aed6a 14 FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
dixysleo 0:58e350255405 15 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
dixysleo 0:58e350255405 16
dixysleo 0:58e350255405 17 */
dixysleo 0:58e350255405 18
dixysleo 0:58e350255405 19 #include "mbed.h"
dixysleo 0:58e350255405 20 #include "ble/BLE.h"
dixysleo 0:58e350255405 21 #include "GattCallbackParamTypes.h"
dixysleo 0:58e350255405 22
dixysleo 0:58e350255405 23 #define BLE_UUID_TXRX_SERVICE 0x0000 /**< The UUID of the Nordic UART Service. */
dixysleo 0:58e350255405 24 #define BLE_UUID_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */
dixysleo 0:58e350255405 25 #define BLE_UUIDS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */
dixysleo 0:58e350255405 26
dixysleo 0:58e350255405 27 #define TXRX_BUF_LEN 20
dixysleo 0:58e350255405 28
Gustavo_Eduardo338 5:a8c07a29df8a 29 #define DIGITAL_OUT_7 P0_17 //D7
Gustavo_Eduardo338 7:fb4c6c1dd3a9 30 #define DIGITAL_OUT_8 P0_19 //D8
Gustavo_Eduardo338 7:fb4c6c1dd3a9 31 #define DIGITAL_OUT_11 P0_12 //D11
Gustavo_Eduardo338 5:a8c07a29df8a 32 #define DIGITAL_OUT_4 P0_21 //D4
Gustavo_Eduardo338 5:a8c07a29df8a 33
dixysleo 0:58e350255405 34 #define DIGITAL_IN_PIN P0_5 //A4
Gustavo_Eduardo338 5:a8c07a29df8a 35
dixysleo 0:58e350255405 36 #define PWM_PIN P0_16 //D6
dixysleo 0:58e350255405 37 #define ANALOG_IN_PIN P0_6 //A5
dixysleo 0:58e350255405 38
Gustavo_Eduardo338 5:a8c07a29df8a 39 // Declarando los pines
Gustavo_Eduardo338 7:fb4c6c1dd3a9 40 //static int32_t send_config = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 41 static int32_t enviar_config_01 = 0;
dixysleo 0:58e350255405 42
Gustavo_Eduardo338 8:c4130ea78471 43 // variables semaforos que me permiten identificar si se debe o no enviar las tramas de configuracion de cada sensor.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 44 static int32_t sen_analog_in_5 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 45 static int32_t sen_digital_in_7 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 46 static int32_t act_analog_out_6 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 47 static int32_t act_analog_out_4 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 48 static int32_t act_analog_out_7 = 0;
Gustavo_Eduardo338 5:a8c07a29df8a 49
Gustavo_Eduardo338 8:c4130ea78471 50 // Variables semaforo que me permiten identificar si se debe enviar la respuesta de confirmacion
Gustavo_Eduardo338 8:c4130ea78471 51 static int32_t resp_analog_out_6 = 0;
Gustavo_Eduardo338 8:c4130ea78471 52 static int32_t resp_digital_out_4 = 0;
Gustavo_Eduardo338 8:c4130ea78471 53 static int32_t resp_digital_out_7 = 0;
Gustavo_Eduardo338 8:c4130ea78471 54
Gustavo_Eduardo338 5:a8c07a29df8a 55 BLE ble;
Gustavo_Eduardo338 5:a8c07a29df8a 56
Gustavo_Eduardo338 5:a8c07a29df8a 57 // Digital IN
dixysleo 0:58e350255405 58 DigitalIn BUTTON(DIGITAL_IN_PIN);
Gustavo_Eduardo338 5:a8c07a29df8a 59
Gustavo_Eduardo338 5:a8c07a29df8a 60 // Digital OUT
Gustavo_Eduardo338 5:a8c07a29df8a 61 DigitalOut LED_SET_D7(DIGITAL_OUT_7);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 62 DigitalOut LED_SET_D8(DIGITAL_OUT_8);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 63 DigitalOut LED_SET_D11(DIGITAL_OUT_11);
Gustavo_Eduardo338 5:a8c07a29df8a 64 DigitalOut LED_SET_D4(DIGITAL_OUT_4);
Gustavo_Eduardo338 5:a8c07a29df8a 65
Gustavo_Eduardo338 5:a8c07a29df8a 66 // Analog IN
Gustavo_Eduardo338 5:a8c07a29df8a 67 AnalogIn ANALOG(ANALOG_IN_PIN);
Gustavo_Eduardo338 5:a8c07a29df8a 68
Gustavo_Eduardo338 5:a8c07a29df8a 69 // Analog OUT
Gustavo_Eduardo338 7:fb4c6c1dd3a9 70 PwmOut PWM(PWM_PIN);
Gustavo_Eduardo338 5:a8c07a29df8a 71
Gustavo_Eduardo338 7:fb4c6c1dd3a9 72 // Permite imprimir mensajes en la consola
dixysleo 0:58e350255405 73 Serial pc(USBTX, USBRX);
dixysleo 0:58e350255405 74
dixysleo 0:58e350255405 75 static uint8_t analog_enabled = 0;
dixysleo 0:58e350255405 76 static uint8_t old_state = 0;
dixysleo 0:58e350255405 77
dixysleo 0:58e350255405 78 // The Nordic UART Service
dixysleo 0:58e350255405 79 static const uint8_t uart_base_uuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
dixysleo 0:58e350255405 80 static const uint8_t uart_tx_uuid[] = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
dixysleo 0:58e350255405 81 static const uint8_t uart_rx_uuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
dixysleo 0:58e350255405 82 static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71};
dixysleo 0:58e350255405 83
Gustavo_Eduardo338 7:fb4c6c1dd3a9 84 // Trama de Configuracion de los Pines (a).
Gustavo_Eduardo338 8:c4130ea78471 85 static const uint8_t di_conf [] = {0xC01,0xA1, 20, 0xA0, 40, 0xD1, 10, 0xD0, 90}; // length: 9
dixysleo 0:58e350255405 86
dixysleo 0:58e350255405 87 uint8_t txPayload[TXRX_BUF_LEN] = {0,};
dixysleo 0:58e350255405 88 uint8_t rxPayload[TXRX_BUF_LEN] = {0,};
dixysleo 0:58e350255405 89
dixysleo 0:58e350255405 90 GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
dixysleo 0:58e350255405 91 GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
dixysleo 0:58e350255405 92 GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic};
dixysleo 0:58e350255405 93 GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *));
dixysleo 0:58e350255405 94
dixysleo 0:58e350255405 95 // https://developer.mbed.org/forum/repo-61676-BLE_GAP_Example-community/topic/17193/
Gustavo_Eduardo338 4:a43cbe8aed6a 96 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
Gustavo_Eduardo338 4:a43cbe8aed6a 97 {
Gustavo_Eduardo338 4:a43cbe8aed6a 98 BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
dixysleo 0:58e350255405 99 pc.printf("Disconnected \r\n");
dixysleo 0:58e350255405 100 pc.printf("Restart advertising \r\n");
Gustavo_Eduardo338 4:a43cbe8aed6a 101 ble.startAdvertising();
Gustavo_Eduardo338 7:fb4c6c1dd3a9 102 LED_SET_D11 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 103 analog_enabled = 0; // Deja que envie lecturas el PT 1000
Gustavo_Eduardo338 9:501a9e6710d2 104
Gustavo_Eduardo338 7:fb4c6c1dd3a9 105 sen_analog_in_5 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 106 sen_digital_in_7 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 107 act_analog_out_6 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 108 act_analog_out_4 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 109 act_analog_out_7 = 0;
Gustavo_Eduardo338 9:501a9e6710d2 110
Gustavo_Eduardo338 7:fb4c6c1dd3a9 111 enviar_config_01 = 0;
Gustavo_Eduardo338 5:a8c07a29df8a 112 }
Gustavo_Eduardo338 5:a8c07a29df8a 113 // Ingresa por este metdo unicamente la primera vez que se conecta al mote.
Gustavo_Eduardo338 5:a8c07a29df8a 114 // Tomado desde: https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_LEDBlinker/file/dc392bde2b3c/main.cpp
Gustavo_Eduardo338 5:a8c07a29df8a 115 void connectionCallback(const Gap::ConnectionCallbackParams_t *)
Gustavo_Eduardo338 5:a8c07a29df8a 116 {
Gustavo_Eduardo338 5:a8c07a29df8a 117 pc.printf("connectionCallback \r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 118 LED_SET_D11 = 1; // Enciendo led que indica que alguien se conecto
Gustavo_Eduardo338 7:fb4c6c1dd3a9 119 enviar_config_01 = 1;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 120 //send_config = 1;
dixysleo 0:58e350255405 121 }
dixysleo 0:58e350255405 122
Gustavo_Eduardo338 5:a8c07a29df8a 123 // Recepta las caracteristicas que se desea escribir en el mote.
dixysleo 0:58e350255405 124 void WrittenHandler(const GattWriteCallbackParams *Handler)
Gustavo_Eduardo338 4:a43cbe8aed6a 125 {
Gustavo_Eduardo338 5:a8c07a29df8a 126 pc.printf("WrittenHandler(const GattWriteCallbackParams *Handler) \r\n");
dixysleo 0:58e350255405 127 uint8_t buf[TXRX_BUF_LEN];
dixysleo 0:58e350255405 128 uint16_t bytesRead, index;
Gustavo_Eduardo338 4:a43cbe8aed6a 129
Gustavo_Eduardo338 4:a43cbe8aed6a 130 if (Handler->handle == txCharacteristic.getValueAttribute().getHandle()) {
dixysleo 0:58e350255405 131 ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead);
dixysleo 0:58e350255405 132 memset(txPayload, 0, TXRX_BUF_LEN);
Gustavo_Eduardo338 4:a43cbe8aed6a 133 memcpy(txPayload, buf, TXRX_BUF_LEN);
Gustavo_Eduardo338 4:a43cbe8aed6a 134
dixysleo 0:58e350255405 135 //por dixys
Gustavo_Eduardo338 9:501a9e6710d2 136 //pc.printf("Buffer recibido desde Android: \r\n");
Gustavo_Eduardo338 4:a43cbe8aed6a 137
dixysleo 0:58e350255405 138 for(index=0; index<bytesRead; index++)
dixysleo 0:58e350255405 139 pc.putc(buf[index]);
Gustavo_Eduardo338 4:a43cbe8aed6a 140
Gustavo_Eduardo338 9:501a9e6710d2 141 //pc.printf("Leemos la trama: \r\n");
Gustavo_Eduardo338 9:501a9e6710d2 142 //for(index=0; index<bytesRead; index++) {
Gustavo_Eduardo338 9:501a9e6710d2 143 // pc.printf("buf[%02x]: %02x\r\n", index, buf[index]);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 144
Gustavo_Eduardo338 9:501a9e6710d2 145 //}
Gustavo_Eduardo338 9:501a9e6710d2 146 //pc.printf("Fin de la Lectura: \r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 147
Gustavo_Eduardo338 8:c4130ea78471 148 // Desde el telefono desactiva el envio de tramas de las siguientes tramas.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 149 if (buf[0] == 0xDC && buf[1] == 0xC1) { // Dato Configuracion
Gustavo_Eduardo338 8:c4130ea78471 150 enviar_config_01 = buf[2]; // Debe ser cero, hace que ya no se vuelva a enviar la conf general del mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 151 sen_analog_in_5 = 1; // habilita al Sensor PT1000, para que envie su configuracion
Gustavo_Eduardo338 7:fb4c6c1dd3a9 152 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 153 // PT 1000
Gustavo_Eduardo338 7:fb4c6c1dd3a9 154 if (buf[0] == 0xDC && buf[1] == 0x05 && buf[2] == 0xAA && buf[3] == 20) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 155 sen_analog_in_5 = buf[4]; // Hace que ya no se vuelva a enviar este tipo de configuracion
Gustavo_Eduardo338 7:fb4c6c1dd3a9 156 sen_digital_in_7 = 1; // habilita al Sensor de Luz, para que envie su configuracion
Gustavo_Eduardo338 7:fb4c6c1dd3a9 157 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 158 // sensor de luz
Gustavo_Eduardo338 7:fb4c6c1dd3a9 159 if (buf[0] == 0xDC && buf[1] == 0x05 && buf[2] == 0xDD && buf[3] == 10) {
Gustavo_Eduardo338 8:c4130ea78471 160 sen_digital_in_7 = buf[4]; // Hace que ya no se vuelva a enviar este tipo de configuracion
Gustavo_Eduardo338 7:fb4c6c1dd3a9 161 act_analog_out_6 = 1; // habilita al atuador PWD, para que envie su configuracion
Gustavo_Eduardo338 7:fb4c6c1dd3a9 162 }
Gustavo_Eduardo338 9:501a9e6710d2 163
Gustavo_Eduardo338 7:fb4c6c1dd3a9 164 // PWD
Gustavo_Eduardo338 7:fb4c6c1dd3a9 165 if (buf[0] == 0xDC && buf[1] == 0xA && buf[2] == 0xAA && buf[3] == 40) {
Gustavo_Eduardo338 8:c4130ea78471 166 act_analog_out_6 = buf[4]; // Hace que ya no se vuelva a enviar este tipo de configuracion
Gustavo_Eduardo338 7:fb4c6c1dd3a9 167 act_analog_out_4 = 1; // habilita al atuador Bomba, para que envie su configuracion
Gustavo_Eduardo338 7:fb4c6c1dd3a9 168 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 169 // Actuador la Bomba
Gustavo_Eduardo338 7:fb4c6c1dd3a9 170 if (buf[0] == 0xDC && buf[1] == 0xA && buf[2] == 0x0A && buf[3] == 80) {
Gustavo_Eduardo338 8:c4130ea78471 171 act_analog_out_4 = buf[4]; // Hace que ya no se vuelva a enviar este tipo de configuracion
Gustavo_Eduardo338 7:fb4c6c1dd3a9 172 act_analog_out_7 = 1; // habilita al atuador Foco, para que envie su configuracion
Gustavo_Eduardo338 9:501a9e6710d2 173
Gustavo_Eduardo338 7:fb4c6c1dd3a9 174 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 175 // Actuador Foco
Gustavo_Eduardo338 7:fb4c6c1dd3a9 176 if (buf[0] == 0xDC && buf[1] == 0xA && buf[2] == 0x0A && buf[3] == 10) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 177 act_analog_out_7 = buf[4]; // Hace que ya no se vuelva a enviar este tipo de configuracion
Gustavo_Eduardo338 7:fb4c6c1dd3a9 178 }
Gustavo_Eduardo338 9:501a9e6710d2 179
Gustavo_Eduardo338 8:c4130ea78471 180 // Maneja las Tramas de confirmacion
Gustavo_Eduardo338 8:c4130ea78471 181 // PWD
Gustavo_Eduardo338 8:c4130ea78471 182 if (buf[0] == 0xBB && buf[1] == 0xA0 && buf[2] == 40) {
Gustavo_Eduardo338 8:c4130ea78471 183 resp_analog_out_6 = buf[3]; // Hace que ya no se vuelva a enviar este tipo de configuracion
Gustavo_Eduardo338 8:c4130ea78471 184 }
Gustavo_Eduardo338 8:c4130ea78471 185 // Actuador la Bomba
Gustavo_Eduardo338 8:c4130ea78471 186 if (buf[0] == 0xBB && buf[1] == 0xD0 && buf[2] == 80) {
Gustavo_Eduardo338 8:c4130ea78471 187 resp_digital_out_4 = buf[3]; // Hace que ya no se vuelva a enviar este tipo de configuracion
Gustavo_Eduardo338 9:501a9e6710d2 188
Gustavo_Eduardo338 8:c4130ea78471 189 }
Gustavo_Eduardo338 8:c4130ea78471 190 // Actuador Foco
Gustavo_Eduardo338 8:c4130ea78471 191 if (buf[0] == 0xBB && buf[1] == 0xD0 && buf[2] == 10) {
Gustavo_Eduardo338 8:c4130ea78471 192 resp_digital_out_7 = buf[3];
Gustavo_Eduardo338 8:c4130ea78471 193 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 194
Gustavo_Eduardo338 7:fb4c6c1dd3a9 195 // Verifico si es una trama de Escitura.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 196 if(buf[0] == 0xEE) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 197 // Verifico si es un signal Digital Out
Gustavo_Eduardo338 7:fb4c6c1dd3a9 198 if(buf[2] == 0xD0) {
Gustavo_Eduardo338 9:501a9e6710d2 199 if(buf[3] == 0x07) {
Gustavo_Eduardo338 9:501a9e6710d2 200 if (buf[4] == 0x01) {
Gustavo_Eduardo338 9:501a9e6710d2 201 LED_SET_D7 = 1;
Gustavo_Eduardo338 9:501a9e6710d2 202 } else {
Gustavo_Eduardo338 9:501a9e6710d2 203 LED_SET_D7 = 0;
Gustavo_Eduardo338 9:501a9e6710d2 204 }
Gustavo_Eduardo338 8:c4130ea78471 205 resp_digital_out_7 = buf[1]; // Paquete id
Gustavo_Eduardo338 7:fb4c6c1dd3a9 206 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 207
Gustavo_Eduardo338 9:501a9e6710d2 208 if(buf[3] == 0x04 ) {
Gustavo_Eduardo338 9:501a9e6710d2 209 if (buf[4] == 0x01) {
Gustavo_Eduardo338 9:501a9e6710d2 210 LED_SET_D4 = 1;
Gustavo_Eduardo338 9:501a9e6710d2 211 analog_enabled = 1;
Gustavo_Eduardo338 9:501a9e6710d2 212 } else {
Gustavo_Eduardo338 9:501a9e6710d2 213 LED_SET_D4 = 0;
Gustavo_Eduardo338 9:501a9e6710d2 214 analog_enabled = 0;
Gustavo_Eduardo338 9:501a9e6710d2 215 }
Gustavo_Eduardo338 8:c4130ea78471 216 resp_digital_out_4 = buf[1]; // Paquete id
Gustavo_Eduardo338 7:fb4c6c1dd3a9 217 }
Gustavo_Eduardo338 9:501a9e6710d2 218 // Verifico si es un signal Analog out
Gustavo_Eduardo338 7:fb4c6c1dd3a9 219 } else if(buf[2] == 0xA0) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 220 if(buf[3] == 0x06) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 221 float value = (float)buf[4]/255;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 222 PWM = value;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 223 pc.printf("PWM = %f \r\n", value);
Gustavo_Eduardo338 8:c4130ea78471 224 resp_analog_out_6 = buf[1]; // Paquete id
Gustavo_Eduardo338 7:fb4c6c1dd3a9 225 }
dixysleo 0:58e350255405 226 }
Gustavo_Eduardo338 9:501a9e6710d2 227
Gustavo_Eduardo338 4:a43cbe8aed6a 228 } else if(buf[0] == 0xA0) {
Gustavo_Eduardo338 4:a43cbe8aed6a 229 if(buf[1] == 0x01) {
dixysleo 0:58e350255405 230 analog_enabled = 1;
dixysleo 0:58e350255405 231 //por dixys
dixysleo 0:58e350255405 232 pc.printf("ANALOG ENABLE \r\n");
Gustavo_Eduardo338 4:a43cbe8aed6a 233 } else {
Gustavo_Eduardo338 5:a8c07a29df8a 234 analog_enabled = 0;
dixysleo 0:58e350255405 235 // lo vamos a poner fio enable para hacer pruebas luego lo quitamos
dixysleo 0:58e350255405 236 //por dixys
dixysleo 0:58e350255405 237 pc.printf("ANALOG DISAABLE \r\n");
Gustavo_Eduardo338 5:a8c07a29df8a 238 pc.printf("valor : %d", analog_enabled);
Gustavo_Eduardo338 9:501a9e6710d2 239 }
Gustavo_Eduardo338 4:a43cbe8aed6a 240 } else if(buf[0] == 0x02) {
dixysleo 0:58e350255405 241 float value = (float)buf[1]/255;
dixysleo 0:58e350255405 242 PWM = value;
dixysleo 0:58e350255405 243 //por dixys
dixysleo 0:58e350255405 244 pc.printf("PWM = %f \r\n", value);
Gustavo_Eduardo338 4:a43cbe8aed6a 245 } else if(buf[0] == 0x03) {
barcejorge 3:53cd39af0b12 246 //MYSERVO.write(buf[1]);
dixysleo 0:58e350255405 247 //por dixys
dixysleo 0:58e350255405 248 pc.printf("SERVO buffer \r\n");
Gustavo_Eduardo338 4:a43cbe8aed6a 249 } else if(buf[0] == 0x04) {
dixysleo 0:58e350255405 250 analog_enabled = 0;
dixysleo 0:58e350255405 251 PWM = 0;
barcejorge 3:53cd39af0b12 252 //MYSERVO.write(0);
Gustavo_Eduardo338 5:a8c07a29df8a 253 LED_SET_D7 = 0;
Gustavo_Eduardo338 4:a43cbe8aed6a 254 old_state = 0;
dixysleo 0:58e350255405 255 //por dixys
dixysleo 0:58e350255405 256 pc.printf("opcion 4 \r\n");
dixysleo 0:58e350255405 257 }
dixysleo 0:58e350255405 258 }
dixysleo 0:58e350255405 259 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 260
dixysleo 0:58e350255405 261 /*
Gustavo_Eduardo338 7:fb4c6c1dd3a9 262 * Desde este metodo envia las tramas al Gateway.
dixysleo 0:58e350255405 263 */
dixysleo 0:58e350255405 264 void m_status_check_handle(void)
Gustavo_Eduardo338 4:a43cbe8aed6a 265 {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 266 uint8_t tiempo_entre_envio_conf = 200;
Gustavo_Eduardo338 9:501a9e6710d2 267 uint8_t buf[6], conf_02[5];
Gustavo_Eduardo338 7:fb4c6c1dd3a9 268 conf_02[0] = (0xC02); // Codigo que indica que la configuracion sera por cada Pin.
Gustavo_Eduardo338 5:a8c07a29df8a 269
Gustavo_Eduardo338 4:a43cbe8aed6a 270 if (analog_enabled) { // if analog reading enabled
dixysleo 0:58e350255405 271 // Read and send out
dixysleo 0:58e350255405 272 float s = ANALOG;
Gustavo_Eduardo338 4:a43cbe8aed6a 273 uint16_t value = s*1024;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 274 buf[0] = (0xDD); // Codigo
Gustavo_Eduardo338 7:fb4c6c1dd3a9 275 buf[1] = (0x00); // paquete id
Gustavo_Eduardo338 7:fb4c6c1dd3a9 276 buf[2] = (0xA1); // A1| A0| D1| D0
Gustavo_Eduardo338 7:fb4c6c1dd3a9 277 buf[3] = (20); // Posicion
Gustavo_Eduardo338 9:501a9e6710d2 278 buf[4] = (value >> 8); // Valor
Gustavo_Eduardo338 9:501a9e6710d2 279 buf[5] = (value); // Valor
Gustavo_Eduardo338 9:501a9e6710d2 280
Gustavo_Eduardo338 9:501a9e6710d2 281 //pc.printf("buf[4]: %d\r\n", buf[4]);
Gustavo_Eduardo338 9:501a9e6710d2 282 //pc.printf("buf[5]: %d\r\n", buf[5]);
Gustavo_Eduardo338 9:501a9e6710d2 283
Gustavo_Eduardo338 9:501a9e6710d2 284 //pc.printf("value pt 1000: %d\r\n", value); // Imprimo en terminal lo que esta enviando desde el mote.
Gustavo_Eduardo338 5:a8c07a29df8a 285
Gustavo_Eduardo338 9:501a9e6710d2 286 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 6); // Para el RTD
dixysleo 0:58e350255405 287 }
Gustavo_Eduardo338 4:a43cbe8aed6a 288
dixysleo 0:58e350255405 289 // If digital in changes, report the state
Gustavo_Eduardo338 4:a43cbe8aed6a 290 if (BUTTON != old_state) {
dixysleo 0:58e350255405 291 old_state = BUTTON;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 292 buf[0] = (0xDD); // Codigo de Lecturas de Datos.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 293 buf[1] = (0x00); // Paquete
Gustavo_Eduardo338 7:fb4c6c1dd3a9 294 buf[2] = (0xD1); // A1| A0| D1| D0
Gustavo_Eduardo338 9:501a9e6710d2 295 buf[3] = (10); // Posicion
Gustavo_Eduardo338 9:501a9e6710d2 296
Gustavo_Eduardo338 9:501a9e6710d2 297 if (BUTTON == 1) { // Estado natural (no pulsado)
Gustavo_Eduardo338 9:501a9e6710d2 298 pc.printf("BUTTON == 0\r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 299 LED_SET_D7 = 0;
Gustavo_Eduardo338 9:501a9e6710d2 300 buf[4] = 0; // Apagado
Gustavo_Eduardo338 9:501a9e6710d2 301 } else { // Pulsado
Gustavo_Eduardo338 9:501a9e6710d2 302 pc.printf("BUTTON == 1 \r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 303 LED_SET_D7 = 1;
Gustavo_Eduardo338 9:501a9e6710d2 304 buf[4] = 1; // Encendido
dixysleo 0:58e350255405 305 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 306 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 5);
dixysleo 0:58e350255405 307 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 308
Gustavo_Eduardo338 7:fb4c6c1dd3a9 309 //pc.printf("enviar_config %d \r\n", enviar_config_01);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 310 if (enviar_config_01 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 311 // Envia la configuracion Genaral del Mote.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 312 pc.printf("enviar_config_01 %d \r\n", enviar_config_01);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 313 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), di_conf, 9);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 314 }
Gustavo_Eduardo338 9:501a9e6710d2 315
Gustavo_Eduardo338 7:fb4c6c1dd3a9 316 // Envia la configuracion del PT 1000.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 317 if (sen_analog_in_5 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 318 conf_02[1] = (0x05); // Categoria puede ser: A (Actuador) | 5 (Sensor)
Gustavo_Eduardo338 7:fb4c6c1dd3a9 319 conf_02[2] = (0xAA); // Tipo de Signal AA | DD
Gustavo_Eduardo338 8:c4130ea78471 320 conf_02[3] = (37); // Codigo del Ted
Gustavo_Eduardo338 7:fb4c6c1dd3a9 321 conf_02[4] = (20); // Posicion que ocupa en el mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 322
Gustavo_Eduardo338 7:fb4c6c1dd3a9 323 pc.printf("Configuracion Detallada por Pin PT1000\r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 324 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), conf_02, 5);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 325 }
Gustavo_Eduardo338 9:501a9e6710d2 326
Gustavo_Eduardo338 7:fb4c6c1dd3a9 327 // Envia la configuracion del sensor de luz.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 328 if (sen_digital_in_7 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 329 conf_02[1] = (0x05); // Categoria puede ser: A (Actuador) | 5 (Sensor)
Gustavo_Eduardo338 7:fb4c6c1dd3a9 330 conf_02[2] = (0xDD); // Tipo de Signal AA | DD
Gustavo_Eduardo338 8:c4130ea78471 331 conf_02[3] = (30); // Codigo del Ted
Gustavo_Eduardo338 7:fb4c6c1dd3a9 332 conf_02[4] = (10); // Posicion que ocupa en el mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 333
Gustavo_Eduardo338 7:fb4c6c1dd3a9 334 pc.printf("Configuracion Detallada por sensor de luz\r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 335 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), conf_02, 5);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 336 }
Gustavo_Eduardo338 9:501a9e6710d2 337
Gustavo_Eduardo338 8:c4130ea78471 338 // Envia la configuracion del PWD.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 339 if (act_analog_out_6 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 340 conf_02[1] = (0xA); // Categoria puede ser: A (Actuador) | 5 (Sensor)
Gustavo_Eduardo338 7:fb4c6c1dd3a9 341 conf_02[2] = (0xAA); // Tipo de Signal AA | DD
Gustavo_Eduardo338 7:fb4c6c1dd3a9 342 conf_02[3] = (0); // Codigo del Ted
Gustavo_Eduardo338 7:fb4c6c1dd3a9 343 conf_02[4] = (40); // Posicion que ocupa en el mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 344
Gustavo_Eduardo338 7:fb4c6c1dd3a9 345 pc.printf("Configuracion Detallada por PWD\r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 346 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), conf_02, 5);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 347 }
Gustavo_Eduardo338 9:501a9e6710d2 348
Gustavo_Eduardo338 8:c4130ea78471 349 // Envia la configuracion del Actuador la Bomba.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 350 if (act_analog_out_4 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 351 conf_02[1] = (0xA); // Categoria puede ser: A (Actuador) | 5 (Sensor)
Gustavo_Eduardo338 8:c4130ea78471 352 conf_02[2] = (0x0A); // Tipo de Signal AA | DD
Gustavo_Eduardo338 8:c4130ea78471 353 conf_02[3] = (0); // Codigo del Ted
Gustavo_Eduardo338 8:c4130ea78471 354 conf_02[4] = (80); // Posicion que ocupa en el mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 355
Gustavo_Eduardo338 7:fb4c6c1dd3a9 356 pc.printf("Configuracion Detallada por Actuador la Bomba \r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 357 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), conf_02, 5);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 358 }
Gustavo_Eduardo338 9:501a9e6710d2 359
Gustavo_Eduardo338 8:c4130ea78471 360 // Envia la configuracion del Actuador Foco.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 361 if (act_analog_out_7 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 362 conf_02[1] = (0xA); // Categoria puede ser: A (Actuador) | 5 (Sensor)
Gustavo_Eduardo338 7:fb4c6c1dd3a9 363 conf_02[2] = (0x0A); // Tipo de Signal AA | DD
Gustavo_Eduardo338 7:fb4c6c1dd3a9 364 conf_02[3] = (0); // Codigo del Ted
Gustavo_Eduardo338 7:fb4c6c1dd3a9 365 conf_02[4] = (10); // Posicion que ocupa en el mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 366
Gustavo_Eduardo338 7:fb4c6c1dd3a9 367 pc.printf("Configuracion Detallada por Actuador Foco \r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 368 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), conf_02, 5);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 369 }
Gustavo_Eduardo338 9:501a9e6710d2 370
Gustavo_Eduardo338 8:c4130ea78471 371 // Envia las tramas de confirmacion hacia el gateway.
Gustavo_Eduardo338 9:501a9e6710d2 372 if (resp_analog_out_6 != 0) {
Gustavo_Eduardo338 8:c4130ea78471 373 // Envia trama de lectura
Gustavo_Eduardo338 8:c4130ea78471 374 buf[0] = (0xDD); // Codigo
Gustavo_Eduardo338 8:c4130ea78471 375 buf[1] = resp_analog_out_6; // paquete id
Gustavo_Eduardo338 8:c4130ea78471 376 buf[2] = (0xA0); // A1| A0| D1| D0
Gustavo_Eduardo338 8:c4130ea78471 377 buf[3] = (40); // Posicion
Gustavo_Eduardo338 8:c4130ea78471 378 buf[4] = PWM; // Valor
Gustavo_Eduardo338 8:c4130ea78471 379 pc.printf("resp_analog_out_6 %d\r\n", resp_analog_out_6); // Imprimo en terminal lo que esta enviando desde el mote.
Gustavo_Eduardo338 8:c4130ea78471 380
Gustavo_Eduardo338 8:c4130ea78471 381 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 5); // Para el RTD
Gustavo_Eduardo338 8:c4130ea78471 382 }
Gustavo_Eduardo338 9:501a9e6710d2 383
Gustavo_Eduardo338 9:501a9e6710d2 384 if (resp_digital_out_4 != 0) {
Gustavo_Eduardo338 8:c4130ea78471 385 // Envia trama de lectura
Gustavo_Eduardo338 8:c4130ea78471 386 buf[0] = (0xDD); // Codigo
Gustavo_Eduardo338 8:c4130ea78471 387 buf[1] = resp_digital_out_4; // paquete id
Gustavo_Eduardo338 8:c4130ea78471 388 buf[2] = (0xD0); // A1| A0| D1| D0
Gustavo_Eduardo338 8:c4130ea78471 389 buf[3] = (80); // Posicion
Gustavo_Eduardo338 8:c4130ea78471 390 buf[4] = LED_SET_D4; // Valor
Gustavo_Eduardo338 8:c4130ea78471 391 pc.printf("resp_digital_out_4 %d\r\n", resp_digital_out_4); // Imprimo en terminal lo que esta enviando desde el mote.
Gustavo_Eduardo338 8:c4130ea78471 392
Gustavo_Eduardo338 8:c4130ea78471 393 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 5); // Para el RTD
Gustavo_Eduardo338 8:c4130ea78471 394 }
Gustavo_Eduardo338 9:501a9e6710d2 395
Gustavo_Eduardo338 9:501a9e6710d2 396 if (resp_digital_out_7 != 0) {
Gustavo_Eduardo338 8:c4130ea78471 397 // Envia trama de lectura
Gustavo_Eduardo338 8:c4130ea78471 398 buf[0] = (0xDD); // Codigo
Gustavo_Eduardo338 8:c4130ea78471 399 buf[1] = resp_digital_out_7; // paquete id
Gustavo_Eduardo338 8:c4130ea78471 400 buf[2] = (0xD0); // A1| A0| D1| D0
Gustavo_Eduardo338 8:c4130ea78471 401 buf[3] = (10); // Posicion
Gustavo_Eduardo338 8:c4130ea78471 402 buf[4] = LED_SET_D7; // Valor
Gustavo_Eduardo338 8:c4130ea78471 403 pc.printf("resp_digital_out_7 %d\r\n", resp_digital_out_7); // Imprimo en terminal lo que esta enviando desde el mote.
Gustavo_Eduardo338 8:c4130ea78471 404
Gustavo_Eduardo338 8:c4130ea78471 405 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 5); // Para el RTD
Gustavo_Eduardo338 8:c4130ea78471 406 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 407
Gustavo_Eduardo338 7:fb4c6c1dd3a9 408 wait_ms(100);
dixysleo 0:58e350255405 409 }
dixysleo 0:58e350255405 410
dixysleo 0:58e350255405 411 int main(void)
Gustavo_Eduardo338 4:a43cbe8aed6a 412 {
dixysleo 0:58e350255405 413 Ticker ticker;
dixysleo 0:58e350255405 414 ticker.attach_us(m_status_check_handle, 200000);
Gustavo_Eduardo338 4:a43cbe8aed6a 415
dixysleo 0:58e350255405 416 ble.init();
dixysleo 0:58e350255405 417 ble.onDisconnection(disconnectionCallback);
Gustavo_Eduardo338 5:a8c07a29df8a 418 ble.onConnection(connectionCallback);
Gustavo_Eduardo338 4:a43cbe8aed6a 419 ble.onDataWritten(WrittenHandler);
Gustavo_Eduardo338 4:a43cbe8aed6a 420
dixysleo 0:58e350255405 421 pc.baud(9600);
dixysleo 0:58e350255405 422 pc.printf("SimpleChat Init \r\n");
dixysleo 0:58e350255405 423 //pc.attach( uartCB , pc.RxIrq);
Gustavo_Eduardo338 4:a43cbe8aed6a 424
Gustavo_Eduardo338 4:a43cbe8aed6a 425 // setup advertising
dixysleo 0:58e350255405 426 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
dixysleo 0:58e350255405 427 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
dixysleo 0:58e350255405 428 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
Gustavo_Eduardo338 4:a43cbe8aed6a 429 (const uint8_t *)"Biscuit", sizeof("Biscuit") - 1); // Original: Biscuit
dixysleo 0:58e350255405 430 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
Gustavo_Eduardo338 4:a43cbe8aed6a 431 (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid));
Gustavo_Eduardo338 4:a43cbe8aed6a 432 // 100ms; in multiples of 0.625ms.
dixysleo 0:58e350255405 433 ble.setAdvertisingInterval(160);
dixysleo 0:58e350255405 434
dixysleo 0:58e350255405 435 ble.addService(uartService);
Gustavo_Eduardo338 4:a43cbe8aed6a 436
Gustavo_Eduardo338 4:a43cbe8aed6a 437 ble.startAdvertising();
Gustavo_Eduardo338 4:a43cbe8aed6a 438
dixysleo 0:58e350255405 439 pc.printf("Advertising Start \r\n");
Gustavo_Eduardo338 4:a43cbe8aed6a 440
dixysleo 0:58e350255405 441 //por dixys
dixysleo 0:58e350255405 442 // para probar, luego quitar. Esto hace que cada ticker se envie un dato analogico via BLE
Gustavo_Eduardo338 5:a8c07a29df8a 443 analog_enabled = 0;
Gustavo_Eduardo338 4:a43cbe8aed6a 444
Gustavo_Eduardo338 4:a43cbe8aed6a 445 while(1) {
Gustavo_Eduardo338 4:a43cbe8aed6a 446 ble.waitForEvent();
dixysleo 0:58e350255405 447 }
Gustavo_Eduardo338 4:a43cbe8aed6a 448 }