Sound update

Dependencies:   4DGL-uLCD-SE Physac-MBED PinDetect SDFileSystem mbed-rtos mbed

Committer:
jstephens78
Date:
Wed Nov 30 21:20:21 2022 +0000
Revision:
12:5d913b57da7c
Hockey game implemented, mostly

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jstephens78 12:5d913b57da7c 1 #include "bluefruit_controller.h"
jstephens78 12:5d913b57da7c 2
jstephens78 12:5d913b57da7c 3 enum State {
jstephens78 12:5d913b57da7c 4 STATE_IDLE, // Waiting for a message
jstephens78 12:5d913b57da7c 5 STATE_MSG, // '!' received, read in a tag
jstephens78 12:5d913b57da7c 6 STATE_PAYLOAD, // tag received, read in payload bytes
jstephens78 12:5d913b57da7c 7 };
jstephens78 12:5d913b57da7c 8
jstephens78 12:5d913b57da7c 9
jstephens78 12:5d913b57da7c 10 BluefruitController::BluefruitController(PinName tx, PinName rx, int baud)
jstephens78 12:5d913b57da7c 11 : Serial(tx, rx, baud)
jstephens78 12:5d913b57da7c 12 {
jstephens78 12:5d913b57da7c 13 buff_len = 0;
jstephens78 12:5d913b57da7c 14 buff_i = 0;
jstephens78 12:5d913b57da7c 15 }
jstephens78 12:5d913b57da7c 16
jstephens78 12:5d913b57da7c 17 void BluefruitController::parseMessage()
jstephens78 12:5d913b57da7c 18 {
jstephens78 12:5d913b57da7c 19 while (readable()) {
jstephens78 12:5d913b57da7c 20 switch (state) {
jstephens78 12:5d913b57da7c 21 // Read until the '!'
jstephens78 12:5d913b57da7c 22 case STATE_IDLE: {
jstephens78 12:5d913b57da7c 23 if (getc() == '!')
jstephens78 12:5d913b57da7c 24 state = STATE_MSG;
jstephens78 12:5d913b57da7c 25 break;
jstephens78 12:5d913b57da7c 26 }
jstephens78 12:5d913b57da7c 27
jstephens78 12:5d913b57da7c 28 // Read in the msg tag and begin reading that many bytes
jstephens78 12:5d913b57da7c 29 case STATE_MSG: {
jstephens78 12:5d913b57da7c 30 msg_tag = getc();
jstephens78 12:5d913b57da7c 31 buff_i = 0;
jstephens78 12:5d913b57da7c 32 state = STATE_PAYLOAD;
jstephens78 12:5d913b57da7c 33
jstephens78 12:5d913b57da7c 34 switch (msg_tag) {
jstephens78 12:5d913b57da7c 35 case 'B':
jstephens78 12:5d913b57da7c 36 buff_len = 3;
jstephens78 12:5d913b57da7c 37 break;
jstephens78 12:5d913b57da7c 38 case 'Q':
jstephens78 12:5d913b57da7c 39 buff_len = 4*4;
jstephens78 12:5d913b57da7c 40 break;
jstephens78 12:5d913b57da7c 41
jstephens78 12:5d913b57da7c 42 // For unrecognized message types, go back to waiting for
jstephens78 12:5d913b57da7c 43 // the next '!'
jstephens78 12:5d913b57da7c 44 default:
jstephens78 12:5d913b57da7c 45 state = STATE_IDLE;
jstephens78 12:5d913b57da7c 46 }
jstephens78 12:5d913b57da7c 47 break;
jstephens78 12:5d913b57da7c 48 }
jstephens78 12:5d913b57da7c 49
jstephens78 12:5d913b57da7c 50 // Read in payload bytes
jstephens78 12:5d913b57da7c 51 case STATE_PAYLOAD: {
jstephens78 12:5d913b57da7c 52 // Read in bytes
jstephens78 12:5d913b57da7c 53 if (buff_i < buff_len) {
jstephens78 12:5d913b57da7c 54 buff[buff_i] = getc();
jstephens78 12:5d913b57da7c 55 buff_i++;
jstephens78 12:5d913b57da7c 56 }
jstephens78 12:5d913b57da7c 57
jstephens78 12:5d913b57da7c 58 // When done, parse the messages
jstephens78 12:5d913b57da7c 59 if (buff_i == buff_len) {
jstephens78 12:5d913b57da7c 60 state = STATE_IDLE;
jstephens78 12:5d913b57da7c 61 switch(msg_tag) {
jstephens78 12:5d913b57da7c 62 case 'B':
jstephens78 12:5d913b57da7c 63 parseButton();
jstephens78 12:5d913b57da7c 64 break;
jstephens78 12:5d913b57da7c 65 case 'Q':
jstephens78 12:5d913b57da7c 66 parseQuaternion();
jstephens78 12:5d913b57da7c 67 break;
jstephens78 12:5d913b57da7c 68 }
jstephens78 12:5d913b57da7c 69 }
jstephens78 12:5d913b57da7c 70 break;
jstephens78 12:5d913b57da7c 71 }
jstephens78 12:5d913b57da7c 72 }
jstephens78 12:5d913b57da7c 73 }
jstephens78 12:5d913b57da7c 74 }
jstephens78 12:5d913b57da7c 75
jstephens78 12:5d913b57da7c 76
jstephens78 12:5d913b57da7c 77 void BluefruitController::reset()
jstephens78 12:5d913b57da7c 78 {
jstephens78 12:5d913b57da7c 79 state = STATE_IDLE;
jstephens78 12:5d913b57da7c 80 buff_len = 0;
jstephens78 12:5d913b57da7c 81 buff_i = 0;
jstephens78 12:5d913b57da7c 82 }
jstephens78 12:5d913b57da7c 83
jstephens78 12:5d913b57da7c 84 void BluefruitController::parseButton()
jstephens78 12:5d913b57da7c 85 {
jstephens78 12:5d913b57da7c 86 unsigned int id = buff[0] - '1';
jstephens78 12:5d913b57da7c 87 bool val = buff[1] - '0';
jstephens78 12:5d913b57da7c 88
jstephens78 12:5d913b57da7c 89 if (id >= 8) return;
jstephens78 12:5d913b57da7c 90
jstephens78 12:5d913b57da7c 91 button[id] = val;
jstephens78 12:5d913b57da7c 92 }
jstephens78 12:5d913b57da7c 93
jstephens78 12:5d913b57da7c 94 void BluefruitController::parseQuaternion()
jstephens78 12:5d913b57da7c 95 {
jstephens78 12:5d913b57da7c 96 for (int i = 0; i < 4; i++) {
jstephens78 12:5d913b57da7c 97 quaternion[i] = *(((float*)buff) + i);
jstephens78 12:5d913b57da7c 98 }
jstephens78 12:5d913b57da7c 99 }