Solved ram issue with gravity map. Update to 4 cars

This commit is contained in:
Angel Maldonado 2019-10-13 11:51:31 +02:00
parent e45dfae657
commit 9242511611
5 changed files with 33 additions and 41 deletions

View file

@ -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; i<cfg->nled_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;
}

View file

@ -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;

View file

@ -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

View file

@ -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 {

View file

@ -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;