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:
Wed Aug 17 22:54:54 2016 +0000
Revision:
8:c4130ea78471
Parent:
7:fb4c6c1dd3a9
Child:
9:501a9e6710d2
Initial Commit.

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 7:fb4c6c1dd3a9 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 7:fb4c6c1dd3a9 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 4:a43cbe8aed6a 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 7:fb4c6c1dd3a9 141 pc.printf("Leemos la trama: \r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 142 for(index=0; index<bytesRead; index++) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 143 pc.printf("buf[%02x]: %02x\r\n", index, buf[index]);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 144
Gustavo_Eduardo338 7:fb4c6c1dd3a9 145 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 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 7:fb4c6c1dd3a9 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 7:fb4c6c1dd3a9 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 8:c4130ea78471 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 8:c4130ea78471 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 7:fb4c6c1dd3a9 199 if(buf[3] == 0x07 && buf[4] == 0x01) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 200 LED_SET_D7 = 1;
Gustavo_Eduardo338 8:c4130ea78471 201 resp_digital_out_7 = buf[1]; // Paquete id
Gustavo_Eduardo338 7:fb4c6c1dd3a9 202 } else {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 203 LED_SET_D7 = 0;
Gustavo_Eduardo338 8:c4130ea78471 204 resp_digital_out_7 = buf[1]; // Paquete id
Gustavo_Eduardo338 7:fb4c6c1dd3a9 205 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 206
Gustavo_Eduardo338 7:fb4c6c1dd3a9 207 if(buf[3] == 0x04 && buf[4] == 0x01) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 208 LED_SET_D4 = 1;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 209 analog_enabled = 1;
Gustavo_Eduardo338 8:c4130ea78471 210 resp_digital_out_4 = buf[1]; // Paquete id
Gustavo_Eduardo338 7:fb4c6c1dd3a9 211 } else {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 212 LED_SET_D4 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 213 analog_enabled = 0;
Gustavo_Eduardo338 8:c4130ea78471 214 resp_digital_out_4 = buf[1]; // Paquete id
Gustavo_Eduardo338 7:fb4c6c1dd3a9 215 }
Gustavo_Eduardo338 8:c4130ea78471 216 // Verifico si es un signal Analog out
Gustavo_Eduardo338 7:fb4c6c1dd3a9 217 } else if(buf[2] == 0xA0) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 218 if(buf[3] == 0x06) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 219 float value = (float)buf[4]/255;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 220 PWM = value;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 221 pc.printf("PWM = %f \r\n", value);
Gustavo_Eduardo338 8:c4130ea78471 222 resp_analog_out_6 = buf[1]; // Paquete id
Gustavo_Eduardo338 7:fb4c6c1dd3a9 223 }
dixysleo 0:58e350255405 224 }
Gustavo_Eduardo338 8:c4130ea78471 225
Gustavo_Eduardo338 4:a43cbe8aed6a 226 } else if(buf[0] == 0xA0) {
Gustavo_Eduardo338 4:a43cbe8aed6a 227 if(buf[1] == 0x01) {
dixysleo 0:58e350255405 228 analog_enabled = 1;
dixysleo 0:58e350255405 229 //por dixys
dixysleo 0:58e350255405 230 pc.printf("ANALOG ENABLE \r\n");
Gustavo_Eduardo338 4:a43cbe8aed6a 231 } else {
Gustavo_Eduardo338 5:a8c07a29df8a 232 analog_enabled = 0;
dixysleo 0:58e350255405 233 // lo vamos a poner fio enable para hacer pruebas luego lo quitamos
dixysleo 0:58e350255405 234 //por dixys
dixysleo 0:58e350255405 235 pc.printf("ANALOG DISAABLE \r\n");
Gustavo_Eduardo338 5:a8c07a29df8a 236 pc.printf("valor : %d", analog_enabled);
dixysleo 0:58e350255405 237 }
Gustavo_Eduardo338 4:a43cbe8aed6a 238 } else if(buf[0] == 0x02) {
dixysleo 0:58e350255405 239 float value = (float)buf[1]/255;
dixysleo 0:58e350255405 240 PWM = value;
dixysleo 0:58e350255405 241 //por dixys
dixysleo 0:58e350255405 242 pc.printf("PWM = %f \r\n", value);
Gustavo_Eduardo338 4:a43cbe8aed6a 243 } else if(buf[0] == 0x03) {
barcejorge 3:53cd39af0b12 244 //MYSERVO.write(buf[1]);
dixysleo 0:58e350255405 245 //por dixys
dixysleo 0:58e350255405 246 pc.printf("SERVO buffer \r\n");
Gustavo_Eduardo338 4:a43cbe8aed6a 247 } else if(buf[0] == 0x04) {
dixysleo 0:58e350255405 248 analog_enabled = 0;
dixysleo 0:58e350255405 249 PWM = 0;
barcejorge 3:53cd39af0b12 250 //MYSERVO.write(0);
Gustavo_Eduardo338 5:a8c07a29df8a 251 LED_SET_D7 = 0;
Gustavo_Eduardo338 4:a43cbe8aed6a 252 old_state = 0;
dixysleo 0:58e350255405 253 //por dixys
dixysleo 0:58e350255405 254 pc.printf("opcion 4 \r\n");
dixysleo 0:58e350255405 255 }
dixysleo 0:58e350255405 256 }
dixysleo 0:58e350255405 257 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 258
dixysleo 0:58e350255405 259 /*
Gustavo_Eduardo338 7:fb4c6c1dd3a9 260 * Desde este metodo envia las tramas al Gateway.
dixysleo 0:58e350255405 261 */
dixysleo 0:58e350255405 262 void m_status_check_handle(void)
Gustavo_Eduardo338 4:a43cbe8aed6a 263 {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 264 uint8_t tiempo_entre_envio_conf = 200;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 265 uint8_t buf[5], conf_02[5];
Gustavo_Eduardo338 7:fb4c6c1dd3a9 266 conf_02[0] = (0xC02); // Codigo que indica que la configuracion sera por cada Pin.
Gustavo_Eduardo338 5:a8c07a29df8a 267
Gustavo_Eduardo338 4:a43cbe8aed6a 268 if (analog_enabled) { // if analog reading enabled
Gustavo_Eduardo338 7:fb4c6c1dd3a9 269 pc.printf("analog_enabled: %d\r\n", analog_enabled);
dixysleo 0:58e350255405 270 // Read and send out
dixysleo 0:58e350255405 271 float s = ANALOG;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 272 pc.printf("value pt 1000 (s): %d\r\n", s);
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 7:fb4c6c1dd3a9 278 buf[4] = (value); // Valor
Gustavo_Eduardo338 7:fb4c6c1dd3a9 279 pc.printf("value pt 1000: %d\r\n", value); // Imprimo en terminal lo que esta enviando desde el mote.
Gustavo_Eduardo338 5:a8c07a29df8a 280
Gustavo_Eduardo338 7:fb4c6c1dd3a9 281 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 5); // Para el RTD
dixysleo 0:58e350255405 282 }
Gustavo_Eduardo338 4:a43cbe8aed6a 283
dixysleo 0:58e350255405 284 // If digital in changes, report the state
Gustavo_Eduardo338 4:a43cbe8aed6a 285 if (BUTTON != old_state) {
dixysleo 0:58e350255405 286 old_state = BUTTON;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 287 buf[0] = (0xDD); // Codigo de Lecturas de Datos.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 288 buf[1] = (0x00); // Paquete
Gustavo_Eduardo338 7:fb4c6c1dd3a9 289 buf[2] = (0xD1); // A1| A0| D1| D0
Gustavo_Eduardo338 8:c4130ea78471 290 buf[3] = (10); // Posicion
Gustavo_Eduardo338 4:a43cbe8aed6a 291 if (BUTTON == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 292 pc.printf("BUTTON == 1\r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 293 LED_SET_D7 = 0;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 294 buf[4] = (0x00); // Valor
Gustavo_Eduardo338 4:a43cbe8aed6a 295 } else {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 296 pc.printf("else BUTTON == 1 \r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 297 LED_SET_D7 = 1;
Gustavo_Eduardo338 7:fb4c6c1dd3a9 298 buf[4] = (0x01); // Valor
dixysleo 0:58e350255405 299 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 300 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 5);
dixysleo 0:58e350255405 301 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 302
Gustavo_Eduardo338 7:fb4c6c1dd3a9 303 //pc.printf("enviar_config %d \r\n", enviar_config_01);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 304 if (enviar_config_01 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 305 // Envia la configuracion Genaral del Mote.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 306 pc.printf("enviar_config_01 %d \r\n", enviar_config_01);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 307 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), di_conf, 9);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 308 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 309
Gustavo_Eduardo338 7:fb4c6c1dd3a9 310 // Envia la configuracion del PT 1000.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 311 if (sen_analog_in_5 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 312 conf_02[1] = (0x05); // Categoria puede ser: A (Actuador) | 5 (Sensor)
Gustavo_Eduardo338 7:fb4c6c1dd3a9 313 conf_02[2] = (0xAA); // Tipo de Signal AA | DD
Gustavo_Eduardo338 8:c4130ea78471 314 conf_02[3] = (37); // Codigo del Ted
Gustavo_Eduardo338 7:fb4c6c1dd3a9 315 conf_02[4] = (20); // Posicion que ocupa en el mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 316
Gustavo_Eduardo338 7:fb4c6c1dd3a9 317 pc.printf("Configuracion Detallada por Pin PT1000\r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 318 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), conf_02, 5);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 319 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 320
Gustavo_Eduardo338 7:fb4c6c1dd3a9 321 // Envia la configuracion del sensor de luz.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 322 if (sen_digital_in_7 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 323 conf_02[1] = (0x05); // Categoria puede ser: A (Actuador) | 5 (Sensor)
Gustavo_Eduardo338 7:fb4c6c1dd3a9 324 conf_02[2] = (0xDD); // Tipo de Signal AA | DD
Gustavo_Eduardo338 8:c4130ea78471 325 conf_02[3] = (30); // Codigo del Ted
Gustavo_Eduardo338 7:fb4c6c1dd3a9 326 conf_02[4] = (10); // Posicion que ocupa en el mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 327
Gustavo_Eduardo338 7:fb4c6c1dd3a9 328 pc.printf("Configuracion Detallada por sensor de luz\r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 329 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), conf_02, 5);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 330 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 331
Gustavo_Eduardo338 8:c4130ea78471 332 // Envia la configuracion del PWD.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 333 if (act_analog_out_6 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 334 conf_02[1] = (0xA); // Categoria puede ser: A (Actuador) | 5 (Sensor)
Gustavo_Eduardo338 7:fb4c6c1dd3a9 335 conf_02[2] = (0xAA); // Tipo de Signal AA | DD
Gustavo_Eduardo338 7:fb4c6c1dd3a9 336 conf_02[3] = (0); // Codigo del Ted
Gustavo_Eduardo338 7:fb4c6c1dd3a9 337 conf_02[4] = (40); // Posicion que ocupa en el mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 338
Gustavo_Eduardo338 7:fb4c6c1dd3a9 339 pc.printf("Configuracion Detallada por PWD\r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 340 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), conf_02, 5);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 341 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 342
Gustavo_Eduardo338 8:c4130ea78471 343 // Envia la configuracion del Actuador la Bomba.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 344 if (act_analog_out_4 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 345 conf_02[1] = (0xA); // Categoria puede ser: A (Actuador) | 5 (Sensor)
Gustavo_Eduardo338 8:c4130ea78471 346 conf_02[2] = (0x0A); // Tipo de Signal AA | DD
Gustavo_Eduardo338 8:c4130ea78471 347 conf_02[3] = (0); // Codigo del Ted
Gustavo_Eduardo338 8:c4130ea78471 348 conf_02[4] = (80); // Posicion que ocupa en el mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 349
Gustavo_Eduardo338 7:fb4c6c1dd3a9 350 pc.printf("Configuracion Detallada por Actuador la Bomba \r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 351 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), conf_02, 5);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 352 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 353
Gustavo_Eduardo338 8:c4130ea78471 354 // Envia la configuracion del Actuador Foco.
Gustavo_Eduardo338 7:fb4c6c1dd3a9 355 if (act_analog_out_7 == 1) {
Gustavo_Eduardo338 7:fb4c6c1dd3a9 356 conf_02[1] = (0xA); // Categoria puede ser: A (Actuador) | 5 (Sensor)
Gustavo_Eduardo338 7:fb4c6c1dd3a9 357 conf_02[2] = (0x0A); // Tipo de Signal AA | DD
Gustavo_Eduardo338 7:fb4c6c1dd3a9 358 conf_02[3] = (0); // Codigo del Ted
Gustavo_Eduardo338 7:fb4c6c1dd3a9 359 conf_02[4] = (10); // Posicion que ocupa en el mote
Gustavo_Eduardo338 7:fb4c6c1dd3a9 360
Gustavo_Eduardo338 7:fb4c6c1dd3a9 361 pc.printf("Configuracion Detallada por Actuador Foco \r\n");
Gustavo_Eduardo338 7:fb4c6c1dd3a9 362 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), conf_02, 5);
Gustavo_Eduardo338 7:fb4c6c1dd3a9 363 }
Gustavo_Eduardo338 8:c4130ea78471 364
Gustavo_Eduardo338 8:c4130ea78471 365 // Envia las tramas de confirmacion hacia el gateway.
Gustavo_Eduardo338 8:c4130ea78471 366 if (resp_analog_out_6 != 0){
Gustavo_Eduardo338 8:c4130ea78471 367 // Envia trama de lectura
Gustavo_Eduardo338 8:c4130ea78471 368 buf[0] = (0xDD); // Codigo
Gustavo_Eduardo338 8:c4130ea78471 369 buf[1] = resp_analog_out_6; // paquete id
Gustavo_Eduardo338 8:c4130ea78471 370 buf[2] = (0xA0); // A1| A0| D1| D0
Gustavo_Eduardo338 8:c4130ea78471 371 buf[3] = (40); // Posicion
Gustavo_Eduardo338 8:c4130ea78471 372 buf[4] = PWM; // Valor
Gustavo_Eduardo338 8:c4130ea78471 373 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 374
Gustavo_Eduardo338 8:c4130ea78471 375 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 5); // Para el RTD
Gustavo_Eduardo338 8:c4130ea78471 376 }
Gustavo_Eduardo338 8:c4130ea78471 377
Gustavo_Eduardo338 8:c4130ea78471 378 if (resp_digital_out_4 != 0){
Gustavo_Eduardo338 8:c4130ea78471 379 // Envia trama de lectura
Gustavo_Eduardo338 8:c4130ea78471 380 buf[0] = (0xDD); // Codigo
Gustavo_Eduardo338 8:c4130ea78471 381 buf[1] = resp_digital_out_4; // paquete id
Gustavo_Eduardo338 8:c4130ea78471 382 buf[2] = (0xD0); // A1| A0| D1| D0
Gustavo_Eduardo338 8:c4130ea78471 383 buf[3] = (80); // Posicion
Gustavo_Eduardo338 8:c4130ea78471 384 buf[4] = LED_SET_D4; // Valor
Gustavo_Eduardo338 8:c4130ea78471 385 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 386
Gustavo_Eduardo338 8:c4130ea78471 387 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 5); // Para el RTD
Gustavo_Eduardo338 8:c4130ea78471 388 }
Gustavo_Eduardo338 8:c4130ea78471 389
Gustavo_Eduardo338 8:c4130ea78471 390 if (resp_digital_out_7 != 0){
Gustavo_Eduardo338 8:c4130ea78471 391 // Envia trama de lectura
Gustavo_Eduardo338 8:c4130ea78471 392 buf[0] = (0xDD); // Codigo
Gustavo_Eduardo338 8:c4130ea78471 393 buf[1] = resp_digital_out_7; // paquete id
Gustavo_Eduardo338 8:c4130ea78471 394 buf[2] = (0xD0); // A1| A0| D1| D0
Gustavo_Eduardo338 8:c4130ea78471 395 buf[3] = (10); // Posicion
Gustavo_Eduardo338 8:c4130ea78471 396 buf[4] = LED_SET_D7; // Valor
Gustavo_Eduardo338 8:c4130ea78471 397 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 398
Gustavo_Eduardo338 8:c4130ea78471 399 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 5); // Para el RTD
Gustavo_Eduardo338 8:c4130ea78471 400 }
Gustavo_Eduardo338 7:fb4c6c1dd3a9 401
Gustavo_Eduardo338 7:fb4c6c1dd3a9 402 wait_ms(100);
dixysleo 0:58e350255405 403 }
dixysleo 0:58e350255405 404
dixysleo 0:58e350255405 405 int main(void)
Gustavo_Eduardo338 4:a43cbe8aed6a 406 {
dixysleo 0:58e350255405 407 Ticker ticker;
dixysleo 0:58e350255405 408 ticker.attach_us(m_status_check_handle, 200000);
Gustavo_Eduardo338 4:a43cbe8aed6a 409
dixysleo 0:58e350255405 410 ble.init();
dixysleo 0:58e350255405 411 ble.onDisconnection(disconnectionCallback);
Gustavo_Eduardo338 5:a8c07a29df8a 412 ble.onConnection(connectionCallback);
Gustavo_Eduardo338 4:a43cbe8aed6a 413 ble.onDataWritten(WrittenHandler);
Gustavo_Eduardo338 4:a43cbe8aed6a 414
dixysleo 0:58e350255405 415 pc.baud(9600);
dixysleo 0:58e350255405 416 pc.printf("SimpleChat Init \r\n");
dixysleo 0:58e350255405 417 //pc.attach( uartCB , pc.RxIrq);
Gustavo_Eduardo338 4:a43cbe8aed6a 418
Gustavo_Eduardo338 4:a43cbe8aed6a 419 // setup advertising
dixysleo 0:58e350255405 420 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
dixysleo 0:58e350255405 421 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
dixysleo 0:58e350255405 422 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
Gustavo_Eduardo338 4:a43cbe8aed6a 423 (const uint8_t *)"Biscuit", sizeof("Biscuit") - 1); // Original: Biscuit
dixysleo 0:58e350255405 424 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
Gustavo_Eduardo338 4:a43cbe8aed6a 425 (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid));
Gustavo_Eduardo338 4:a43cbe8aed6a 426 // 100ms; in multiples of 0.625ms.
dixysleo 0:58e350255405 427 ble.setAdvertisingInterval(160);
dixysleo 0:58e350255405 428
dixysleo 0:58e350255405 429 ble.addService(uartService);
Gustavo_Eduardo338 4:a43cbe8aed6a 430
Gustavo_Eduardo338 4:a43cbe8aed6a 431 ble.startAdvertising();
Gustavo_Eduardo338 4:a43cbe8aed6a 432
dixysleo 0:58e350255405 433 pc.printf("Advertising Start \r\n");
Gustavo_Eduardo338 4:a43cbe8aed6a 434
dixysleo 0:58e350255405 435 //por dixys
dixysleo 0:58e350255405 436 // para probar, luego quitar. Esto hace que cada ticker se envie un dato analogico via BLE
Gustavo_Eduardo338 5:a8c07a29df8a 437 analog_enabled = 0;
Gustavo_Eduardo338 4:a43cbe8aed6a 438
Gustavo_Eduardo338 4:a43cbe8aed6a 439 while(1) {
Gustavo_Eduardo338 4:a43cbe8aed6a 440 ble.waitForEvent();
dixysleo 0:58e350255405 441 }
Gustavo_Eduardo338 4:a43cbe8aed6a 442 }