New program flow

Are missing:
* notA ~ notF
* endnr command
* E F and big FITA arrows
This commit is contained in:
giuliof 2018-12-18 19:21:54 +01:00
parent f7c4a46b9f
commit baef89a9c4
1 changed files with 134 additions and 182 deletions

View File

@ -42,19 +42,68 @@ int midend; //value of middle digit to indicate end nr (0..9)
int rigend; //value of middle digit to indicate end nr (0..9)
int comend; //value of combined left and middle digit. In case of practise end the P from the left digit should be projected. else the middle digit (0..9 or 15 (15 means P to indicate practise end))
#define CHAR_P 15
#define CHAR_P 15
#define CHAR_DASH 10
const uint8_t segment[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40, 0x00, 0x3f, 0x00, 0x00, 0x73}; //0,1,2,3,4,5,6,7,8,9,-, , , , ,P
enum PanelSide_t {LEFT, RIGHT};
enum BuzzerStatus_t {BUZZER_OFF, BUZZER_ON};
struct cfg_t {
PanelSide_t PanelSide : 1;
BuzzerStatus_t BuzzerStatus : 1;
enum PanelSide_t
{
LEFT = 0,
RIGHT = 1
};
enum BuzzerStatus_t
{
BUZZER_OFF,
BUZZER_ON
};
struct cfg_t
{
PanelSide_t PanelSide : 1;
BuzzerStatus_t BuzzerStatus : 1;
uint8_t abcd : 4; // unclear meaning
uint8_t competition : 3; // unclear meaning
uint8_t GroupsNumber : 6;
uint8_t : 0;
} cfg;
struct trafficvalue_t
{
uint8_t cmd : 3;
BuzzerStatus_t buzzer : 1;
uint8_t TrafficLightLeft : 3;
uint8_t TrafficLightRight : 3;
uint8_t ArcherGroups : 6;
//uint8_t : 0;
};
struct statevalue_t
{
uint8_t cmd : 4;
uint8_t abcd : 4; // unclear meaning
uint8_t competition : 3; // unclear meaning
uint8_t : 3;
uint8_t GroupsNumber : 6;
//uint8_t : 0;
};
struct digitsvalue_t
{
uint8_t cmd : 1;
PanelSide_t side : 1;
uint8_t sideOverride : 1;
uint8_t minutes : 1;
uint8_t rDigit : 4;
uint8_t mDigit : 4;
uint8_t lDigit : 4;
};
union ReceivedCommand_t {
int raw;
trafficvalue_t t;
statevalue_t s;
digitsvalue_t d;
} ReceivedCommand;
void setup()
{
@ -66,8 +115,8 @@ void setup()
DDRC = 0xFF;
// Load system configuration
cfg.BuzzerStatus = digitalRead(A4) ? BUZZER_ON : BUZZER_OFF;
cfg.PanelSide = digitalRead(A5) ? RIGHT : LEFT;
cfg.BuzzerStatus = digitalRead(A4) ? BUZZER_ON : BUZZER_OFF;
cfg.PanelSide = digitalRead(A5) ? RIGHT : LEFT;
remember1 = 0;
loop1 = 0;
@ -99,7 +148,7 @@ void loop()
if (digit == '\n')
{
// Make string conversion
serialvalue = inputString.toInt();
ReceivedCommand.raw = inputString.toInt();
inputString = "";
// Decode command
@ -114,67 +163,92 @@ void loop()
// status info
// Right
// Left
// TODO: uint8_t PORTUPPERCASE will be replaced by according PORTx
// Parsing of DIGITS command
if (ReceivedCommand.d.cmd == 0b0)
{
// Parse command only if is same side as this panel (or comamnd says to override)
if (ReceivedCommand.d.sideOverride || ReceivedCommand.d.side == cfg.PanelSide)
{
uint8_t PORTLEFT = segment[ReceivedCommand.d.lDigit];
uint8_t PORTMID = segment[ReceivedCommand.d.mDigit];
uint8_t PORTRIGHT = segment[ReceivedCommand.d.rDigit];
}
if ((serialvalue & 0x01) && not(serialvalue & 0x06))
// Turn on : between minutes and seconds only if count is in minutes and its digit is a representable value (not dash)
if (ReceivedCommand.d.lDigit != CHAR_DASH && ReceivedCommand.d.minutes)
uint8_t PORTCOMMA |= _BV(7);
}
// Parsing of TRAFFIC command
else if (ReceivedCommand.t.cmd < 0b111)
{
trafficvalue = serialvalue;
}; //traficlights
// if((serialvalue&0x03) && not(serialvalue&0x0C)){ abcdvalue=serialvalue;}; //ABCD details
if ((serialvalue & 0x01) && (serialvalue & 0x02) && (serialvalue & 0x04) && not(serialvalue & 0x08))
{
endnrvalue = serialvalue;
}; //endnr info
if ((serialvalue & 0x01) && (serialvalue & 0x02) && (serialvalue & 0x04) && (serialvalue & 0x08))
{
statevalue = serialvalue;
}; //state info
if (cfg.BuzzerStatus == BUZZER_ON)
{
uint8_t PORTBUZZER |= ReceivedCommand.t.buzzer;
}
if ((not(serialvalue & 0x01)) && ((serialvalue & 0x02) or (serialvalue & 0x04)))
if (cfg.PanelSide == RIGHT)
uint8_t PORTSEMAPHORE |= ReceivedCommand.t.TrafficLightRight;
else
uint8_t PORTSEMAPHORE |= ReceivedCommand.t.TrafficLightLeft;
uint8_t PORTABCD |= ReceivedCommand.t.ArcherGroups;
// at the moment ignore EF, not in this panel
/*
digitalWrite(6, (((statevalue >> 7) & B00000111) != 2) and (trafficvalue & 0x4000)); //E
digitalWrite(7, (((statevalue >> 7) & B00000111) != 2) and (trafficvalue & 0x8000)); //F
digitalWrite(A15, (((statevalue >> 7) & B00000111) == 2) and (trafficvalue & 0x4000)); //green right arrow for fita finals
digitalWrite(39, (((statevalue >> 7) & B00000111) == 2) and (trafficvalue & 0x8000)); //green left arrow for fita finals
*/
}
// Parsing of STATE command
else if (ReceivedCommand.s.cmd == 0b1111)
{
rightcountvalue = serialvalue;
}; //determine the digits value of the rightside
if ((not(serialvalue & 0x01)) && ((not(serialvalue & 0x02)) or (serialvalue & 0x04)))
cfg.abcd = ReceivedCommand.s.abcd;
cfg.competition = ReceivedCommand.s.competition;
cfg.GroupsNumber = ReceivedCommand.s.GroupsNumber;
}
// not managed endnr value
/*
lefend = ((endnrvalue >> 4) & B00001111);
midend = ((endnrvalue >> 8) & B00001111);
rigend = ((endnrvalue >> 12) & B00001111);
if (lefend == 15)
{
leftcountvalue = serialvalue;
}; //determine the digits value of the leftside
comend = lefend;
}
else
{
comend = midend;
};
digitalWrite(24, ((segment[comend] & 0x001)) ? HIGH : LOW); //left combined end digit segment A
digitalWrite(26, ((segment[comend] & 0x002)) ? HIGH : LOW); //left combined end digit segment B
digitalWrite(28, ((segment[comend] & 0x004)) ? HIGH : LOW); //left combined end digit segment C
digitalWrite(30, ((segment[comend] & 0x008)) ? HIGH : LOW); //left combined end digit segment D
digitalWrite(32, ((segment[comend] & 0x010)) ? HIGH : LOW); //left combined end digit segment E
digitalWrite(34, ((segment[comend] & 0x020)) ? HIGH : LOW); //left combined end digit segment F
digitalWrite(36, ((segment[comend] & 0x040)) ? HIGH : LOW); //left combined end digit segment G
digitalWrite(40, ((segment[rigend] & 0x001)) ? HIGH : LOW); //right end digit segment A
digitalWrite(42, ((segment[rigend] & 0x002)) ? HIGH : LOW); //right end digit segment B
digitalWrite(44, ((segment[rigend] & 0x004)) ? HIGH : LOW); //right end digit segment C
digitalWrite(46, ((segment[rigend] & 0x008)) ? HIGH : LOW); //right end digit segment D
digitalWrite(48, ((segment[rigend] & 0x010)) ? HIGH : LOW); //right end digit segment E
digitalWrite(50, ((segment[rigend] & 0x020)) ? HIGH : LOW); //right end digit segment F
digitalWrite(52, ((segment[rigend] & 0x040)) ? HIGH : LOW); //right end digit segment G
*/
}
else
else // if (char) digit != '\n'
{
inputString += digit;
}
}
//Trafic lights and ABCD lights switching (independent to left/right switch connected to A5)
//Traficvalue bit 3 -14 show buzzer, green right side, orange right side, red right side, green left side, orange left side, red left side, A, B, C and D.
//digitalWrite(X, (trafficvalue&0x0008)?HIGH:LOW); //buzzer
//digitalWrite(X, (trafficvalue&0x0010)?HIGH:LOW); //green right side
//digitalWrite(X, (trafficvalue&0x0020)?HIGH:LOW); //orange right side
//digitalWrite(X, (trafficvalue&0x0040)?HIGH:LOW); //red right side
//digitalWrite(X, (trafficvalue&0x0080)?HIGH:LOW); //green left side
//digitalWrite(X, (trafficvalue&0x0100)?HIGH:LOW); //orange left side
//digitalWrite(X, (trafficvalue&0x0200)?HIGH:LOW); //red left side
digitalWrite(17, (trafficvalue & 0x0400) ? HIGH : LOW); //A
digitalWrite(16, (trafficvalue & 0x0800) ? HIGH : LOW); //B
digitalWrite(15, (trafficvalue & 0x1000) ? HIGH : LOW); //C
digitalWrite(14, (trafficvalue & 0x2000) ? HIGH : LOW); //D
digitalWrite(6, (((statevalue >> 7) & B00000111) != 2) and (trafficvalue & 0x4000)); //E
digitalWrite(7, (((statevalue >> 7) & B00000111) != 2) and (trafficvalue & 0x8000)); //F
digitalWrite(A15, (((statevalue >> 7) & B00000111) == 2) and (trafficvalue & 0x4000)); //green right arrow for fita finals
digitalWrite(39, (((statevalue >> 7) & B00000111) == 2) and (trafficvalue & 0x8000)); //green left arrow for fita finals
//(((((statevalue>>7)&B00000111)=2)?LOW:HIGH) and )
if (cfg.BuzzerStatus == BUZZER_ON) // digitalRead(A4)
{ //buzzer yes/no switch
digitalWrite(18, trafficvalue & 0x0008); //buzzer
}
else
{
digitalWrite(18, LOW); //if switch on A4 is off, buzzer must be always off
};
//last 2 bits of trafic value show the number of archers. In this way we can determine notA, notB, notC and notD
/*
if (blinkk == 0)
{
blinkk = 300;
@ -201,128 +275,6 @@ void loop()
blinkr = (blinkk > 200);
blinkl = 0;
};
*/
if (((statevalue >> 4) & B00000111) != 6)
{
digitalWrite(2, ((((statevalue >> 13) & B00000111) >= 1) and (((statevalue >> 7) & B00000111) != 2) and (((statevalue >> 7) & B00000111) != 4) and not(trafficvalue & 0x0400))); //notA. Is on if Archer A exist but it is not his/her turn to shoot
digitalWrite(3, ((((statevalue >> 13) & B00000111) >= 1) and (((statevalue >> 7) & B00000111) != 2) and (((statevalue >> 7) & B00000111) != 4) and not(trafficvalue & 0x0800))); //notB. Is on if Archer B exist but it is not his/her turn to shoot
digitalWrite(4, ((((statevalue >> 13) & B00000111) >= 2) and (((statevalue >> 7) & B00000111) != 2) and (((statevalue >> 7) & B00000111) != 4) and not(trafficvalue & 0x1000))); //notC. Is on if Archer C exist but it is not his/her turn to shoot
digitalWrite(5, ((((statevalue >> 13) & B00000111) >= 3) and (((statevalue >> 7) & B00000111) != 2) and (((statevalue >> 7) & B00000111) != 4) and not(trafficvalue & 0x2000))); //notD. Is on if Archer D exist but it is not his/her turn to shoot
digitalWrite(8, ((((statevalue >> 13) & B00000111) >= 4) and (((statevalue >> 7) & B00000111) != 2) and (((statevalue >> 7) & B00000111) != 4) and not(trafficvalue & 0x4000))); //notE. Is on if Archer E exist but it is not his/her turn to shoot
digitalWrite(9, ((((statevalue >> 13) & B00000111) >= 5) and (((statevalue >> 7) & B00000111) != 2) and (((statevalue >> 7) & B00000111) != 4) and not(trafficvalue & 0x8000))); //notF. Is on if Archer F exist but it is not his/her turn to shoot
}
else
{
digitalWrite(2, (blinkl));
digitalWrite(3, (blinkl));
digitalWrite(4, (blinkr));
digitalWrite(5, (blinkr));
digitalWrite(8, (blinkl));
digitalWrite(9, (blinkl));
};
//outputs depending on switch (A5 input) if right side or leftside is used
if (cfg.PanelSide == RIGHT)
{ //right side
//Trafic lights:
digitalWrite(19, (trafficvalue & 0x0010) ? HIGH : LOW); //green right side
digitalWrite(20, (trafficvalue & 0x0020) ? HIGH : LOW); //orange right side
digitalWrite(21, (trafficvalue & 0x0040) ? HIGH : LOW); //red right side
//digits
digitalWrite(23, (rightcountvalue & 0x0008) and (leftdigit == CHAR_DASH); //dots to indicate minutes or seconds indication
rightdigit = ((rightcountvalue >> 4) & B00001111);
middigit = ((rightcountvalue >> 8) & B00001111);
leftdigit = ((rightcountvalue >> 12) & B00001111);
}
else //left side
{
//Trafic lights:
digitalWrite(19, trafficvalue & 0x0080); //green left side
digitalWrite(20, trafficvalue & 0x0100); //orange left side
digitalWrite(21, trafficvalue & 0x0200); //red left side
//digits
digitalWrite(23, (leftcountvalue & 0x0008) and (leftdigit == CHAR_DASH)); //dots to indicate minutes or seconds indication
rightdigit = ((leftcountvalue >> 4) & B00001111);
middigit = ((leftcountvalue >> 8) & B00001111);
leftdigit = ((leftcountvalue >> 12) & B00001111);
};
digitalWrite(37, ((segment[leftdigit] & 0x001)) ? HIGH : LOW); //left digit segment A
digitalWrite(35, ((segment[leftdigit] & 0x002)) ? HIGH : LOW); //left digit segment B
digitalWrite(33, ((segment[leftdigit] & 0x004)) ? HIGH : LOW); //left digit segment C
digitalWrite(31, ((segment[leftdigit] & 0x008)) ? HIGH : LOW); //left digit segment D
digitalWrite(29, ((segment[leftdigit] & 0x010)) ? HIGH : LOW); //left digit segment E
digitalWrite(27, ((segment[leftdigit] & 0x020)) ? HIGH : LOW); //left digit segment F
digitalWrite(25, ((segment[leftdigit] & 0x040)) ? HIGH : LOW); //left digit segment G
digitalWrite(53, ((segment[middigit] & 0x001)) ? HIGH : LOW); //middle digit segment A
digitalWrite(51, ((segment[middigit] & 0x002)) ? HIGH : LOW); //middle digit segment B
digitalWrite(49, ((segment[middigit] & 0x004)) ? HIGH : LOW); //middle digit segment C
digitalWrite(47, ((segment[middigit] & 0x008)) ? HIGH : LOW); //middle digit segment D
digitalWrite(45, ((segment[middigit] & 0x010)) ? HIGH : LOW); //middle digit segment E
digitalWrite(43, ((segment[middigit] & 0x020)) ? HIGH : LOW); //middle digit segment F
digitalWrite(41, ((segment[middigit] & 0x040)) ? HIGH : LOW); //middle digit segment G
digitalWrite(A8, ((segment[rightdigit] & 0x001)) ? HIGH : LOW); //right digit segment A
digitalWrite(A9, ((segment[rightdigit] & 0x002)) ? HIGH : LOW); //right digit segment B
digitalWrite(A10, ((segment[rightdigit] & 0x004)) ? HIGH : LOW); //right digit segment C
digitalWrite(A11, ((segment[rightdigit] & 0x008)) ? HIGH : LOW); //right digit segment D
digitalWrite(A12, ((segment[rightdigit] & 0x010)) ? HIGH : LOW); //right digit segment E
digitalWrite(A13, ((segment[rightdigit] & 0x020)) ? HIGH : LOW); //right digit segment F
digitalWrite(A14, ((segment[rightdigit] & 0x040)) ? HIGH : LOW); //right digit segment G
lefend = ((endnrvalue >> 4) & B00001111);
midend = ((endnrvalue >> 8) & B00001111);
rigend = ((endnrvalue >> 12) & B00001111);
if (lefend == 15)
{
comend = lefend;
}
else
{
comend = midend;
};
digitalWrite(24, ((segment[comend] & 0x001)) ? HIGH : LOW); //left combined end digit segment A
digitalWrite(26, ((segment[comend] & 0x002)) ? HIGH : LOW); //left combined end digit segment B
digitalWrite(28, ((segment[comend] & 0x004)) ? HIGH : LOW); //left combined end digit segment C
digitalWrite(30, ((segment[comend] & 0x008)) ? HIGH : LOW); //left combined end digit segment D
digitalWrite(32, ((segment[comend] & 0x010)) ? HIGH : LOW); //left combined end digit segment E
digitalWrite(34, ((segment[comend] & 0x020)) ? HIGH : LOW); //left combined end digit segment F
digitalWrite(36, ((segment[comend] & 0x040)) ? HIGH : LOW); //left combined end digit segment G
digitalWrite(40, ((segment[rigend] & 0x001)) ? HIGH : LOW); //right end digit segment A
digitalWrite(42, ((segment[rigend] & 0x002)) ? HIGH : LOW); //right end digit segment B
digitalWrite(44, ((segment[rigend] & 0x004)) ? HIGH : LOW); //right end digit segment C
digitalWrite(46, ((segment[rigend] & 0x008)) ? HIGH : LOW); //right end digit segment D
digitalWrite(48, ((segment[rigend] & 0x010)) ? HIGH : LOW); //right end digit segment E
digitalWrite(50, ((segment[rigend] & 0x020)) ? HIGH : LOW); //right end digit segment F
digitalWrite(52, ((segment[rigend] & 0x040)) ? HIGH : LOW); //right end digit segment G
//Read buttons
buttonvalue = 0;
// if (digitalRead(A4)){buttonvalue=5;};
// if (digitalRead(A3)){buttonvalue=4;};
// if (digitalRead(A0)){buttonvalue=1;}; //next
// if (digitalRead(A1)){buttonvalue=2;};
// if (digitalRead(A2)){buttonvalue=3;};
if (loop1 == 0)
{
if (buttonvalue != remember1)
{
Serial.print(buttonvalue);
delay(3);
remember1 = buttonvalue;
loop1 = 15;
//digitalWrite(2, 1);
};
}
else
{
delay(10);
//if (loop1>7){blinkr=1;};
loop1--;
};
}