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
|
Revisions history
|
||||||
-----------------
|
-----------------
|
||||||
* 2021-12-13: Ver 0.9.6 LAB - Gerardo
|
|
||||||
...............................
|
* 2021-07-20: Ver 0.9.6 - Luca - 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
|
- Manage config parameters (load/save/protocol) for:
|
||||||
- Add BATTERY_MIN for user warning on low battery status
|
- NEW: Autostart ("G")
|
||||||
- Add blink efect on min battery condition
|
- NEW: Battery ("E")
|
||||||
- Quit tail lap efect
|
- NEW: Players number ("P")
|
||||||
- Add coin to main track for BATTERY_MODE=1
|
- 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
|
* 2020-12-17: Ver 0.9.6- Luca // Gitlab Commit = 0.9.6a
|
||||||
- Removed dependency from "AsyncSerialLib"
|
- Removed dependency from "AsyncSerialLib"
|
||||||
|
|
|
@ -157,6 +157,32 @@ int autostart_configure( track_t* tck, int autostart ) {
|
||||||
return 0;
|
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 ) {
|
int boxlen_configure( track_t* tck, int box_len, int boxalwaysOn ) {
|
||||||
struct cfgtrack* cfg = &tck->cfg.track;
|
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 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 boxlen_configure( track_t* tck, int box_len, int boxalwaysOn );
|
||||||
|
|
||||||
int physic_configure( track_t* tck, float kgp, float kfp );
|
int physic_configure( track_t* tck, float kgp, float kfp );
|
||||||
|
|
|
@ -31,6 +31,9 @@ void param_setdefault( struct cfgparam* cfg ) {
|
||||||
cfg->track.kf = 0.015; // friction constant
|
cfg->track.kf = 0.015; // friction constant
|
||||||
cfg->track.kg = 0.006; // gravity constant - Used in Slope
|
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void param_option_set( struct cfgparam* cfg, uint8_t option, boolean value ) {
|
void param_option_set( struct cfgparam* cfg, uint8_t option, boolean value ) {
|
||||||
|
|
|
@ -16,9 +16,11 @@ extern "C"{
|
||||||
#define BOXLEN 60
|
#define BOXLEN 60
|
||||||
#define NUMLAP 5
|
#define NUMLAP 5
|
||||||
#define BATTERY_MODE false
|
#define BATTERY_MODE false
|
||||||
#define AUTOSTART_MODE true
|
#define AUTOSTART_MODE false
|
||||||
#define BOX_ALWAYS_ON false
|
#define BOX_ALWAYS_ON false
|
||||||
#define SLOPE_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,
|
AUTOSTART_MODE_OPTION = 1,
|
||||||
BOX_MODE_OPTION = 2,
|
BOX_MODE_OPTION = 2,
|
||||||
SLOPE_MODE_OPTION = 3,
|
SLOPE_MODE_OPTION = 3,
|
||||||
NOT_USED_1_OPTION = 4,
|
PLAYER_3_OPTION = 4,
|
||||||
NOT_USED_2_OPTION = 5,
|
PLAYER_4_OPTION = 5,
|
||||||
NOT_USED_3_OPTION = 6,
|
NOT_USED_3_OPTION = 6,
|
||||||
NOT_USED_4_OPTION = 7,
|
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
|
// --see changelog.txt
|
||||||
|
|
||||||
char const softwareId[] = "A4P0"; // A4P -> A = Open LED Race, 4P0 = Game ID (4P = 4 Players, 0=Type 0)
|
char const softwareId[] = "A4P0"; // A4P -> A = Open LED Race, 4P0 = Game ID (4P = 4 Players, 0=Type 0)
|
||||||
char const version[] = "0.9.6";
|
char const version[] = "0.9.6";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <Adafruit_NeoPixel.h>
|
#include <Adafruit_NeoPixel.h>
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
#include "olr-lib.h"
|
#include "olr-lib.h"
|
||||||
|
@ -201,13 +200,13 @@ void setup() {
|
||||||
|
|
||||||
race.numcars = 2;
|
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 );
|
controller_init( &switchs[2], DIGITAL_MODE, DIG_CONTROL_3 );
|
||||||
car_init( &cars[2], &switchs[2], COLOR3 );
|
car_init( &cars[2], &switchs[2], COLOR3 );
|
||||||
++race.numcars;
|
++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 );
|
controller_init( &switchs[3], DIGITAL_MODE, DIG_CONTROL_4 );
|
||||||
car_init( &cars[3], &switchs[3], COLOR4 );
|
car_init( &cars[3], &switchs[3], COLOR4 );
|
||||||
++race.numcars;
|
++race.numcars;
|
||||||
|
@ -278,40 +277,41 @@ void loop() {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case READY:
|
case READY:
|
||||||
{ if(param_option_is_active(&tck.cfg, AUTOSTART_MODE_OPTION)){ // Auto-Start Mode ON
|
{
|
||||||
|
if(param_option_is_active(&tck.cfg, AUTOSTART_MODE_OPTION)){ // Auto-Start Mode ON
|
||||||
if(customDelay.elapsed()) {
|
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 );
|
|
||||||
for( int i = 0; i < race.numcars; ++i) {
|
for( int i = 0; i < race.numcars; ++i) {
|
||||||
if (controller_getStatus(cars[i].ct)==false){
|
car_resetPosition( &cars[i] );
|
||||||
car_resetPosition( &cars[i] );
|
cars[i].repeats = 0;
|
||||||
Serial.println(i);
|
}
|
||||||
track.setPixelColor(i,cars[i].color);
|
tck.ledcoin = COIN_RESET;
|
||||||
cars[i].repeats = 0;
|
race.phase = COUNTDOWN;
|
||||||
pstart++;}
|
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.setPixelColor(LED_SEMAPHORE , ((millis()/5)%64)*0x010100 );
|
||||||
track.show();
|
track.show();
|
||||||
if (pstart==race.numcars){tck.ledcoin = COIN_RESET;
|
if (pstart==race.numcars){tck.ledcoin = COIN_RESET;
|
||||||
race.phase = COUNTDOWN;
|
race.phase = COUNTDOWN;
|
||||||
send_phase( race.phase );}
|
send_phase( race.phase );}
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -725,7 +725,7 @@ ack_t manageSerialCommand() {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '~' : // Exit "Configure Mode"
|
case '*' : // Exit "Configure Mode"
|
||||||
{
|
{
|
||||||
ack.type = cmd[0];
|
ack.type = cmd[0];
|
||||||
if(race.phase == CONFIG) { // Ignore command if Board is not in "Configure Mode"
|
if(race.phase == CONFIG) { // Ignore command if Board is not in "Configure Mode"
|
||||||
|
@ -912,6 +912,23 @@ ack_t manageSerialCommand() {
|
||||||
}
|
}
|
||||||
break;
|
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
|
case 'K': // Parse Physic simulation parameters
|
||||||
{
|
{
|
||||||
|
@ -1024,11 +1041,13 @@ ack_t manageSerialCommand() {
|
||||||
EOL );
|
EOL );
|
||||||
serialCommand.sendCommand(txbuff);
|
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.startline,
|
||||||
cfg->race.nlap,
|
cfg->race.nlap,
|
||||||
cfg->race.nrepeat,
|
cfg->race.nrepeat,
|
||||||
cfg->race.finishline,
|
cfg->race.finishline,
|
||||||
|
param_option_is_active(&tck.cfg, PLAYER_3_OPTION),
|
||||||
|
param_option_is_active(&tck.cfg, PLAYER_4_OPTION),
|
||||||
EOL );
|
EOL );
|
||||||
serialCommand.sendCommand(txbuff);
|
serialCommand.sendCommand(txbuff);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue