Fix bug related to coin in no box mode. Change the name of some functions.

This commit is contained in:
Angel Maldonado 2019-10-15 18:34:00 +02:00
parent 6d37c439db
commit 1498f6581e
5 changed files with 79 additions and 63 deletions

View file

@ -6,7 +6,7 @@ enum {
static float const ACEL = 0.2; static float const ACEL = 0.2;
void setup_controller( void ) { void controller_setup( void ) {
if( DIGITAL_MODE == false ){ if( DIGITAL_MODE == false ){
pinMode(PIN_VCC_ADC1, OUTPUT); pinMode(PIN_VCC_ADC1, OUTPUT);
@ -21,14 +21,14 @@ void setup_controller( void ) {
pinMode( DIG_CONTROL_4, INPUT_PULLUP); pinMode( DIG_CONTROL_4, INPUT_PULLUP);
} }
void init_controller( controller_t* ct, enum ctr_type mode, int pin ) { void controller_init( controller_t* ct, enum ctr_type mode, int pin ) {
ct->mode = mode; ct->mode = mode;
ct->pin = pin; ct->pin = pin;
ct->delta_analog = DELTA_ANALOG; ct->delta_analog = DELTA_ANALOG;
} }
byte get_controllerStatus( controller_t* ct ) { byte controller_getStatus( controller_t* ct ) {
if( ct->mode == DIGITAL_MODE ){ if( ct->mode == DIGITAL_MODE ){
return digitalRead( ct->pin ); return digitalRead( ct->pin );
@ -53,24 +53,24 @@ byte get_controllerStatus( controller_t* ct ) {
} }
float get_controller( controller_t* ct) { float controller_getSpeed( controller_t* ct) {
float speed = 0.0; float speed = 0.0;
if ( (ct->flag_sw == 1 ) && (get_controllerStatus( ct ) == 0) ) { if ( (ct->flag_sw == 1 ) && (controller_getStatus( ct ) == 0) ) {
ct->flag_sw = 0; ct->flag_sw = 0;
speed = ACEL; speed = ACEL;
} }
if ( (ct->flag_sw == 0 ) && (get_controllerStatus( ct ) == 1 ) ) { if ( (ct->flag_sw == 0 ) && (controller_getStatus( ct ) == 1 ) ) {
ct->flag_sw = 1; ct->flag_sw = 1;
} }
return speed; return speed;
} }
float get_accel ( void ) { float controller_getAccel ( void ) {
return ACEL; return ACEL;
} }
bool control_isActive( int pin ) { bool controller_isActive( int pin ) {
return !digitalRead( pin ); return !digitalRead( pin );
} }

View file

@ -39,17 +39,17 @@ typedef struct{
byte flag_sw; byte flag_sw;
}controller_t; }controller_t;
void setup_controller( void ); void controller_setup( void );
void init_controller( controller_t* ct, enum ctr_type mode, int pin ); void controller_init( controller_t* ct, enum ctr_type mode, int pin );
byte get_controllerStatus( controller_t* ct ); byte controller_getStatus( controller_t* ct );
float get_controller( controller_t* ct ); float controller_getSpeed( controller_t* ct );
float get_accel ( void ); float controller_getAccel ( void );
bool control_isActive( int pin ); bool controller_isActive( int pin );
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -6,7 +6,7 @@
void process_main_track( track_t* tck, car_t* car ); void process_main_track( track_t* tck, car_t* car );
void process_aux_track( track_t* tck, car_t* car ); void process_aux_track( track_t* tck, car_t* car );
void init_car( car_t* car, controller_t* ct, uint32_t color ) { void car_init( car_t* car, controller_t* ct, uint32_t color ) {
car->ct = ct; car->ct = ct;
car->color = color; car->color = color;
car->trackID = TRACK_MAIN; car->trackID = TRACK_MAIN;
@ -15,8 +15,8 @@ void init_car( car_t* car, controller_t* ct, uint32_t color ) {
car->dist_aux=0; car->dist_aux=0;
} }
void update_controller( car_t* car ) { void car_updateController( car_t* car ) {
car->speed += get_controller( car->ct ); car->speed += controller_getSpeed( car->ct );
} }
void update_track( track_t* tck, car_t* car ) { void update_track( track_t* tck, car_t* car ) {
@ -25,7 +25,7 @@ void update_track( track_t* tck, car_t* car ) {
if ( car->trackID == TRACK_MAIN if ( car->trackID == TRACK_MAIN
&& (int)car->dist % cfg->nled_main == (cfg->init_aux-(cfg->nled_aux)) && (int)car->dist % cfg->nled_main == (cfg->init_aux-(cfg->nled_aux))
// && get_controllerStatus( ct ) == 0 ) { //change track by switch // && controller_getStatus( ct ) == 0 ) { //change track by switch
&& (car->speed <= SPD_MIN_TRACK_AUX )) { //change track by low speed && (car->speed <= SPD_MIN_TRACK_AUX )) { //change track by low speed
car->trackID = TRACK_AUX; car->trackID = TRACK_AUX;
@ -50,8 +50,8 @@ void process_aux_track( track_t* tck, car_t* car ){
struct cfgtrack const* cfg = &tck->cfg.track; struct cfgtrack const* cfg = &tck->cfg.track;
if ( (int)car->dist_aux == tck->ledcoin if ( (int)car->dist_aux == tck->ledcoin
&& car->speed <= get_accel() ) { && car->speed <= controller_getAccel() ) {
car->speed = get_accel ()*10; car->speed = controller_getAccel ()*10;
tck->ledcoin = COIN_RESET; tck->ledcoin = COIN_RESET;
}; };
@ -77,7 +77,7 @@ void process_main_track( track_t* tck, car_t* car ) {
car->dist += car->speed; car->dist += car->speed;
} }
void init_ramp( track_t* tck ) { void ramp_init( track_t* tck ) {
tck->rampactive = true; tck->rampactive = true;
} }
@ -87,7 +87,7 @@ bool ramp_isactive( track_t* tck ) {
} }
void reset_carPosition( car_t* car) { void car_resetPosition( car_t* car) {
car->trackID = TRACK_MAIN; car->trackID = TRACK_MAIN;
car->speed = 0; car->speed = 0;
@ -97,7 +97,15 @@ void reset_carPosition( car_t* car) {
car->leaving = false; car->leaving = false;
} }
int track_configure( track_t* tck, int init_box ) { void box_init( track_t* tck ) {
tck->rampactive = true;
}
bool box_isactive( track_t* tck ) {
return tck->rampactive;
}
int box_configure( track_t* tck, int init_box ) {
struct cfgtrack* cfg = &tck->cfg.track; struct cfgtrack* cfg = &tck->cfg.track;
if( init_box >= cfg->nled_main ) return -1; if( init_box >= cfg->nled_main ) return -1;
cfg->nled_main = ( init_box == 0 ) ? cfg->nled_total : init_box; cfg->nled_main = ( init_box == 0 ) ? cfg->nled_total : init_box;
@ -106,7 +114,7 @@ int track_configure( track_t* tck, int init_box ) {
return 0; return 0;
} }
int track_cfgramp( track_t* tck, int center, int high ) { int ramp_configure( track_t* tck, int center, int high ) {
struct cfgramp* ramp = &tck->cfg.ramp; struct cfgramp* ramp = &tck->cfg.ramp;
if ( center >= tck->cfg.track.nled_main || center <= 0 ) return -1; if ( center >= tck->cfg.track.nled_main || center <= 0 ) return -1;
@ -114,3 +122,4 @@ int track_cfgramp( track_t* tck, int center, int high ) {
ramp->high = high; ramp->high = high;
return 0; return 0;
} }

View file

@ -60,26 +60,30 @@ typedef struct {
int ledcoin; //LED_SPEED_COIN int ledcoin; //LED_SPEED_COIN
uint32_t ledtime; uint32_t ledtime;
bool rampactive; bool rampactive;
bool boxactive;
}track_t; }track_t;
void init_ramp( track_t* tck ); void car_init( car_t* car, controller_t* ct, uint32_t color );
void set_ramp( track_t* tck ); void car_updateController( car_t* car );
bool ramp_isactive( track_t* tck ); void car_resetPosition( car_t* car);
void init_car( car_t* car, controller_t* ct, uint32_t color );
void update_track( track_t* tck, car_t* car ); void update_track( track_t* tck, car_t* car );
void update_controller( car_t* car ); void box_init( track_t* tck );
void reset_carPosition( car_t* car); bool box_isactive( track_t* tck );
int track_configure( track_t* tck, int init_box ); int box_configure( track_t* tck, int init_box );
void ramp_init( track_t* tck );
bool ramp_isactive( track_t* tck );
int ramp_configure( track_t* tck, int center, int high );
int track_cfgramp( track_t* tck, int center, int high );
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"

View file

@ -152,37 +152,38 @@ void setup() {
Serial.begin(115200); Serial.begin(115200);
randomSeed( analogRead(A6) + analogRead(A7) ); randomSeed( analogRead(A6) + analogRead(A7) );
setup_controller( ); controller_setup( );
param_load( &tck.cfg ); param_load( &tck.cfg );
init_car( &cars[0], &switchs[0], COLOR1 ); car_init( &cars[0], &switchs[0], COLOR1 );
init_controller( &switchs[0], DIGITAL_MODE, DIG_CONTROL_1 ); controller_init( &switchs[0], DIGITAL_MODE, DIG_CONTROL_1 );
init_car( &cars[1], &switchs[1], COLOR2 ); car_init( &cars[1], &switchs[1], COLOR2 );
init_controller( &switchs[1], DIGITAL_MODE, DIG_CONTROL_2 ); controller_init( &switchs[1], DIGITAL_MODE, DIG_CONTROL_2 );
race.numcars = 2; race.numcars = 2;
if( control_isActive( DIG_CONTROL_3 )) { if( controller_isActive( DIG_CONTROL_3 )) {
init_car( &cars[2], &switchs[2], COLOR3 ); car_init( &cars[2], &switchs[2], COLOR3 );
init_controller( &switchs[2], DIGITAL_MODE, DIG_CONTROL_3 ); controller_init( &switchs[2], DIGITAL_MODE, DIG_CONTROL_3 );
++race.numcars; ++race.numcars;
} }
if( control_isActive( DIG_CONTROL_4 )) { if( controller_isActive( DIG_CONTROL_4 )) {
init_car( &cars[3], &switchs[3], COLOR4 ); car_init( &cars[3], &switchs[3], COLOR4 );
init_controller( &switchs[3], DIGITAL_MODE, DIG_CONTROL_4 ); controller_init( &switchs[3], DIGITAL_MODE, DIG_CONTROL_4 );
++race.numcars; ++race.numcars;
} }
track.begin(); track.begin();
if ( digitalRead( DIG_CONTROL_1 ) == 0 ) { //push switch 1 on reset for activate physics if ( digitalRead( DIG_CONTROL_1 ) == 0 ) { //push switch 1 on reset for activate physics
init_ramp( &tck ); ramp_init( &tck );
draw_ramp( &tck ); draw_ramp( &tck );
track.show(); track.show();
} }
if ( digitalRead( DIG_CONTROL_2 ) == 0 ) { //push switch 2 on reset for activate boxes if ( digitalRead( DIG_CONTROL_2 ) == 0 ) { //push switch 2 on reset for activate boxes
track_configure( &tck, 240 ); box_init( &tck );
box_configure( &tck, 240 );
} }
race.cfg.startline = true; race.cfg.startline = true;
@ -207,7 +208,7 @@ void loop() {
else if ( race.phase == READY ) { else if ( race.phase == READY ) {
for( int i = 0; i < race.numcars; ++i) { for( int i = 0; i < race.numcars; ++i) {
reset_carPosition( &cars[i] ); car_resetPosition( &cars[i] );
cars[i].repeats = 0; cars[i].repeats = 0;
} }
tck.ledcoin = COIN_RESET; tck.ledcoin = COIN_RESET;
@ -235,19 +236,21 @@ void loop() {
else if( race.phase == RACING ) { else if( race.phase == RACING ) {
strip_clear( &tck ); strip_clear( &tck );
if( tck.ledcoin == COIN_RESET ) {
tck.ledcoin = COIN_WAIT; if( box_isactive( &tck ) ) {
tck.ledtime = millis() + random(2000,7000); if( tck.ledcoin == COIN_RESET ) {
tck.ledcoin = COIN_WAIT;
tck.ledtime = millis() + random(2000,7000);
}
if( tck.ledcoin > 0 )
draw_coin( &tck );
else if( millis() > tck.ledtime )
tck.ledcoin = random( 20, tck.cfg.track.nled_aux - 20 );
} }
if( ramp_isactive( &tck ) ) if( ramp_isactive( &tck ) )
draw_ramp( &tck ); draw_ramp( &tck );
if( tck.ledcoin > 0 )
draw_coin( &tck );
else if( millis() > tck.ledtime )
tck.ledcoin = random( 20, tck.cfg.track.nled_aux - 20 );
for( int i = 0; i < race.numcars; ++i ) { for( int i = 0; i < race.numcars; ++i ) {
run_racecycle( &cars[i], i ); run_racecycle( &cars[i], i );
if( cars[i].st == CAR_FINISH ) { if( cars[i].st == CAR_FINISH ) {
@ -293,7 +296,7 @@ void run_racecycle( car_t *car, int i ) {
struct cfgtrack const* cfg = &tck.cfg.track; struct cfgtrack const* cfg = &tck.cfg.track;
if( car->st == CAR_ENTER ) { if( car->st == CAR_ENTER ) {
reset_carPosition( car ); car_resetPosition( car );
if( car->repeats < race.cfg.nrepeat ) if( car->repeats < race.cfg.nrepeat )
car->st = CAR_RACING; car->st = CAR_RACING;
else else
@ -302,7 +305,7 @@ void run_racecycle( car_t *car, int i ) {
if( car->st == CAR_RACING ) { if( car->st == CAR_RACING ) {
update_track( &tck, car ); update_track( &tck, car );
update_controller( car ); car_updateController( car );
draw_car( &tck, car ); draw_car( &tck, car );
if( car->nlap == race.cfg.nlap if( car->nlap == race.cfg.nlap
@ -327,7 +330,7 @@ void run_racecycle( car_t *car, int i ) {
car->trackID = NOT_TRACK; car->trackID = NOT_TRACK;
sprintf( txbuff, "w%d%c", i + 1, EOL ); sprintf( txbuff, "w%d%c", i + 1, EOL );
Serial.print( txbuff ); Serial.print( txbuff );
reset_carPosition( car ); car_resetPosition( car );
} }
} }
@ -541,7 +544,7 @@ ack_t parseCommands(AsyncSerial &serial) {
pch = strtok (NULL, ","); pch = strtok (NULL, ",");
if( !pch ) return ack; if( !pch ) return ack;
int err = track_configure( &tck, init_aux ); int err = box_configure( &tck, init_aux );
if( err ) return ack; if( err ) return ack;
EEPROM.put( eeadrInfo, tck.cfg ); EEPROM.put( eeadrInfo, tck.cfg );
@ -570,11 +573,11 @@ ack_t parseCommands(AsyncSerial &serial) {
if( !pch ) return ack; if( !pch ) return ack;
int high = atoi( pch ); int high = atoi( pch );
int err = track_cfgramp( &tck, center, high ); int err = ramp_configure( &tck, center, high );
if( err ) return ack; if( err ) return ack;
EEPROM.put( eeadrInfo, tck.cfg ); EEPROM.put( eeadrInfo, tck.cfg );
init_ramp( &tck ); ramp_init( &tck );
ack.rp = OK; ack.rp = OK;
if ( verbose >= DEBUG ) { //VERBOSE if ( verbose >= DEBUG ) { //VERBOSE
struct cfgramp const* cfg = &tck.cfg.ramp; struct cfgramp const* cfg = &tck.cfg.ramp;