save/load new parameters (Battery,AutoStart,Player2/3/2), protocol implementation
This commit is contained in:
parent
08e73f894e
commit
0b26fd4381
6 changed files with 109 additions and 48 deletions
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue