The IR Puck can mimic arbitrary infrared remote controls. Built on the Puck IOT platform.

Dependencies:   Puck IRSender mbed

The IR Puck is a puck that can mimic arbitrary infrared remote controls. This is useful for controlling things like TVs, radios, airconditioners, window blinds, and just about anything and everything that can be otherwise be controlled by a regular remote control.

A tutorial for the IR Puck is available on GitHub.

Tutorials and in-depth documentation for the Puck platform is available at the project's GitHub page

main.cpp

Committer:
sigveseb
Date:
2014-07-02
Revision:
0:c94311378ec1
Child:
1:e92c3b50191d

File content as of revision 0:c94311378ec1:

#include "mbed.h"
#include "BLEDevice.h"
#include "IR.h"
#include "nRF51822n.h"

BLEDevice ble;

DigitalOut myled(LED1);
DigitalOut yourled(LED2);
nRF51822n nrf;

Serial py(USBTX, USBRX);

const static uint8_t beaconPayload[] = {
    0x00, 0x4C, // Company identifier code (0x004C == Apple)
    0x02,       // ID
    0x15,       // length of the remaining payload
    0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, // UUID
    0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61,
    0x13, 0x37, // the major value to differenciate a location
    0xFA, 0xCE, // the minor value to differenciate a location
    0xC8        // 2's complement of the Tx power (-56dB)
};

extern GattService ir_service;
extern GattCharacteristic header, one, zero, ptrail, predata, code;

void onDataWritten(uint16_t handle)
{
    py.printf("Data written! %i\n", handle);
    for (int i = 0; i < ir_service.getCharacteristicCount(); i++) {
        GattCharacteristic* characteristic = ir_service.getCharacteristic(i);
        characteristic->getMaxLength();
        if (characteristic->getHandle() == handle) {
            uint16_t max_length = characteristic->getMaxLength();
            ble.readCharacteristicValue(handle, characteristic->getValuePtr(), &max_length);
            break;
        }
    }
    
    if (code.getHandle() == handle) {
        fireIRCode(header.getValuePtr(), one.getValuePtr(), zero.getValuePtr(), ptrail.getValuePtr(), predata.getValuePtr(), code.getValuePtr());
    }
}

void disconnectionCallback(void)
{
    py.printf("Disconnected!\n");
    py.printf("Restarting the advertising process\n");
    ble.startAdvertising();
}

void connectionCallback(void)
{
    py.printf("Connected!\n");    
}

void onDataSent(uint16_t data)
{
    py.printf("onDataSent!\n");
}

int main() {
    ble.init();
    ble.onConnection(connectionCallback);
    ble.onDisconnection(disconnectionCallback);
    ble.onDataWritten(onDataWritten);
    ble.onDataSent(onDataSent);
    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
    ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
    ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
    
    
    ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
                    beaconPayload, sizeof(beaconPayload));
    
    ble.startAdvertising();

    ble.addService(ir_service);
    
    myled = 1;
    
    py.printf("Starting up.\n");
    
    

    while (true) {
        ble.waitForEvent();
        myled = !myled;
    }
    
}