diff --git a/changelog.txt b/changelog.txt index f9f2a91..8602c13 100644 --- a/changelog.txt +++ b/changelog.txt @@ -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" diff --git a/open-led-race/olr-lib.c b/open-led-race/olr-lib.c index bdd3428..75da1c3 100644 --- a/open-led-race/olr-lib.c +++ b/open-led-race/olr-lib.c @@ -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; diff --git a/open-led-race/olr-lib.h b/open-led-race/olr-lib.h index 6a9055e..48889cb 100644 --- a/open-led-race/olr-lib.h +++ b/open-led-race/olr-lib.h @@ -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 ); diff --git a/open-led-race/olr-param.c b/open-led-race/olr-param.c index 1054efe..0b897e0 100644 --- a/open-led-race/olr-param.c +++ b/open-led-race/olr-param.c @@ -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); } diff --git a/open-led-race/olr-param.h b/open-led-race/olr-param.h index 103113e..260be89 100644 --- a/open-led-race/olr-param.h +++ b/open-led-race/olr-param.h @@ -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, }; diff --git a/open-led-race/open-led-race.ino b/open-led-race/open-led-race.ino index 0c34e80..034f1bf 100644 --- a/open-led-race/open-led-race.ino +++ b/open-led-race/open-led-race.ino @@ -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 #include #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);