diff --git a/lib/Openledrace-lib/olr-lib.c b/lib/Openledrace-lib/olr-lib.c index 37d9e45..5b6b289 100644 --- a/lib/Openledrace-lib/olr-lib.c +++ b/lib/Openledrace-lib/olr-lib.c @@ -62,40 +62,28 @@ void process_aux_track( track_t* tck, car_t* car ){ void process_main_track( track_t* tck, car_t* car ) { struct cfgtrack const* cfg = &tck->cfg.track; - const int nled = cfg->nled_main; - const byte* gmap = tck->gmap; - if ( gmap[(word)car->dist % nled] < 127 ) - car->speed -= cfg->kg*(127-( gmap[(word)car->dist % nled]) ); - if ( gmap[(word)car->dist % nled] > 127 ) - car->speed += cfg->kg*(( gmap[(word)car->dist % nled])-127 ); + + if ( tck->rampactive ) { + struct cfgramp const* r = &tck->cfg.ramp; + int const pos = (int)car->dist % cfg->nled_main; + if ( pos >= r->init && pos < r->center ) + car->speed -= cfg->kg * r->high * ( pos - r->init ); + + if ( pos <= r->end && pos > r->center ) + car->speed += cfg->kg * r->high * ( pos - r->center ); + } car->speed -= car->speed * cfg->kf; car->dist += car->speed; } void init_ramp( track_t* tck ) { - struct cfgtrack const* cfg = &tck->cfg.track; - byte* gmap = tck->gmap; - for( int i=0; inled_main; i++ ) { - gmap[i] = 127; - } + tck->rampactive = true; } -void set_ramp( track_t* tck ) { - struct cfgramp* r = &tck->cfg.ramp; - for( int i=0; i<(r->center - r->init); i++ ) - tck->gmap[r->init+i] = 127-i*((float)r->high/(r->center - r->init)); - - tck->gmap[r->center] = 127; - - for( int i=0; i<(r->end - r->center); i++ ) - tck->gmap[r->center+i+1] = 127+r->high-i*((float)r->high/(r->end-r->center)); - - r->enabled = true; -} bool ramp_isactive( track_t* tck ) { - return tck->cfg.ramp.enabled; + return tck->rampactive; } diff --git a/lib/Openledrace-lib/olr-lib.h b/lib/Openledrace-lib/olr-lib.h index efc4049..9ae8a03 100644 --- a/lib/Openledrace-lib/olr-lib.h +++ b/lib/Openledrace-lib/olr-lib.h @@ -57,7 +57,7 @@ typedef struct { struct cfgparam cfg; int ledcoin; //LED_SPEED_COIN uint32_t ledtime; - byte* gmap; //pointer to gravity map + bool rampactive; }track_t; diff --git a/lib/Openledrace-lib/olr-param.c b/lib/Openledrace-lib/olr-param.c index c10142f..6f1e40d 100644 --- a/lib/Openledrace-lib/olr-param.c +++ b/lib/Openledrace-lib/olr-param.c @@ -6,7 +6,7 @@ void param_setdefault( struct cfgparam* cfg ) { cfg->ramp.init = 90; cfg->ramp.center = 100; cfg->ramp.end = 110; - cfg->ramp.high = 12; + cfg->ramp.high = 2; cfg->track.nled_total = MAXLED; cfg->track.nled_main = 300; //240 diff --git a/lib/Openledrace-lib/olr-param.h b/lib/Openledrace-lib/olr-param.h index cde1d92..30f3012 100644 --- a/lib/Openledrace-lib/olr-param.h +++ b/lib/Openledrace-lib/olr-param.h @@ -15,7 +15,7 @@ extern "C"{ enum{ LEN_UID = 16, - CFG_VER = 2, + CFG_VER = 3, }; @@ -35,7 +35,6 @@ struct cfgramp { int center; int end; int high; - bool enabled; }; struct brdinfo { diff --git a/src/open-led-race.ino b/src/open-led-race.ino index 034fa78..1f64a95 100644 --- a/src/open-led-race.ino +++ b/src/open-led-race.ino @@ -39,7 +39,7 @@ enum{ - MAX_CARS = 2, + MAX_CARS = 4, }; @@ -104,7 +104,6 @@ enum loglevel verbose = DISABLE; static struct race race; static car_t cars[ MAX_CARS ]; static controller_t switchs[ MAX_CARS ]; -static byte gravity_map[ MAXLED ]; static track_t tck; static int const eeadrInfo = 0; @@ -143,18 +142,14 @@ AsyncSerial asyncSerial(data, dataLength, Adafruit_NeoPixel track = Adafruit_NeoPixel( MAXLED, PIN_LED, NEO_GRB + NEO_KHZ800 ); -void init_track( track_t* tck ){ - param_load( &tck->cfg ); - tck->gmap = gravity_map; - init_ramp( tck ); -} + void setup() { Serial.begin(115200); randomSeed( analogRead(A0) + analogRead(A1) ); setup_controller( ); - init_track( &tck ); + param_load( &tck.cfg ); init_car( &cars[0], &switchs[0], COLOR1 ); init_controller( &switchs[0], DIGITAL_MODE, DIG_CONTROL_1 ); @@ -177,7 +172,7 @@ void setup() { track.begin(); if ( digitalRead( DIG_CONTROL_1 ) == 0 ) { //push switch 1 on reset for activate physic - set_ramp( &tck ); + init_ramp( &tck ); draw_ramp( &tck ); track.show(); } @@ -453,9 +448,19 @@ void draw_car( track_t* tck, car_t* car ) { } void draw_ramp( track_t* tck ) { - struct cfgtrack const* cfg = &tck->cfg.track; - for(int i=0; i< cfg->nled_main; i++) - track.setPixelColor(i, track.Color(0,0,(127-tck->gmap[i])/8) ); + struct cfgramp const* r = &tck->cfg.ramp; + byte dist = 0; + byte intensity = 0; + for( int i = r->init; i <= r->center; ++i ) { + dist = r->center - r->init; + intensity = ( 255 * (i - r->init) ) / ( 2* dist ); + track.setPixelColor( i, track.Color( intensity,intensity, 0 ) ); + } + for( int i = r->center; i <= r->end; ++i ) { + dist = r->end - r->center; + intensity = ( 255 * ( r->end - i ) ) / ( 2* dist ); + track.setPixelColor( i, track.Color( intensity,intensity, 0 ) ); + } } @@ -576,7 +581,7 @@ ack_t parseCommands(AsyncSerial &serial) { if( err ) return ack; EEPROM.put( eeadrInfo, tck.cfg ); - set_ramp( &tck ); + init_ramp( &tck ); ack.rp = OK; if ( verbose >= DEBUG ) { //VERBOSE struct cfgramp const* cfg = &tck.cfg.ramp;