Revision 61b0791a components/bluetooth/bluetooth-wiimote.cpp

View differences:

components/bluetooth/bluetooth-wiimote.cpp
3 3

  
4 4
#include <amiro/bluetooth/bluetooth-wiimote.hpp>
5 5

  
6
#include <global.hpp>
7

  
6 8
using namespace chibios_rt;
7 9
using namespace amiro;
8 10

  
11
extern Global global;
12

  
9 13
/*
10 14
 * Class constructor
11 15
 */
......
39 43
  size_t length;
40 44
  msg_t msg;
41 45

  
42
  static uint8_t button_up;
43
  static uint8_t button_down;
44
  static uint8_t button_right;
45
  static uint8_t button_left;
46
  static uint8_t button_plus;
47
  static uint8_t button_home;
48
  static uint8_t button_minus;
49
  static uint8_t button_A;
50
  static uint8_t button_B;
51
  static uint8_t button_1;
52
  static uint8_t button_2;
53

  
54 46
  msg = mailbox.fetch((msg_t*) &recv_descriptor, TIME_INFINITE);
55 47
  if ((msg == RDY_RESET) || stopflag)
56 48
    return RDY_RESET;
......
58 50
  buffer = recv_descriptor->bluetoothDescriptorGetPayload();
59 51
  length = recv_descriptor->bluetoothDescriptorGetPayloadLength();
60 52

  
61
  if (buffer[0] == 0xA1 && buffer[1] == 0x31) {
62
    accelerometer.x_axis = (buffer[4] << 2) + ((buffer[2] & 0x60) >> 5) - 0x1EC;
63
    accelerometer.y_axis = (buffer[5] << 2) + ((buffer[3] & 0x20) >> 4) - 0x1EA;
64
    accelerometer.z_axis = (buffer[6] << 2) + ((buffer[3] & 0x40) >> 5) - 0x1EE;
65

  
66
    if (buffer[3] & 0x80) {             // Press home to return button reporting
67
      bluetoothWiimoteDataBtn();
68
      accelerometer.x_axis = 0;
69
      accelerometer.y_axis = 0;
70
      accelerometer.z_axis = 0;
71
    }
72

  
73
  } else if (buffer[0] == 0xA1 && buffer[1] == 0x30) {
74
    button_up    = (buffer[2] & 0x08) >> 3;
75
    button_down  = (buffer[2] & 0x04) >> 2;
76
    button_right = (buffer[2] & 0x02) >> 1;
77
    button_left  = (buffer[2] & 0x01) >> 0;
78
    button_plus  = (buffer[2] & 0x10) >> 4;
79
    button_home  = (buffer[3] & 0x80) >> 7;
80
    button_minus = (buffer[3] & 0x10) >> 4;
81
    button_A     = (buffer[3] & 0x08) >> 3;
82
    button_B     = (buffer[3] & 0x04) >> 2;
83
    button_1     = (buffer[3] & 0x02) >> 1;
84
    button_2     = (buffer[3] & 0x01) >> 0;
85

  
86
    if (button_up)
87
      chSequentialStreamPut((BaseSequentialStream*) &SD1, 'U');
88

  
89
    if (button_down)
90
      chSequentialStreamPut((BaseSequentialStream*) &SD1, 'D');
91

  
92
    if (button_right)
93
      chSequentialStreamPut((BaseSequentialStream*) &SD1, 'R');
94

  
95
    if (button_left)
96
      chSequentialStreamPut((BaseSequentialStream*) &SD1, 'L');
53
  if (buffer[0] == 0xA1 && (buffer[1] == 0x30 || buffer[1] == 0x31)) {
54
      buttons.left  = (buffer[2] & 0x01) ? 1 : 0;
55
      buttons.right = (buffer[2] & 0x02) ? 1 : 0;
56
      buttons.down  = (buffer[2] & 0x04) ? 1 : 0;
57
      buttons.up    = (buffer[2] & 0x08) ? 1 : 0;
58
      buttons.plus  = (buffer[2] & 0x10) ? 1 : 0;
59
      buttons.two   = (buffer[3] & 0x01) ? 1 : 0;
60
      buttons.one   = (buffer[3] & 0x02) ? 1 : 0;
61
      buttons.B     = (buffer[3] & 0x04) ? 1 : 0;
62
      buttons.A     = (buffer[3] & 0x08) ? 1 : 0;
63
      buttons.minus = (buffer[3] & 0x10) ? 1 : 0;
64
      buttons.home  = (buffer[3] & 0x80) ? 1 : 0;
65

  
66
      accelerometer.x_axis = (buffer[4] << 2) + ((buffer[2] & 0x60) >> 5) - 0x1FF;
67
      accelerometer.y_axis = (buffer[5] << 2) + ((buffer[3] & 0x20) >> 4) - 0x1FF;
68
      accelerometer.z_axis = (buffer[6] << 2) + ((buffer[3] & 0x40) >> 5) - 0x1FF;
97 69

  
98
    if (button_plus)
99
      chSequentialStreamPut((BaseSequentialStream*) &SD1, '+');
100

  
101
    if (button_home)
102
      chSequentialStreamPut((BaseSequentialStream*) &SD1, 'H');
103

  
104
    if (button_minus)
105
      chSequentialStreamPut((BaseSequentialStream*) &SD1, '-');
106

  
107
    if (button_A)
108
      chSequentialStreamPut((BaseSequentialStream*) &SD1, 'A');
109

  
110
    if (button_B)
111
      chSequentialStreamPut((BaseSequentialStream*) &SD1, 'B');
112

  
113
    if (button_1)
114
      chSequentialStreamPut((BaseSequentialStream*) &SD1, '1');
115

  
116
    if (button_2)
117
      chSequentialStreamPut((BaseSequentialStream*) &SD1, '2');
118

  
119
    if (button_minus && button_plus)   // Press minus and plue to return accelerometer reporting
120 70
      bluetoothWiimoteDataBtnAcc();
121 71
  } else {
122
    chSequentialStreamWrite((BaseSequentialStream*) &SD1, buffer, length);
72
    chSequentialStreamWrite((BaseSequentialStream*) &global.sercanmux1, buffer, length);
123 73
  }
124 74

  
125 75
  msg = iwrap->transport.bluetoothTransportGetStorageMailbox()->post((msg_t) recv_descriptor, TIME_INFINITE);
......
179 129
  return &accelerometer;
180 130
}
181 131

  
132
BluetoothWiimote::Buttons * BluetoothWiimote::getButtons() {
133
  return &buttons;
134
}
135

  
182 136
/*
183 137
 * @brief :  On-off LEDs and Motor of Wiimote.
184 138
 *

Also available in: Unified diff