ac-real-io/acrealio/IoBoard.cpp

323 lines
7.4 KiB
C++

#include "Arduino.h"
#include "IoBoard.h"
byte lightPin[] = {LT_START, LT_A, LT_B, LT_C, LT_D, LT_FXL, LT_FXR};
//contructor
IoBoard::IoBoard(char* rCode)
{
byte rType[] = {0x09, 0x06, 0x00, 0x00};
byte rVersion[] = {0x01, 0x01, 0x00};
setVersion(rType, 0x00, rVersion, rCode);
//pins for pushbuttons
//fx R
pinMode(BT_FXR,INPUT);
digitalWrite(BT_FXR, HIGH);
//fx L
pinMode(BT_FXL,INPUT);
digitalWrite(BT_FXL, HIGH);
//A
pinMode(BT_A,INPUT);
digitalWrite(BT_A, HIGH);
//B
pinMode(BT_B,INPUT);
digitalWrite(BT_B, HIGH);
//C
pinMode(BT_C,INPUT);
digitalWrite(BT_C, HIGH);
//D
pinMode(BT_D,INPUT);
digitalWrite(BT_D, HIGH);
//Start
pinMode(BT_START,INPUT);
digitalWrite(BT_START, HIGH);
//test
pinMode(BT_TEST, INPUT);
digitalWrite(BT_TEST,HIGH);
//service
pinMode(BT_SVC, INPUT);
digitalWrite(BT_SVC,HIGH);
//pins for volume buttons
pinMode(VOLR_A, INPUT);
digitalWrite(VOLR_A,HIGH);
pinMode(VOLR_B, INPUT);
digitalWrite(VOLR_B,HIGH);
pinMode(VOLL_A, INPUT);
digitalWrite(VOLL_A,HIGH);
pinMode(VOLL_B, INPUT);
digitalWrite(VOLL_B,HIGH);
//for key lights
for (int i = 0;i<7; i++) {
pinMode(lightPin[i], OUTPUT);
}
//for rgb leds
pinMode(LED1_R, OUTPUT);
pinMode(LED1_G, OUTPUT);
pinMode(LED1_B, OUTPUT);
pinMode(LED2_R, OUTPUT);
pinMode(LED2_G, OUTPUT);
pinMode(LED2_B, OUTPUT);
pinMode(LED3_R, OUTPUT);
pinMode(LED3_G, OUTPUT);
pinMode(LED3_B, OUTPUT);
pinMode(LED4_R, OUTPUT);
pinMode(LED4_G, OUTPUT);
pinMode(LED4_B, OUTPUT);
pinMode(LED5_R, OUTPUT);
pinMode(LED5_G, OUTPUT);
pinMode(LED5_B, OUTPUT);
pinMode(LED6_R, OUTPUT);
pinMode(LED6_G, OUTPUT);
pinMode(LED6_B, OUTPUT);
}
void IoBoard::init()
{
keys= 0x00;
keysLights = 0x00;
test =0;
LED6.setPins(LED6_R, LED6_G, LED6_B);
valLED6_R = 0;
valLED6_G = 0;
valLED6_B = 0;
//for volume encoders
volR = 0;
volRState = 0;
volL = 0;
volLState = 0;
}
void IoBoard::update()
{
keys = 0x00;
if (!digitalRead(BT_FXR))
keys |= 0x01;
if (!digitalRead(BT_FXL))
keys |= 0x02;
if (!digitalRead(BT_A))
keys |= 0x20;
if (!digitalRead(BT_B))
keys |= 0x10;
if (!digitalRead(BT_C))
keys |= 0x08;
if (!digitalRead(BT_D))
keys |= 0x04;
if (!digitalRead(BT_START))
keys |= 0x40;
test= !digitalRead(BT_TEST);
svc= !digitalRead(BT_SVC);
//read volume encoders
byte volRS = volRState & 3;
if (digitalRead(VOLR_B)) volRS |= 4;
if (digitalRead(VOLR_A)) volRS |= 8;
volRState = (volRS >> 2);
switch (volRS)
{
case 0: case 5: case 10: case 15:
break;
case 1: case 7: case 8: case 14:
volR++;
break;
case 2: case 4: case 11: case 13:
volR--;
break;
case 3: case 12:
volR += 2;
break;
default:
volR -= 2;
break;
}
byte volLS = volLState & 3;
if (digitalRead(VOLL_B)) volLS |= 4;
if (digitalRead(VOLL_A)) volLS |= 8;
volLState = (volLS >> 2);
switch (volLS)
{
case 0: case 5: case 10: case 15:
break;
case 1: case 7: case 8: case 14:
volL++;
break;
case 2: case 4: case 11: case 13:
volL--;
break;
case 3: case 12:
volL += 2;
break;
default:
volL -= 2;
break;
}
// Update the software PWM RGB light
LED6.setPWM(valLED6_R, valLED6_G, valLED6_B);
}
short IoBoard::processRequest(byte* request, byte* answer)
{
answer[0] = request[0] | 0x80; // node id
answer[1] = request[1]; // type
answer[2] = request[2]; // command
answer[3] = request[3]; // paquet id
answer[4] = 0; // data length
switch (answer[2]) // switch on the command
{
//
// get version
case 0x02:
answer[4] = 0x2C;
memcpy(answer+5, getVersion(), 0x2C);
break;
//
// init?
case 0x00:
case 0x03:
case 0x16:
case 0x20:
case 0x30:
answer[4] = 1;
answer[5] = 0x00;
break;
case 0x13: //set outputs and get inputs
/* outputs lights format:
byte 2 : 10 : start
20 : A
40 : B
80 : C
byte 3 : 01 : D
02 : FX L
04 : FX R
byte 4-6 : wing left up RGB
byte 7-9 : wing right up RGB
byte 10-12 : wing left low RGB
byte 13-15 : wing right low RGB
byte 16-18 : woofer RGB
byte 19-21 : controller RGB
*/
//keys lights
keysLights = (request[5+3] & 0x07) << 4 | (request[5+2] & 0xF0) >> 4;
for (int i = 0;i<7; i++) {
digitalWrite(lightPin[i], (keysLights >> i) & 1);
}
//rgb leds
analogWrite(LED1_R,request[5+4]<<1);
analogWrite(LED1_G,request[5+5]<<1);
analogWrite(LED1_B,request[5+6]<<1);
analogWrite(LED2_R,request[5+7]<<1);
analogWrite(LED2_G,request[5+8]<<1);
analogWrite(LED2_B,request[5+9]<<1);
analogWrite(LED3_R,request[5+10]<<1);
analogWrite(LED3_G,request[5+11]<<1);
analogWrite(LED3_B,request[5+12]<<1);
analogWrite(LED4_R,request[5+13]<<1);
analogWrite(LED4_G,request[5+14]<<1);
analogWrite(LED4_B,request[5+15]<<1);
analogWrite(LED5_R,request[5+16]<<1);
analogWrite(LED5_G,request[5+17]<<1);
analogWrite(LED5_B,request[5+18]<<1);
// Get the requested values for the software PWM RGB light
valLED6_R = request[5+19]<<1;
valLED6_G = request[5+20]<<1;
valLED6_B = request[5+21]<<1;
/* input control format:
byte 0 : 8 high bits of L vol
byte 1 : 2 higher bits : lower bits of L VOL
20 : test
10 : service
04 : coin
byte 2 : 8 high bits of R vol
byte 3 : 2 higher bits : lower bits of R VOL
byte 4 : 8 high bits of ex analog1
byte 5 : 2 higher bits : lower bits of ex analog1
byte 6 : 8 high bits of ex analog2
byte 7 : 2 higher bits : lower bits of ex analog2
byte 8 : nothing ?
byte 9 : 20 : headphone
10 : recorder
08 : start
04 : A
02 : B
01 : C
byte 10 : nothing ?
byte 11 : 20 : D
10 : fx L
08 : fx R
04 : ex bt1
02 : ex bt2
byte 12 : 80 : ex bt3 (not)
byte 13 : 80 : ex bt4 (not)
*/
answer[4] = 0x10;
memset(answer+5, 0x00, 0x10);
answer[9+5] = keys >>3;
answer[11+5] = keys <<3;
{
unsigned int volRreal = volR*SDVX_VOL_SENS;
unsigned int volLreal = volL*SDVX_VOL_SENS;
answer[0+5] = volLreal>>2;
answer[1+5] = volLreal<<6;
answer[2+5] = volRreal>>2;
answer[3+5] = volRreal<<6;
if (test)
answer[1+5] |= 0x20;
if (svc)
answer[1+5] |= 0x10;
}
answer[12+5] = 0x80;
answer[13+5] = 0x80;
break;
}
}