ir-puck

Dependencies:   IRSender Puck mbed

Fork of ir-puck by Nordic Pucks

Committer:
stiaje
Date:
Tue Jul 15 08:49:45 2014 +0000
Revision:
4:24d9873936e6
Parent:
1:e92c3b50191d
Child:
5:3642c0af497e
Wait for bluetooth disconnect before sending IR signal.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sigveseb 0:c94311378ec1 1 #include "mbed.h"
sigveseb 0:c94311378ec1 2 #include "BLEDevice.h"
sigveseb 0:c94311378ec1 3 #include "IR.h"
sigveseb 0:c94311378ec1 4 #include "nRF51822n.h"
sigveseb 0:c94311378ec1 5
sigveseb 0:c94311378ec1 6 BLEDevice ble;
sigveseb 0:c94311378ec1 7
sigveseb 0:c94311378ec1 8 DigitalOut myled(LED1);
sigveseb 0:c94311378ec1 9 DigitalOut yourled(LED2);
sigveseb 0:c94311378ec1 10 nRF51822n nrf;
sigveseb 0:c94311378ec1 11
sigveseb 0:c94311378ec1 12 Serial py(USBTX, USBRX);
sigveseb 0:c94311378ec1 13
sigveseb 0:c94311378ec1 14 const static uint8_t beaconPayload[] = {
stiaje 4:24d9873936e6 15 0x00, 0x00, // Company identifier code (0x004C == Apple) - Should be all zero until we figure out this weird iOS bug
sigveseb 0:c94311378ec1 16 0x02, // ID
sigveseb 0:c94311378ec1 17 0x15, // length of the remaining payload
sigveseb 0:c94311378ec1 18 0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, // UUID
sigveseb 0:c94311378ec1 19 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61,
sigveseb 0:c94311378ec1 20 0x13, 0x37, // the major value to differenciate a location
sigveseb 0:c94311378ec1 21 0xFA, 0xCE, // the minor value to differenciate a location
sigveseb 0:c94311378ec1 22 0xC8 // 2's complement of the Tx power (-56dB)
sigveseb 0:c94311378ec1 23 };
sigveseb 0:c94311378ec1 24
sigveseb 0:c94311378ec1 25 extern GattService ir_service;
sigveseb 0:c94311378ec1 26 extern GattCharacteristic header, one, zero, ptrail, predata, code;
sigveseb 0:c94311378ec1 27
stiaje 4:24d9873936e6 28 bool received_ir_transmission = false;
stiaje 4:24d9873936e6 29 bool device_disconnected = true;
stiaje 4:24d9873936e6 30
sigveseb 0:c94311378ec1 31 void onDataWritten(uint16_t handle)
sigveseb 0:c94311378ec1 32 {
sigveseb 0:c94311378ec1 33 py.printf("Data written! %i\n", handle);
sigveseb 0:c94311378ec1 34 for (int i = 0; i < ir_service.getCharacteristicCount(); i++) {
sigveseb 0:c94311378ec1 35 GattCharacteristic* characteristic = ir_service.getCharacteristic(i);
sigveseb 0:c94311378ec1 36 characteristic->getMaxLength();
sigveseb 0:c94311378ec1 37 if (characteristic->getHandle() == handle) {
sigveseb 0:c94311378ec1 38 uint16_t max_length = characteristic->getMaxLength();
sigveseb 0:c94311378ec1 39 ble.readCharacteristicValue(handle, characteristic->getValuePtr(), &max_length);
aleksanb 1:e92c3b50191d 40 for (int i=0; i<max_length; i++) {
aleksanb 1:e92c3b50191d 41 py.printf("Got value: %d\n", characteristic->getValuePtr()[i]);
aleksanb 1:e92c3b50191d 42 }
sigveseb 0:c94311378ec1 43 break;
sigveseb 0:c94311378ec1 44 }
sigveseb 0:c94311378ec1 45 }
aleksanb 1:e92c3b50191d 46
sigveseb 0:c94311378ec1 47 if (code.getHandle() == handle) {
stiaje 4:24d9873936e6 48 py.printf("Received complete instruction\n");
stiaje 4:24d9873936e6 49 received_ir_transmission = true;
sigveseb 0:c94311378ec1 50 }
sigveseb 0:c94311378ec1 51 }
sigveseb 0:c94311378ec1 52
sigveseb 0:c94311378ec1 53 void disconnectionCallback(void)
sigveseb 0:c94311378ec1 54 {
sigveseb 0:c94311378ec1 55 py.printf("Disconnected!\n");
stiaje 4:24d9873936e6 56 device_disconnected = true;
sigveseb 0:c94311378ec1 57 }
sigveseb 0:c94311378ec1 58
sigveseb 0:c94311378ec1 59 void connectionCallback(void)
sigveseb 0:c94311378ec1 60 {
aleksanb 1:e92c3b50191d 61 py.printf("Connected!\n");
stiaje 4:24d9873936e6 62 device_disconnected = false;
sigveseb 0:c94311378ec1 63 }
sigveseb 0:c94311378ec1 64
sigveseb 0:c94311378ec1 65 void onDataSent(uint16_t data)
sigveseb 0:c94311378ec1 66 {
sigveseb 0:c94311378ec1 67 py.printf("onDataSent!\n");
sigveseb 0:c94311378ec1 68 }
sigveseb 0:c94311378ec1 69
aleksanb 1:e92c3b50191d 70 int main()
aleksanb 1:e92c3b50191d 71 {
aleksanb 1:e92c3b50191d 72 py.printf("Start of main\n");
aleksanb 1:e92c3b50191d 73
sigveseb 0:c94311378ec1 74 ble.init();
sigveseb 0:c94311378ec1 75 ble.onConnection(connectionCallback);
sigveseb 0:c94311378ec1 76 ble.onDisconnection(disconnectionCallback);
sigveseb 0:c94311378ec1 77 ble.onDataWritten(onDataWritten);
sigveseb 0:c94311378ec1 78 ble.onDataSent(onDataSent);
sigveseb 0:c94311378ec1 79 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
sigveseb 0:c94311378ec1 80 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
sigveseb 0:c94311378ec1 81 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
aleksanb 1:e92c3b50191d 82
sigveseb 0:c94311378ec1 83 ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
aleksanb 1:e92c3b50191d 84 beaconPayload, sizeof(beaconPayload));
aleksanb 1:e92c3b50191d 85
sigveseb 0:c94311378ec1 86 ble.startAdvertising();
sigveseb 0:c94311378ec1 87
sigveseb 0:c94311378ec1 88 ble.addService(ir_service);
aleksanb 1:e92c3b50191d 89
sigveseb 0:c94311378ec1 90 myled = 1;
aleksanb 1:e92c3b50191d 91
aleksanb 1:e92c3b50191d 92 py.printf("Listening..\n");
sigveseb 0:c94311378ec1 93
sigveseb 0:c94311378ec1 94 while (true) {
sigveseb 0:c94311378ec1 95 ble.waitForEvent();
stiaje 4:24d9873936e6 96 if (received_ir_transmission && device_disconnected) {
aleksanb 1:e92c3b50191d 97 fireIRCode(header.getValuePtr(), one.getValuePtr(), zero.getValuePtr(), ptrail.getValuePtr(), predata.getValuePtr(), code.getValuePtr());
stiaje 4:24d9873936e6 98 received_ir_transmission = false;
stiaje 4:24d9873936e6 99 ble.startAdvertising();
aleksanb 1:e92c3b50191d 100 }
sigveseb 0:c94311378ec1 101 myled = !myled;
sigveseb 0:c94311378ec1 102 }
sigveseb 0:c94311378ec1 103 }