Arduino Libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
bluesmirf_hid.hpp
Go to the documentation of this file.
1 // Author: Mario S. Könz <mskoenz@gmx.net>
2 // Date: 09.08.2013 13:13:05 CEST
3 // File: bluesmirf_hid.hpp
4 
5 /* This program is free software. It comes without any warranty, to
6  * the extent permitted by applicable law. You can redistribute it
7  * and/or modify it under the terms of the Do What The Fuck You Want
8  * To Public License, Version 2, as published by Sam Hocevar. See
9  * http://www.wtfpl.net/ or COPYING for more details. */
10 
11 #ifndef __BLUESMIRF_HID_HEADER
12 #define __BLUESMIRF_HID_HEADER
13 
14 #include "hid_keys.hpp"
15 
16 #include <ustd/array.hpp>
17 
18 #include <SoftwareSerial.h>
19 
20 namespace device {
21 
23  public:
24  //------------------- ctors -------------------
25  bluesmirf_hid_class(uint8_t const & rx, uint8_t const & tx): serial_(rx, tx) {
26 
27  serial_.begin(57600);
28 
29  data_[0] = 0xFE;
30  data_[1] = 0x04;
31  data_[2] = 0x00;
32  data_[3] = 0x00;
33  data_[4] = 0x00;
34  data_[5] = 0x00;
35  }
36  //------------------- cmd -------------------
37  void init() {
38 
39  }
40  void cmd_mode() {
41  serial_.print(F("$$$"));
42  serial_.flush();
43  delay(200);
44  }
45 
46  void reset() {
47  //~ ustd::cout << F("R,1") << ustd::endl;
48  serial_.println(F("R,1"));
49  delay(300);
50  }
51 
52  void connect() {
53  reset();
54  cmd_mode();
55  //~ ustd::cout << F("C") << ustd::endl;
56  serial_.println(F("C"));
57  delay(200);
58  }
59 
61  ustd::cout << char(0) << ustd::endl;
62  delay(400);
63  }
64 
65  void change_ssp() {
67  reset();
68  cmd_mode();
69  ustd::cout << F("S~,0") << ustd::endl;
70  delay(100);
71  ustd::cout << F("SE,S") << ustd::endl;
72  delay(200);
73  }
74 
75  void change_hid() {
77  reset();
78  cmd_mode();
79  ustd::cout << F("S~,6") << ustd::endl;
80  delay(100);
81 
82  ustd::cout << F("SE,C") << ustd::endl;
83  delay(200);
84  connect(); //only connect when HID
85  }
86  //=================== press/release helper ===================
87  void set_key(uint8_t const & _key) {
88  if(data_[3] == 0) {
89  data_[3] = data_[4];
90  data_[4] = data_[5];
91  data_[5] = _key;
92  return;
93  }
94  if(data_[4] == 0) {
95  data_[4] = data_[5];
96  data_[5] = _key;
97  return;
98  }
99  if(data_[5] == 0) {
100  data_[5] = _key;
101  return;
102  }
103  }
104  void unset_key(uint8_t const & _key) {
105  if(data_[3] == _key) {
106  data_[3] = 0;
107  return;
108  }
109  if(data_[4] == _key) {
110  data_[4] = 0;
111  return;
112  }
113  if(data_[5] == _key) {
114  data_[5] = 0;
115  return;
116  }
117  }
118  void set_mod(uint8_t const & _mod) {
119  if(_mod == 0)
120  return;
121  if((_mod & 1) == 1) {
122  data_[2] |= _mod;
123  ++(mod_vec_[0]);
124  }
125  if((_mod & 2) == 2) {
126  data_[2] |= _mod;
127  ++(mod_vec_[1]);
128  }
129  if((_mod & 4) == 4) {
130  data_[2] |= _mod;
131  ++(mod_vec_[2]);
132  }
133  if((_mod & 8) == 8) {
134  data_[2] |= _mod;
135  ++(mod_vec_[3]);
136  }
137  }
138  void unset_mod(uint8_t const & _mod) {
139  if(_mod == 0)
140  return;
141 
142  if((_mod & 1) == 1) {
143  if(--(mod_vec_[0]) == 0)
144  data_[2] &= ~_mod;
145  }
146  if((_mod & 2) == 2) {
147  if(--(mod_vec_[1]) == 0)
148  data_[2] &= ~_mod;
149  }
150  if((_mod & 4) == 4) {
151  if(--(mod_vec_[2]) == 0)
152  data_[2] &= ~_mod;
153  }
154  if((_mod & 8) == 8) {
155  if(--(mod_vec_[3]) == 0)
156  data_[2] &= ~_mod;
157  }
158 
159  }
160  //=================== press and release ===================
161  void press(key const & _key, key const & _mod = key::none) {
162  set_key((uint8_t)_key);
163  set_mod((uint8_t)_mod);
164  serial_.write(data_, 6);
165  }
166  void release(key const & _key, key const & _mod = key::none) {
167  unset_key((uint8_t)_key);
168  unset_mod((uint8_t)_mod);
169  serial_.write(data_, 6);
170  }
171  void press(uint8_t const & _key, uint8_t const & _mod = (uint8_t)key::none) {
172  set_key(_key);
173  set_mod(_mod);
174  serial_.write(data_, 6);
175  }
176  void release(uint8_t const & _key, uint8_t const & _mod = (uint8_t)key::none) {
177  unset_key(_key);
178  unset_mod(_mod);
179  serial_.write(data_, 6);
180  }
181  void release_all() {
182  data_[2] = 0;
183  data_[3] = 0;
184  data_[4] = 0;
185  data_[5] = 0;
186  serial_.write(data_, 6);
187  }
188  private:
189 
190  SoftwareSerial serial_;
191 
192  uint8_t data_[6]; //first two byte are reserved, third is the mod and the last three the keys
193  ustd::array<uint8_t, 4> mod_vec_;
194  };
195 
196 
197 }//end namespace device
198 
199 #endif //__BLUESMIRF_HID_HEADER
void change_ssp()
Definition: bluesmirf_hid.hpp:65
void release_all()
Definition: bluesmirf_hid.hpp:181
void set_key(uint8_t const &_key)
Definition: bluesmirf_hid.hpp:87
void break_connection()
Definition: bluesmirf_hid.hpp:60
Definition: bluesmirf_hid.hpp:22
void press(key const &_key, key const &_mod=key::none)
Definition: bluesmirf_hid.hpp:161
bluesmirf_hid_class(uint8_t const &rx, uint8_t const &tx)
Definition: bluesmirf_hid.hpp:25
void unset_mod(uint8_t const &_mod)
Definition: bluesmirf_hid.hpp:138
void press(uint8_t const &_key, uint8_t const &_mod=(uint8_t) key::none)
Definition: bluesmirf_hid.hpp:171
void set_mod(uint8_t const &_mod)
Definition: bluesmirf_hid.hpp:118
void reset()
Definition: bluesmirf_hid.hpp:46
struct ustd::endl_class endl
void change_hid()
Definition: bluesmirf_hid.hpp:75
void release(uint8_t const &_key, uint8_t const &_mod=(uint8_t) key::none)
Definition: bluesmirf_hid.hpp:176
void init()
Definition: bluesmirf_hid.hpp:37
key
Definition: hid_keys.hpp:14
void unset_key(uint8_t const &_key)
Definition: bluesmirf_hid.hpp:104
#define F(x)
Definition: ustd_generic.hpp:15
void connect()
Definition: bluesmirf_hid.hpp:52
void cmd_mode()
Definition: bluesmirf_hid.hpp:40
void release(key const &_key, key const &_mod=key::none)
Definition: bluesmirf_hid.hpp:166
ustd::cout_class cout