MolCom

Dependencies:   BLE_API mbed

Fork of LinkNode_LIS3DH by Delong Qi

Committer:
luzai
Date:
Wed May 11 04:27:09 2016 +0000
Revision:
13:2eea65e05867
Parent:
12:2d16b571ec3b
MolCom;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
helloqi 11:c16a53584668 1 #include<mbed.h>
luzai 12:2d16b571ec3b 2 #include<string.h>
luzai 12:2d16b571ec3b 3 #include<math.h>
luzai 12:2d16b571ec3b 4 #include<stdlib.h>
luzai 12:2d16b571ec3b 5 #include "mbed.h"
luzai 12:2d16b571ec3b 6 #include "ble/BLE.h"
luzai 12:2d16b571ec3b 7 #include "Servo.h"
luzai 12:2d16b571ec3b 8 #include "GattCallbackParamTypes.h"
luzai 12:2d16b571ec3b 9
luzai 12:2d16b571ec3b 10 #define BLE_UUID_TXRX_SERVICE 0x0000 /**< The UUID of the Nordic UART Service. */
luzai 12:2d16b571ec3b 11 #define BLE_UUID_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */
luzai 12:2d16b571ec3b 12 #define BLE_UUIDS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */
luzai 12:2d16b571ec3b 13
luzai 12:2d16b571ec3b 14 #define TXRX_BUF_LEN 20
luzai 12:2d16b571ec3b 15
luzai 12:2d16b571ec3b 16 #define DIGITAL_OUT_PIN P0_20 //D7
luzai 12:2d16b571ec3b 17 #define DIGITAL_IN_PIN P0_29 //A4
luzai 12:2d16b571ec3b 18 #define PWM_PIN P0_19 //D6
luzai 12:2d16b571ec3b 19 #define SERVO_PIN P0_22 //D10
luzai 12:2d16b571ec3b 20 #define ANALOG_IN_PIN P0_1 //A5
luzai 12:2d16b571ec3b 21
luzai 12:2d16b571ec3b 22 BLE ble;
luzai 12:2d16b571ec3b 23 DigitalOut LED(DIGITAL_OUT_PIN);
luzai 12:2d16b571ec3b 24 DigitalIn BUTTON(DIGITAL_IN_PIN);
luzai 12:2d16b571ec3b 25 //PwmOut PWM(PWM_PIN);
luzai 12:2d16b571ec3b 26 AnalogIn ANALOG(ANALOG_IN_PIN);
luzai 12:2d16b571ec3b 27 Servo MYSERVO(SERVO_PIN);
luzai 12:2d16b571ec3b 28
luzai 12:2d16b571ec3b 29 SPI spi_master(P0_6,P0_5,P0_7); //mosi miso sclk
luzai 12:2d16b571ec3b 30 DigitalOut cs(P0_4);
luzai 12:2d16b571ec3b 31
luzai 12:2d16b571ec3b 32 Serial pc(P0_23,P0_25);
luzai 12:2d16b571ec3b 33
luzai 12:2d16b571ec3b 34 static uint8_t analog_enabled = 0;
luzai 12:2d16b571ec3b 35 static uint8_t old_state = 0;
helloqi 11:c16a53584668 36
helloqi 11:c16a53584668 37 uint16_t x_a,y_a,z_a;
helloqi 11:c16a53584668 38 bool flag = 0;
helloqi 11:c16a53584668 39
luzai 12:2d16b571ec3b 40
luzai 12:2d16b571ec3b 41 // The Nordic UART Service
luzai 12:2d16b571ec3b 42 static const uint8_t uart_base_uuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
luzai 12:2d16b571ec3b 43 static const uint8_t uart_tx_uuid[] = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
luzai 12:2d16b571ec3b 44 static const uint8_t uart_rx_uuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
luzai 12:2d16b571ec3b 45 static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71};
luzai 12:2d16b571ec3b 46
luzai 12:2d16b571ec3b 47
luzai 12:2d16b571ec3b 48 uint8_t txPayload[TXRX_BUF_LEN] = {0,};
luzai 12:2d16b571ec3b 49 uint8_t rxPayload[TXRX_BUF_LEN] = {0,};
luzai 12:2d16b571ec3b 50
luzai 12:2d16b571ec3b 51 //static uint8_t rx_buf[TXRX_BUF_LEN];
luzai 12:2d16b571ec3b 52 //static uint8_t rx_len=0;
luzai 12:2d16b571ec3b 53
luzai 12:2d16b571ec3b 54
luzai 12:2d16b571ec3b 55 GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
luzai 12:2d16b571ec3b 56
luzai 12:2d16b571ec3b 57 GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
luzai 12:2d16b571ec3b 58
luzai 12:2d16b571ec3b 59 GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic};
luzai 12:2d16b571ec3b 60
luzai 12:2d16b571ec3b 61 GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *));
luzai 12:2d16b571ec3b 62
luzai 12:2d16b571ec3b 63
helloqi 11:c16a53584668 64
luzai 12:2d16b571ec3b 65 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
luzai 12:2d16b571ec3b 66 {
luzai 12:2d16b571ec3b 67 pc.printf("Disconnected \r\n");
luzai 12:2d16b571ec3b 68 pc.printf("Restart advertising \r\n");
luzai 12:2d16b571ec3b 69 ble.startAdvertising();
luzai 12:2d16b571ec3b 70 }
helloqi 11:c16a53584668 71
luzai 12:2d16b571ec3b 72 void WrittenHandler(const GattWriteCallbackParams *Handler)
luzai 12:2d16b571ec3b 73 {
luzai 12:2d16b571ec3b 74 uint8_t buf[TXRX_BUF_LEN];
luzai 12:2d16b571ec3b 75 uint16_t bytesRead, index;
luzai 12:2d16b571ec3b 76 if (Handler->handle == txCharacteristic.getValueAttribute().getHandle())
luzai 12:2d16b571ec3b 77 {
luzai 12:2d16b571ec3b 78 ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead);
luzai 12:2d16b571ec3b 79 memset(txPayload, 0, TXRX_BUF_LEN);
luzai 12:2d16b571ec3b 80 memcpy(txPayload, buf, TXRX_BUF_LEN);
luzai 12:2d16b571ec3b 81
luzai 12:2d16b571ec3b 82 for(index=0; index<bytesRead; index++)
luzai 12:2d16b571ec3b 83 pc.putc(buf[index]);
luzai 12:2d16b571ec3b 84
luzai 12:2d16b571ec3b 85 if(buf[0]==0xA0){
luzai 12:2d16b571ec3b 86 if(buf[1]==0x01)
luzai 12:2d16b571ec3b 87 {
luzai 12:2d16b571ec3b 88 analog_enabled=1;
luzai 12:2d16b571ec3b 89 }
luzai 12:2d16b571ec3b 90 else
luzai 12:2d16b571ec3b 91 analog_enabled=0;
luzai 12:2d16b571ec3b 92 }
luzai 12:2d16b571ec3b 93
luzai 12:2d16b571ec3b 94 }
luzai 12:2d16b571ec3b 95 }
dan 0:7dec7e9ac085 96
luzai 12:2d16b571ec3b 97
luzai 12:2d16b571ec3b 98
helloqi 11:c16a53584668 99 uint8_t LIS3DH_SPI_RD(uint8_t addr)
helloqi 11:c16a53584668 100 {
helloqi 11:c16a53584668 101 uint8_t temp;
helloqi 11:c16a53584668 102 cs = 0;
helloqi 11:c16a53584668 103 wait_us(10);
helloqi 11:c16a53584668 104 spi_master.write(addr);
helloqi 11:c16a53584668 105 temp=spi_master.write(0xff);
helloqi 11:c16a53584668 106 wait_us(10);
helloqi 11:c16a53584668 107 cs = 1;
helloqi 11:c16a53584668 108 return temp;
helloqi 11:c16a53584668 109 }
helloqi 11:c16a53584668 110
helloqi 11:c16a53584668 111 void LIS3DH_SPI_WR(uint8_t addr,uint8_t wrdata)
helloqi 11:c16a53584668 112 {
helloqi 11:c16a53584668 113 cs = 0;
helloqi 11:c16a53584668 114 wait_us(10);
helloqi 11:c16a53584668 115 spi_master.write(addr);
helloqi 11:c16a53584668 116 spi_master.write(wrdata);
helloqi 11:c16a53584668 117 wait_us(10);
helloqi 11:c16a53584668 118 cs = 1;
helloqi 11:c16a53584668 119 }
dan 0:7dec7e9ac085 120
helloqi 11:c16a53584668 121 void SPI_LIS3DH_Init()
helloqi 11:c16a53584668 122 {
helloqi 11:c16a53584668 123 spi_master.format(8,3);
helloqi 11:c16a53584668 124 spi_master.frequency(100000);
helloqi 11:c16a53584668 125 wait_ms(5);
helloqi 11:c16a53584668 126 LIS3DH_SPI_WR(0x24,0x80);
helloqi 11:c16a53584668 127 wait_ms(5);
helloqi 11:c16a53584668 128 LIS3DH_SPI_WR(0x20,0x17);
helloqi 11:c16a53584668 129 LIS3DH_SPI_WR(0x23,0x80);
helloqi 11:c16a53584668 130 }
helloqi 11:c16a53584668 131
helloqi 11:c16a53584668 132 void get_val(void)
helloqi 11:c16a53584668 133 {
helloqi 11:c16a53584668 134 uint8_t Dx_L=1,Dy_L=1,Dz_L=1;
helloqi 11:c16a53584668 135 uint8_t Dx_H=1,Dy_H=1,Dz_H=1;
helloqi 11:c16a53584668 136 if(LIS3DH_SPI_RD(0x0f|0x80)==0x33)
helloqi 11:c16a53584668 137 {
helloqi 11:c16a53584668 138 printf("check device ok!\r\n");
helloqi 11:c16a53584668 139 flag=1;
helloqi 11:c16a53584668 140 Dx_H=LIS3DH_SPI_RD(0x29|0x80);
helloqi 11:c16a53584668 141 Dx_L=LIS3DH_SPI_RD(0x28|0x80);
helloqi 11:c16a53584668 142 Dy_H=LIS3DH_SPI_RD(0x2b|0x80);
helloqi 11:c16a53584668 143 Dy_L=LIS3DH_SPI_RD(0x2A|0x80);
helloqi 11:c16a53584668 144 Dz_H=LIS3DH_SPI_RD(0x2d|0x80);
helloqi 11:c16a53584668 145 Dz_L=LIS3DH_SPI_RD(0x2C|0x80);
stevep 4:81cea7a352b0 146 }
helloqi 11:c16a53584668 147 else
helloqi 11:c16a53584668 148 {
helloqi 11:c16a53584668 149 printf("check device err!\r\n");
helloqi 11:c16a53584668 150 wait(1);
helloqi 11:c16a53584668 151 }
helloqi 11:c16a53584668 152 x_a=Dx_H<<8|Dx_L/16;
helloqi 11:c16a53584668 153 y_a=Dy_H<<8|Dy_L/16;
helloqi 11:c16a53584668 154 z_a=Dz_H<<8|Dz_L/16;
dan 0:7dec7e9ac085 155 }
helloqi 11:c16a53584668 156
luzai 12:2d16b571ec3b 157 void m_status_check_handle(void)
luzai 12:2d16b571ec3b 158 {
luzai 12:2d16b571ec3b 159 uint8_t buf[3];
luzai 12:2d16b571ec3b 160 LED=1;
luzai 12:2d16b571ec3b 161 if (analog_enabled) // if analog reading enabled
luzai 12:2d16b571ec3b 162 {
luzai 12:2d16b571ec3b 163 // Read and send out
luzai 12:2d16b571ec3b 164 get_val();
luzai 12:2d16b571ec3b 165 if (flag)
luzai 12:2d16b571ec3b 166 {
luzai 12:2d16b571ec3b 167 if (abs(x_a)>1000)
luzai 12:2d16b571ec3b 168 LED=0;
luzai 12:2d16b571ec3b 169 buf[0] = (0x0A);
luzai 12:2d16b571ec3b 170 buf[1] = (x_a >> 8);
luzai 12:2d16b571ec3b 171 buf[2] = (x_a);
luzai 12:2d16b571ec3b 172 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3);
luzai 12:2d16b571ec3b 173 wait_us(100);
luzai 12:2d16b571ec3b 174
luzai 12:2d16b571ec3b 175 buf[0] = (0x0B);
luzai 12:2d16b571ec3b 176 buf[1] = (y_a >> 8);
luzai 12:2d16b571ec3b 177 buf[2] = (y_a);
luzai 12:2d16b571ec3b 178 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3);
luzai 12:2d16b571ec3b 179 wait_us(100);
luzai 12:2d16b571ec3b 180
luzai 12:2d16b571ec3b 181 buf[0] = (0x0C);
luzai 12:2d16b571ec3b 182 buf[1] = (z_a >> 8);
luzai 12:2d16b571ec3b 183 buf[2] = (z_a);
luzai 12:2d16b571ec3b 184 ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), buf, 3);
luzai 12:2d16b571ec3b 185 wait_us(100);
luzai 12:2d16b571ec3b 186
luzai 12:2d16b571ec3b 187 flag=0;
luzai 12:2d16b571ec3b 188 wait_us(100);
luzai 12:2d16b571ec3b 189 }
luzai 12:2d16b571ec3b 190
luzai 12:2d16b571ec3b 191 }
luzai 12:2d16b571ec3b 192 }
luzai 12:2d16b571ec3b 193
luzai 12:2d16b571ec3b 194
luzai 12:2d16b571ec3b 195
helloqi 11:c16a53584668 196 int main(void)
helloqi 11:c16a53584668 197 {
luzai 12:2d16b571ec3b 198 uint8_t buf[3];
luzai 12:2d16b571ec3b 199
luzai 12:2d16b571ec3b 200 SPI_LIS3DH_Init();
luzai 12:2d16b571ec3b 201
luzai 12:2d16b571ec3b 202 Ticker ticker;
luzai 12:2d16b571ec3b 203 ticker.attach_us(m_status_check_handle, 200000);
luzai 12:2d16b571ec3b 204
luzai 12:2d16b571ec3b 205 ble.init();
luzai 12:2d16b571ec3b 206 ble.onDisconnection(disconnectionCallback);
luzai 12:2d16b571ec3b 207 ble.onDataWritten(WrittenHandler);
luzai 12:2d16b571ec3b 208
luzai 12:2d16b571ec3b 209 pc.baud(9600);
luzai 12:2d16b571ec3b 210 pc.printf("SimpleChat Init \r\n");
luzai 12:2d16b571ec3b 211
luzai 12:2d16b571ec3b 212 // setup advertising
luzai 12:2d16b571ec3b 213 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
luzai 12:2d16b571ec3b 214 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
luzai 12:2d16b571ec3b 215 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
luzai 12:2d16b571ec3b 216 (const uint8_t *)"MolCom", sizeof("MolCom") - 1);
luzai 12:2d16b571ec3b 217 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
luzai 12:2d16b571ec3b 218 (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid));
luzai 12:2d16b571ec3b 219 // 100ms; in multiples of 0.625ms.
luzai 12:2d16b571ec3b 220 ble.setAdvertisingInterval(160);
luzai 12:2d16b571ec3b 221
luzai 12:2d16b571ec3b 222 ble.addService(uartService);
luzai 12:2d16b571ec3b 223
luzai 12:2d16b571ec3b 224 ble.startAdvertising();
luzai 12:2d16b571ec3b 225
luzai 12:2d16b571ec3b 226 pc.printf("Advertising Start \r\n");
luzai 12:2d16b571ec3b 227
luzai 12:2d16b571ec3b 228 while(1)
luzai 12:2d16b571ec3b 229 {
luzai 12:2d16b571ec3b 230 ble.waitForEvent();
luzai 12:2d16b571ec3b 231 }
helloqi 11:c16a53584668 232 }