save/load new parameters (Battery,AutoStart,Player2/3/2), protocol implementation

This commit is contained in:
Luca Borsari 2021-07-21 19:19:47 +02:00
parent 08e73f894e
commit 0b26fd4381
6 changed files with 109 additions and 48 deletions

View file

@ -1,13 +1,22 @@
Revisions history
-----------------
* 2021-12-13: Ver 0.9.6 LAB - Gerardo
...............................
- Charge battery function and telemetry test code (add BATTERY ( ",<0-100 value> to end of "p" serial status ))
- Add BATTERY_DELTA variable for decremet battery on push buton flag change
- Add BATTERY_MIN for user warning on low battery status
- Add blink efect on min battery condition
- Quit tail lap efect
- Add coin to main track for BATTERY_MODE=1
* 2021-07-20: Ver 0.9.6 - Luca - Branch: "lab"
...............................................
- Manage config parameters (load/save/protocol) for:
- NEW: Autostart ("G")
- NEW: Battery ("E")
- NEW: Players number ("P")
- UPD: "Q" ("Get configuration" output changed)
- UPD: "~" ---> "*" (Commmand ID for "Leave configuration mode" changed)
* 2021-07-13: Ver 0.9.6 - Gerardo - Branch: "lab"
- Charge battery function and telemetry test code (add BATTERY ( ",<0-100 value> to end of "p" serial status ))
- Add BATTERY_DELTA variable for decremet battery on push buton flag change
- Add BATTERY_MIN for user warning on low battery status
- Add blink efect on min battery condition
- Quit tail lap efect
- Add coin to main track for BATTERY_MODE=1
* 2020-12-17: Ver 0.9.6- Luca // Gitlab Commit = 0.9.6a
- Removed dependency from "AsyncSerialLib"

View file

@ -157,6 +157,32 @@ int autostart_configure( track_t* tck, int autostart ) {
return 0;
}
int players_n_configure( track_t* tck, int val ) {
switch(val){
case 2 :
param_option_set(&tck->cfg, PLAYER_3_OPTION, false);
param_option_set(&tck->cfg, PLAYER_4_OPTION, false);
break;
case 3 :
param_option_set(&tck->cfg, PLAYER_3_OPTION, true);
param_option_set(&tck->cfg, PLAYER_4_OPTION, false);
break;
case 4 :
param_option_set(&tck->cfg, PLAYER_3_OPTION, true);
param_option_set(&tck->cfg, PLAYER_4_OPTION, true);
break;
default:
return(-1);
}
return(0);
}
int boxlen_configure( track_t* tck, int box_len, int boxalwaysOn ) {
struct cfgtrack* cfg = &tck->cfg.track;

View file

@ -91,6 +91,8 @@ int tracklen_configure( track_t* tck, int nled );
int autostart_configure( track_t* tck, int autostart );
int players_n_configure( track_t* tck, int val );
int boxlen_configure( track_t* tck, int box_len, int boxalwaysOn );
int physic_configure( track_t* tck, float kgp, float kfp );

View file

@ -30,6 +30,9 @@ void param_setdefault( struct cfgparam* cfg ) {
cfg->track.kf = 0.015; // friction constant
cfg->track.kg = 0.006; // gravity constant - Used in Slope
param_option_set(cfg, PLAYER_3_OPTION, PLAYER_3);
param_option_set(cfg, PLAYER_4_OPTION, PLAYER_4);
}

View file

@ -16,9 +16,11 @@ extern "C"{
#define BOXLEN 60
#define NUMLAP 5
#define BATTERY_MODE false
#define AUTOSTART_MODE true
#define AUTOSTART_MODE false
#define BOX_ALWAYS_ON false
#define SLOPE_ALWAYS_ON false
#define PLAYER_3 false
#define PLAYER_4 false
//////////////////////////////////////////////////////////////////
@ -29,8 +31,8 @@ enum cfgparam_option_bit {
AUTOSTART_MODE_OPTION = 1,
BOX_MODE_OPTION = 2,
SLOPE_MODE_OPTION = 3,
NOT_USED_1_OPTION = 4,
NOT_USED_2_OPTION = 5,
PLAYER_3_OPTION = 4,
PLAYER_4_OPTION = 5,
NOT_USED_3_OPTION = 6,
NOT_USED_4_OPTION = 7,
};

View file

@ -31,14 +31,13 @@
*/
// 2021/07/14 - Ver 0.9.6 - lab branch
// 2021/07/20 - Ver 0.9.6 - lab branch
// --see changelog.txt
char const softwareId[] = "A4P0"; // A4P -> A = Open LED Race, 4P0 = Game ID (4P = 4 Players, 0=Type 0)
char const version[] = "0.9.6";
#include <Adafruit_NeoPixel.h>
#include <EEPROM.h>
#include "olr-lib.h"
@ -201,13 +200,13 @@ void setup() {
race.numcars = 2;
if( controller_isActive( DIG_CONTROL_3 )) {
if( controller_isActive( DIG_CONTROL_3 ) || param_option_is_active(&tck.cfg, PLAYER_3_OPTION) || param_option_is_active(&tck.cfg, PLAYER_4_OPTION) ) {
controller_init( &switchs[2], DIGITAL_MODE, DIG_CONTROL_3 );
car_init( &cars[2], &switchs[2], COLOR3 );
++race.numcars;
}
if( controller_isActive( DIG_CONTROL_4 )) {
if( controller_isActive( DIG_CONTROL_4 ) || param_option_is_active(&tck.cfg, PLAYER_4_OPTION)) {
controller_init( &switchs[3], DIGITAL_MODE, DIG_CONTROL_4 );
car_init( &cars[3], &switchs[3], COLOR4 );
++race.numcars;
@ -278,40 +277,41 @@ void loop() {
break;
case READY:
{ if(param_option_is_active(&tck.cfg, AUTOSTART_MODE_OPTION)){ // Auto-Start Mode ON
if(customDelay.elapsed()) {
for( int i = 0; i < race.numcars; ++i) {
car_resetPosition( &cars[i] );
cars[i].repeats = 0;
}
tck.ledcoin = COIN_RESET;
race.phase = COUNTDOWN;
send_phase( race.phase );
}
}
else {int pstart=0;
strip_clear( &tck );
if( ramp_isactive( &tck ) )
draw_ramp( &tck );
if( box_isactive( &tck ) )
draw_box_entrypoint( &tck );
{
if(param_option_is_active(&tck.cfg, AUTOSTART_MODE_OPTION)){ // Auto-Start Mode ON
if(customDelay.elapsed()) {
for( int i = 0; i < race.numcars; ++i) {
if (controller_getStatus(cars[i].ct)==false){
car_resetPosition( &cars[i] );
Serial.println(i);
track.setPixelColor(i,cars[i].color);
cars[i].repeats = 0;
pstart++;}
}
car_resetPosition( &cars[i] );
cars[i].repeats = 0;
}
tck.ledcoin = COIN_RESET;
race.phase = COUNTDOWN;
send_phase( race.phase );
}
} else {
int pstart=0;
strip_clear( &tck );
if( ramp_isactive( &tck ) )
draw_ramp( &tck );
if( box_isactive( &tck ) )
draw_box_entrypoint( &tck );
for( int i = 0; i < race.numcars; ++i) {
if (controller_getStatus(cars[i].ct)==false){
car_resetPosition( &cars[i] );
//Serial.println(i);
track.setPixelColor(i,cars[i].color);
cars[i].repeats = 0;
pstart++;
}
}
track.setPixelColor(LED_SEMAPHORE , ((millis()/5)%64)*0x010100 );
track.show();
if (pstart==race.numcars){tck.ledcoin = COIN_RESET;
race.phase = COUNTDOWN;
send_phase( race.phase );}
track.setPixelColor(LED_SEMAPHORE , ((millis()/5)%64)*0x010100 );
track.show();
if (pstart==race.numcars){tck.ledcoin = COIN_RESET;
race.phase = COUNTDOWN;
send_phase( race.phase );}
};
};
}
break;
@ -725,7 +725,7 @@ ack_t manageSerialCommand() {
}
break;
case '~' : // Exit "Configure Mode"
case '*' : // Exit "Configure Mode"
{
ack.type = cmd[0];
if(race.phase == CONFIG) { // Ignore command if Board is not in "Configure Mode"
@ -912,6 +912,23 @@ ack_t manageSerialCommand() {
}
break;
case 'P' : //Parse Player 3/4 configuration -> P[2|3|4]
{
ack.type = cmd[0];
char * pch = strtok (cmd,"P");
if( !pch ) return ack;
int autostart = atoi( cmd + 1 );
int err = players_n_configure( &tck, autostart);
if( err ) return ack;
ack.rp = OK;
}
break;
case 'K': // Parse Physic simulation parameters
{
@ -1024,11 +1041,13 @@ ack_t manageSerialCommand() {
EOL );
serialCommand.sendCommand(txbuff);
sprintf( txbuff, "%s:%d,%d,%d,%d%c", "QRC",
sprintf( txbuff, "%s:%d,%d,%d,%d,%d,%d%c", "QRC",
cfg->race.startline,
cfg->race.nlap,
cfg->race.nrepeat,
cfg->race.finishline,
param_option_is_active(&tck.cfg, PLAYER_3_OPTION),
param_option_is_active(&tck.cfg, PLAYER_4_OPTION),
EOL );
serialCommand.sendCommand(txbuff);