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;
void setup_controller( void ) {
void controller_setup( void ) {
if( DIGITAL_MODE == false ){
pinMode(PIN_VCC_ADC1, OUTPUT);
@ -21,14 +21,14 @@ void setup_controller( void ) {
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->pin = pin;
ct->delta_analog = DELTA_ANALOG;
}
byte get_controllerStatus( controller_t* ct ) {
byte controller_getStatus( controller_t* ct ) {
if( ct->mode == DIGITAL_MODE ){
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;
if ( (ct->flag_sw == 1 ) && (get_controllerStatus( ct ) == 0) ) {
if ( (ct->flag_sw == 1 ) && (controller_getStatus( ct ) == 0) ) {
ct->flag_sw = 0;
speed = ACEL;
}
if ( (ct->flag_sw == 0 ) && (get_controllerStatus( ct ) == 1 ) ) {
if ( (ct->flag_sw == 0 ) && (controller_getStatus( ct ) == 1 ) ) {
ct->flag_sw = 1;
}
return speed;
}
float get_accel ( void ) {
float controller_getAccel ( void ) {
return ACEL;
}
bool control_isActive( int pin ) {
bool controller_isActive( int pin ) {
return !digitalRead( pin );
}

View file

@ -39,17 +39,17 @@ typedef struct{
byte flag_sw;
}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

View file

@ -6,7 +6,7 @@
void process_main_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->color = color;
car->trackID = TRACK_MAIN;
@ -15,8 +15,8 @@ void init_car( car_t* car, controller_t* ct, uint32_t color ) {
car->dist_aux=0;
}
void update_controller( car_t* car ) {
car->speed += get_controller( car->ct );
void car_updateController( car_t* car ) {
car->speed += controller_getSpeed( car->ct );
}
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
&& (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->trackID = TRACK_AUX;
@ -50,8 +50,8 @@ void process_aux_track( track_t* tck, car_t* car ){
struct cfgtrack const* cfg = &tck->cfg.track;
if ( (int)car->dist_aux == tck->ledcoin
&& car->speed <= get_accel() ) {
car->speed = get_accel ()*10;
&& car->speed <= controller_getAccel() ) {
car->speed = controller_getAccel ()*10;
tck->ledcoin = COIN_RESET;
};
@ -77,7 +77,7 @@ void process_main_track( track_t* tck, car_t* car ) {
car->dist += car->speed;
}
void init_ramp( track_t* tck ) {
void ramp_init( track_t* tck ) {
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->speed = 0;
@ -97,7 +97,15 @@ void reset_carPosition( car_t* car) {
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;
if( init_box >= cfg->nled_main ) return -1;
cfg->nled_main = ( init_box == 0 ) ? cfg->nled_total : init_box;
@ -106,11 +114,12 @@ int track_configure( track_t* tck, int init_box ) {
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;
if ( center >= tck->cfg.track.nled_main || center <= 0 ) return -1;
ramp->center = center;
ramp->high = high;
return 0;
}
}

View file

@ -60,26 +60,30 @@ typedef struct {
int ledcoin; //LED_SPEED_COIN
uint32_t ledtime;
bool rampactive;
bool boxactive;
}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 init_car( car_t* car, controller_t* ct, uint32_t color );
void car_resetPosition( 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
} // extern "C"

View file

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