@@ -48,7 +48,7 @@ const unsigned char AF3_MASK[14] = {46, 47, 32, 33, 34, 35, 36, 37, 38, 39, 24,
48
48
const unsigned char O2_MASK [14 ] = {140 , 141 , 142 , 143 , 128 , 129 , 130 , 131 , 132 , 133 , 134 , 135 , 120 , 121 };
49
49
const unsigned char O1_MASK [14 ] = {102 , 103 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 80 , 81 , 82 , 83 };
50
50
const unsigned char FC5_MASK [14 ] = {28 , 29 , 30 , 31 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 8 , 9 };
51
-
51
+ const unsigned char QUALITY_MASK [ 14 ] = { 99 , 100 , 101 , 102 , 103 , 104 , 105 , 106 , 107 , 108 , 109 , 110 , 111 , 112 };
52
52
struct emokit_device {
53
53
hid_device * _dev ;
54
54
wchar_t serial [MAX_STR ]; // USB Dongle serial number
@@ -61,11 +61,14 @@ struct emokit_device {
61
61
struct emokit_frame current_frame ; // Last information received from headset
62
62
unsigned char raw_frame [32 ]; // Raw encrypted data received from headset
63
63
unsigned char raw_unenc_frame [32 ]; // Raw unencrypted data received from headset
64
+ unsigned char last_battery ; //last reported battery value, in percentage of full
65
+ struct emokit_contact_quality last_quality ; //last reported contact quality
64
66
};
65
67
66
68
struct emokit_device * emokit_create ()
67
69
{
68
70
struct emokit_device * s = (struct emokit_device * )malloc (sizeof (struct emokit_device ));
71
+ memset (s ,0 ,sizeof (struct emokit_device ));
69
72
s -> _is_open = 0 ;
70
73
s -> _is_inited = 0 ;
71
74
hid_init ();
@@ -99,7 +102,7 @@ int emokit_identify_device(hid_device *dev) {
99
102
/* currently we check to see if the feature report matches the consumer
100
103
model and if not we assume it's a research model.*/
101
104
int nbytes , i , dev_type = EMOKIT_CONSUMER ;
102
- char buf [EMOKIT_REPORT_SIZE ];
105
+ unsigned char buf [EMOKIT_REPORT_SIZE ];
103
106
char report_consumer [] = {0x00 , 0xa0 , 0xff , 0x1f , 0xff , 0x00 , 0x00 , 0x00 , 0x00 };
104
107
buf [0 ] = EMOKIT_REPORT_ID ;
105
108
nbytes = hid_get_feature_report (dev , buf , sizeof (buf ));
@@ -123,7 +126,7 @@ EMOKIT_DECLSPEC int emokit_init_crypto(struct emokit_device* s, int dev_type) {
123
126
s -> td = mcrypt_module_open (MCRYPT_RIJNDAEL_128 , NULL , MCRYPT_ECB , NULL );
124
127
s -> blocksize = mcrypt_enc_get_block_size (s -> td ); //should return a 16bits blocksize
125
128
126
- s -> block_buffer = malloc (s -> blocksize );
129
+ s -> block_buffer = ( unsigned char * ) malloc (s -> blocksize );
127
130
128
131
mcrypt_generic_init (s -> td , s -> key , EMOKIT_KEYSIZE , NULL );
129
132
return 0 ;
@@ -184,7 +187,7 @@ void emokit_get_crypto_key(struct emokit_device* s, int dev_type) {
184
187
int i ;
185
188
unsigned int l = 16 ;
186
189
type &= 0xF ;
187
- type = (type ! = 0 );
190
+ type = (type = = 0 );
188
191
189
192
s -> key [0 ] = (uint8_t )s -> serial [l - 1 ];
190
193
s -> key [1 ] = '\0' ;
@@ -230,7 +233,7 @@ int get_level(unsigned char frame[32], const unsigned char bits[14]) {
230
233
231
234
for (i = 13 ; i >= 0 ; -- i ) {
232
235
level <<= 1 ;
233
- b = (bits [i ] / 8 ) + 1 ;
236
+ b = (bits [i ] >> 3 ) + 1 ;
234
237
o = bits [i ] % 8 ;
235
238
236
239
level |= (frame [b ] >> o ) & 1 ;
@@ -240,33 +243,191 @@ int get_level(unsigned char frame[32], const unsigned char bits[14]) {
240
243
241
244
EMOKIT_DECLSPEC int emokit_get_next_raw (struct emokit_device * s ) {
242
245
//Two blocks of 16 bytes must be read.
243
- int i ;
244
246
245
247
if (memcpy (s -> block_buffer , s -> raw_frame , s -> blocksize )) {
246
248
mdecrypt_generic (s -> td , s -> block_buffer , s -> blocksize );
247
- memcpy (s -> raw_unenc_frame , s -> block_buffer , 16 );
249
+ memcpy (s -> raw_unenc_frame , s -> block_buffer , s -> blocksize );
248
250
}
249
251
else {
250
252
return -1 ;
251
253
}
252
254
253
255
if (memcpy (s -> block_buffer , s -> raw_frame + s -> blocksize , s -> blocksize )) {
254
256
mdecrypt_generic (s -> td , s -> block_buffer , s -> blocksize );
255
- memcpy (s -> raw_unenc_frame + 16 , s -> block_buffer , 16 );
257
+ memcpy (s -> raw_unenc_frame + s -> blocksize , s -> block_buffer , s -> blocksize );
256
258
}
257
259
else {
258
260
return -1 ;
259
261
}
260
262
return 0 ;
261
263
}
262
264
265
+
266
+ //returns the percentage battery value given the unencrypted report value
267
+ EMOKIT_DECLSPEC unsigned char battery_value (unsigned char in ) {
268
+
269
+ if (in >=248 ) return 100 ;
270
+ else {
271
+ switch (in ) {
272
+ case 247 :return 99 ; break ;
273
+ case 246 :return 97 ; break ;
274
+ case 245 :return 93 ; break ;
275
+ case 244 :return 89 ; break ;
276
+ case 243 :return 85 ; break ;
277
+ case 242 :return 82 ; break ;
278
+ case 241 :return 77 ; break ;
279
+ case 240 :return 72 ; break ;
280
+ case 239 :return 66 ; break ;
281
+ case 238 :return 62 ; break ;
282
+ case 237 :return 55 ; break ;
283
+ case 236 :return 46 ; break ;
284
+ case 235 :return 32 ; break ;
285
+ case 234 :return 20 ; break ;
286
+ case 233 :return 12 ; break ;
287
+ case 232 :return 6 ; break ;
288
+ case 231 :return 4 ; break ;
289
+ case 230 :return 3 ; break ;
290
+ case 229 :return 2 ; break ;
291
+ case 228 :
292
+ case 227 :
293
+ case 226 :
294
+ return 1 ;
295
+ break ;
296
+ default :
297
+ return 0 ;
298
+ }
299
+ }
300
+ }
301
+
302
+ //decode and update the s->last_quality, return s->last_quality
303
+ EMOKIT_DECLSPEC struct emokit_contact_quality handle_quality (struct emokit_device * s ) {
304
+ int current_contact_quality = get_level (s -> raw_unenc_frame ,QUALITY_MASK );
305
+ switch (s -> raw_unenc_frame [0 ]) {
306
+ case 0 :
307
+ s -> last_quality .F3 = current_contact_quality ;
308
+ break ;
309
+ case 1 :
310
+ s -> last_quality .FC5 = current_contact_quality ;
311
+ break ;
312
+ case 2 :
313
+ s -> last_quality .AF3 = current_contact_quality ;
314
+ break ;
315
+ case 3 :
316
+ s -> last_quality .F7 = current_contact_quality ;
317
+ break ;
318
+ case 4 :
319
+ s -> last_quality .T7 = current_contact_quality ;
320
+ break ;
321
+ case 5 :
322
+ s -> last_quality .P7 = current_contact_quality ;
323
+ break ;
324
+ case 6 :
325
+ s -> last_quality .O1 = current_contact_quality ;
326
+ break ;
327
+ case 7 :
328
+ s -> last_quality .O2 = current_contact_quality ;
329
+ break ;
330
+ case 8 :
331
+ s -> last_quality .P8 = current_contact_quality ;
332
+ break ;
333
+ case 9 :
334
+ s -> last_quality .T8 = current_contact_quality ;
335
+ break ;
336
+ case 10 :
337
+ s -> last_quality .F8 = current_contact_quality ;
338
+ break ;
339
+ case 11 :
340
+ s -> last_quality .AF4 = current_contact_quality ;
341
+ break ;
342
+ case 12 :
343
+ s -> last_quality .FC6 = current_contact_quality ;
344
+ break ;
345
+ case 13 :
346
+ s -> last_quality .F4 = current_contact_quality ;
347
+ break ;
348
+ case 14 :
349
+ s -> last_quality .F8 = current_contact_quality ;
350
+ break ;
351
+ case 15 :
352
+ s -> last_quality .AF4 = current_contact_quality ;
353
+ break ;
354
+ case 64 :
355
+ s -> last_quality .F3 = current_contact_quality ;
356
+ break ;
357
+ case 65 :
358
+ s -> last_quality .FC5 = current_contact_quality ;
359
+ break ;
360
+ case 66 :
361
+ s -> last_quality .AF3 = current_contact_quality ;
362
+ break ;
363
+ case 67 :
364
+ s -> last_quality .F7 = current_contact_quality ;
365
+ break ;
366
+ case 68 :
367
+ s -> last_quality .T7 = current_contact_quality ;
368
+ break ;
369
+ case 69 :
370
+ s -> last_quality .P7 = current_contact_quality ;
371
+ break ;
372
+ case 70 :
373
+ s -> last_quality .O1 = current_contact_quality ;
374
+ break ;
375
+ case 71 :
376
+ s -> last_quality .O2 = current_contact_quality ;
377
+ break ;
378
+ case 72 :
379
+ s -> last_quality .P8 = current_contact_quality ;
380
+ break ;
381
+ case 73 :
382
+ s -> last_quality .T8 = current_contact_quality ;
383
+ break ;
384
+ case 74 :
385
+ s -> last_quality .F8 = current_contact_quality ;
386
+ break ;
387
+ case 75 :
388
+ s -> last_quality .AF4 = current_contact_quality ;
389
+ break ;
390
+ case 76 :
391
+ s -> last_quality .FC6 = current_contact_quality ;
392
+ break ;
393
+ case 77 :
394
+ s -> last_quality .F4 = current_contact_quality ;
395
+ break ;
396
+ case 78 :
397
+ s -> last_quality .F8 = current_contact_quality ;
398
+ break ;
399
+ case 79 :
400
+ s -> last_quality .AF4 = current_contact_quality ;
401
+ break ;
402
+ case 80 :
403
+ s -> last_quality .FC6 = current_contact_quality ;
404
+ break ;
405
+ default :
406
+ break ;
407
+ }
408
+ return (s -> last_quality );
409
+ }
410
+
411
+
263
412
EMOKIT_DECLSPEC
264
413
struct emokit_frame emokit_get_next_frame (struct emokit_device * s ) {
265
414
struct emokit_frame k ;
266
415
memset (s -> raw_unenc_frame , 0 , 32 );
267
- emokit_get_next_raw (s );
268
416
269
- k .counter = s -> raw_unenc_frame [0 ];
417
+ if (emokit_get_next_raw (s )< 0 ) {
418
+ k .counter = 0 ;
419
+ return k ;
420
+ }
421
+
422
+ memset (& k .cq ,0 ,sizeof (struct emokit_contact_quality ));
423
+ if (s -> raw_unenc_frame [0 ] & 128 ) {
424
+ k .counter = 128 ;
425
+ k .battery = battery_value ( s -> raw_unenc_frame [0 ] );
426
+ s -> last_battery = k .battery ;
427
+ } else {
428
+ k .counter = s -> raw_unenc_frame [0 ];
429
+ k .battery = s -> last_battery ;
430
+ }
270
431
k .F3 = get_level (s -> raw_unenc_frame , F3_MASK );
271
432
k .FC6 = get_level (s -> raw_unenc_frame , FC6_MASK );
272
433
k .P7 = get_level (s -> raw_unenc_frame , P7_MASK );
@@ -285,7 +446,9 @@ struct emokit_frame emokit_get_next_frame(struct emokit_device* s) {
285
446
k .gyroX = s -> raw_unenc_frame [29 ] - 102 ;
286
447
k .gyroY = s -> raw_unenc_frame [30 ] - 104 ;
287
448
288
- k .battery = 0 ;
449
+ k .cq = handle_quality (s );
450
+ //memcpy(k.unenc,s->raw_unenc_frame,32);
451
+
289
452
return k ;
290
453
}
291
454
0 commit comments