Dependencies:   mbed

NokiaPresenter.cpp

Committer:
demo
Date:
2009-09-19
Revision:
0:41f85a3f645d

File content as of revision 0:41f85a3f645d:

// Nokia Presenter Bluetooth
// Copyright (c) 2009 sford
// Released under the MIT License: http://mbed.org/license/mit

#include "NokiaPresenter.h"

#include "mbed.h"

NokiaPresenter::NokiaPresenter(PinName tx, PinName rx, PinName rst) : _bt(tx, rx), _rst(rst) {
    printf("Setup bt module\n");
    _bt.baud(9600);
    _rst = 0;
    wait(0.5);
    _rst = 1;
    wait(0.5);

    printf("Ensure we are in AT command mode...\n");
    _bt.printf("+++");
    wait(1);
    while (_bt.readable()) {
        _bt.getc();    // empty buffer
    }

    printf("Looking for BT Module...\n");
    at("AT\r", "\r\nOK\r\n");

    printf("Reset factory settings...\n");
    at("AT&F\r", "\r\nOK\r\n");

    printf("Setting name...\n");
    at("AT+BTLNM=\"simon\"\r", "\r\nOK\r\n");

    printf("Allow connections...\n");
    at("AT+BTAUT=1, 0\r", "\r\nOK\r\n");

    printf("Start BT server...\n");
    at("AT+BTSRV=1\r", "\r\nOK\r\n");

    printf("Waiting for presenter connection...\n");
    char buffer[23];
    for (int i=0; i<21; i++) {
        buffer[i] = _bt.getc();
    }

    printf("Got request, starting handshake...\n");
    for (int i=0; i<21; i++) {
        _bt.putc(buffer[i]);
    }
    for (int i=0; i<3; i++) {
        buffer[i] = _bt.getc();
    }
    const char connect[27] = {0x05,0x18,0x00,0x01,0x10,0x01,0x02,0x00,0xFF,0xFF,0x00,0x44,0x00,0x65,0x00,0x73,0x00,0x6B,0x00,0x74,0x00,0x6F,0x00,0x70,0x00,0x00,0x00};
    for (int i=0; i<27; i++) {
        _bt.putc(connect[i]);
    }

    printf("Handshake complete, waiting for desktop request...\n");
    for (int i=0; i<23; i++) {
        buffer[i] = _bt.getc();
    }
    for (int i=0; i<23; i++) {
        _bt.putc(buffer[i]);
    }

    printf("Presenter connection all setup!\n");
}

char NokiaPresenter::key() {
    char buffer[6];
    for (int i=0; i<6; i++) {
        buffer[i] = _bt.getc();
    }

    if (buffer[3] == 0x01) {
        return 0x00; // keyup
    }
    if (buffer[5] == 0xF8) {
        switch (buffer[4]) {
            case 0x07:
                return 'L';
            case 0x08:
                return 'R';
            case 0x09:
                return 'U';
            case 0x0A:
                return 'D';
            case 0x45:
                return 'C';
        }
    }
    return buffer[4];
}

void NokiaPresenter::at(char *command, char *response) {
    _bt.printf(command);
    for (int i=0; i<strlen(response); i++) {
        if (_bt.getc() != response[i]) {
            error("AT Command [%s] Failed", command);
        }
    }
}