Statistics
| Branch: | Tag: | Revision:

amiro-os / components / bluetooth / bluetooth-connector.cpp @ 58fe0e0b

History | View | Annotate | Download (2.79 KB)

1 58fe0e0b Thomas Schöpping
#include <ch.hpp>
2
#include <hal.h>
3
4
#include <string.h>
5
#include <chprintf.h>
6
7
#include <amiro/bluetooth/bluetooth-connector.hpp>
8
#include <amiro/bluetooth/bluetooth-serial.hpp>
9
#include <amiro/bluetooth/bluetooth-wiimote.hpp>
10
11
using namespace chibios_rt;
12
using namespace amiro;
13
14
/*
15
 * Class constructor
16
 */
17
BluetoothConnector::BluetoothConnector(BLUETOOTH *bluetooth, void *bluetoothDev, const char *typeConn) {
18
  iwrap = &(bluetooth->iwrap);
19
  objDev = bluetoothDev;
20
  typeDev = typeConn;
21
}
22
23
//----------------------------------------------------------------
24
25
26
void BluetoothConnector::bluetoothConnectorListen(const char *addr) {
27
  BluetoothProfile profile;
28
  profile.addr = (strstr(addr, "ALL")) ? "free" : addr;
29
  profile.connector = this;
30
  profile.connect = &BluetoothConnector::bluetoothConnectorActivate;
31
  profile.disconnect = &BluetoothConnector::bluetoothConnectorDeactivate;
32
  profile.linkid = 0xFF;
33
34
  /* Listen all address can have only one profile at the last profile,
35
     otherwise a fixed address will take it at first */
36
  if (strstr(addr, "ALL") && (iwrap->profiles[7].addr == NULL)) {
37
    iwrap->profiles[7] = profile;
38
    return;
39
  }
40
41
  for(int i = 0; i < 8; i++) {
42
    if(iwrap->profiles[i].addr == NULL) {
43
      iwrap->profiles[i] = profile;
44
      break;
45
    }
46
  }
47
}
48
49
void BluetoothConnector::bluetoothConnectorConnect(const char *addr) {
50
  int size = strlen(addr) + 17;
51
  char cmd[size];
52
  strcpy(cmd, "CALL ");
53
  strcat(cmd, addr);
54
55
  for (int i = 0; i < 8; i++) {
56
    if (strstr(iwrap->profiles[i].addr, addr) && (iwrap->profiles[i].linkid == 0xFF)) {
57
      switch (typeDev[0]) {
58
      case 'S':           // 'S' for "SERIAL"
59
        strcat(cmd, " 1101 RFCOMM");
60
        break;
61
      case 'W':           // 'W' for "WIIMOTE"
62
        strcat(cmd, " 0013 L2CAP ");
63
        break;
64
      }
65
      iwrap->bluetoothIwrapSendCommand(cmd);
66
      BaseThread::sleep(MS2ST(5000));    // waiting connection establish
67
      break;
68
    }
69
  }
70
}
71
72
void BluetoothConnector::bluetoothConnectorDisconnect(const char *addr) {
73
  char cmd[8];
74
  strcpy(cmd, "CLOSE ");
75
76
  for (int i = 0; i < 8; i++) {
77
    if (strstr(iwrap->profiles[i].addr, addr) && (iwrap->profiles[i].linkid != 0xFF)) {
78
      cmd[6] = iwrap->profiles[i].linkid + 0x30;
79
      cmd[7]= '\0';
80
      iwrap->bluetoothIwrapSendCommand(cmd);
81
      BaseThread::sleep(MS2ST(2000));    // waiting disconnection
82
      break;
83
    }
84
  }
85
}
86
87
void BluetoothConnector::bluetoothConnectorActivate(uint8_t linkid) {
88
  if (strstr(typeDev, "SERIAL"))
89
    ((BluetoothSerial *) objDev)->bluetoothSerialStart(linkid);
90
  else
91
    ((BluetoothWiimote *) objDev)->bluetoothWiimoteStart(linkid);
92
}
93
94
void BluetoothConnector::bluetoothConnectorDeactivate() {
95
  if (strstr(typeDev, "SERIAL"))
96
    ((BluetoothSerial *) objDev)->bluetoothSerialStop();
97
  else
98
    ((BluetoothWiimote *) objDev)->bluetoothWiimoteStop();
99
}