Solved ram issue with gravity map. Update to 4 cars
This commit is contained in:
parent
e45dfae657
commit
9242511611
5 changed files with 33 additions and 41 deletions
|
@ -62,40 +62,28 @@ void process_aux_track( track_t* tck, car_t* car ){
|
||||||
|
|
||||||
void process_main_track( track_t* tck, car_t* car ) {
|
void process_main_track( track_t* tck, car_t* car ) {
|
||||||
struct cfgtrack const* cfg = &tck->cfg.track;
|
struct cfgtrack const* cfg = &tck->cfg.track;
|
||||||
const int nled = cfg->nled_main;
|
|
||||||
const byte* gmap = tck->gmap;
|
if ( tck->rampactive ) {
|
||||||
if ( gmap[(word)car->dist % nled] < 127 )
|
struct cfgramp const* r = &tck->cfg.ramp;
|
||||||
car->speed -= cfg->kg*(127-( gmap[(word)car->dist % nled]) );
|
int const pos = (int)car->dist % cfg->nled_main;
|
||||||
if ( gmap[(word)car->dist % nled] > 127 )
|
if ( pos >= r->init && pos < r->center )
|
||||||
car->speed += cfg->kg*(( gmap[(word)car->dist % nled])-127 );
|
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->speed -= car->speed * cfg->kf;
|
||||||
car->dist += car->speed;
|
car->dist += car->speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_ramp( track_t* tck ) {
|
void init_ramp( track_t* tck ) {
|
||||||
struct cfgtrack const* cfg = &tck->cfg.track;
|
tck->rampactive = true;
|
||||||
byte* gmap = tck->gmap;
|
|
||||||
for( int i=0; i<cfg->nled_main; i++ ) {
|
|
||||||
gmap[i] = 127;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 ) {
|
bool ramp_isactive( track_t* tck ) {
|
||||||
return tck->cfg.ramp.enabled;
|
return tck->rampactive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ typedef struct {
|
||||||
struct cfgparam cfg;
|
struct cfgparam cfg;
|
||||||
int ledcoin; //LED_SPEED_COIN
|
int ledcoin; //LED_SPEED_COIN
|
||||||
uint32_t ledtime;
|
uint32_t ledtime;
|
||||||
byte* gmap; //pointer to gravity map
|
bool rampactive;
|
||||||
}track_t;
|
}track_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ void param_setdefault( struct cfgparam* cfg ) {
|
||||||
cfg->ramp.init = 90;
|
cfg->ramp.init = 90;
|
||||||
cfg->ramp.center = 100;
|
cfg->ramp.center = 100;
|
||||||
cfg->ramp.end = 110;
|
cfg->ramp.end = 110;
|
||||||
cfg->ramp.high = 12;
|
cfg->ramp.high = 2;
|
||||||
|
|
||||||
cfg->track.nled_total = MAXLED;
|
cfg->track.nled_total = MAXLED;
|
||||||
cfg->track.nled_main = 300; //240
|
cfg->track.nled_main = 300; //240
|
||||||
|
|
|
@ -15,7 +15,7 @@ extern "C"{
|
||||||
|
|
||||||
enum{
|
enum{
|
||||||
LEN_UID = 16,
|
LEN_UID = 16,
|
||||||
CFG_VER = 2,
|
CFG_VER = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,7 +35,6 @@ struct cfgramp {
|
||||||
int center;
|
int center;
|
||||||
int end;
|
int end;
|
||||||
int high;
|
int high;
|
||||||
bool enabled;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct brdinfo {
|
struct brdinfo {
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
|
|
||||||
|
|
||||||
enum{
|
enum{
|
||||||
MAX_CARS = 2,
|
MAX_CARS = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,7 +104,6 @@ enum loglevel verbose = DISABLE;
|
||||||
static struct race race;
|
static struct race race;
|
||||||
static car_t cars[ MAX_CARS ];
|
static car_t cars[ MAX_CARS ];
|
||||||
static controller_t switchs[ MAX_CARS ];
|
static controller_t switchs[ MAX_CARS ];
|
||||||
static byte gravity_map[ MAXLED ];
|
|
||||||
static track_t tck;
|
static track_t tck;
|
||||||
|
|
||||||
static int const eeadrInfo = 0;
|
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 );
|
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() {
|
void setup() {
|
||||||
|
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
randomSeed( analogRead(A0) + analogRead(A1) );
|
randomSeed( analogRead(A0) + analogRead(A1) );
|
||||||
setup_controller( );
|
setup_controller( );
|
||||||
init_track( &tck );
|
param_load( &tck.cfg );
|
||||||
|
|
||||||
init_car( &cars[0], &switchs[0], COLOR1 );
|
init_car( &cars[0], &switchs[0], COLOR1 );
|
||||||
init_controller( &switchs[0], DIGITAL_MODE, DIG_CONTROL_1 );
|
init_controller( &switchs[0], DIGITAL_MODE, DIG_CONTROL_1 );
|
||||||
|
@ -177,7 +172,7 @@ void setup() {
|
||||||
track.begin();
|
track.begin();
|
||||||
|
|
||||||
if ( digitalRead( DIG_CONTROL_1 ) == 0 ) { //push switch 1 on reset for activate physic
|
if ( digitalRead( DIG_CONTROL_1 ) == 0 ) { //push switch 1 on reset for activate physic
|
||||||
set_ramp( &tck );
|
init_ramp( &tck );
|
||||||
draw_ramp( &tck );
|
draw_ramp( &tck );
|
||||||
track.show();
|
track.show();
|
||||||
}
|
}
|
||||||
|
@ -453,9 +448,19 @@ void draw_car( track_t* tck, car_t* car ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_ramp( track_t* tck ) {
|
void draw_ramp( track_t* tck ) {
|
||||||
struct cfgtrack const* cfg = &tck->cfg.track;
|
struct cfgramp const* r = &tck->cfg.ramp;
|
||||||
for(int i=0; i< cfg->nled_main; i++)
|
byte dist = 0;
|
||||||
track.setPixelColor(i, track.Color(0,0,(127-tck->gmap[i])/8) );
|
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;
|
if( err ) return ack;
|
||||||
EEPROM.put( eeadrInfo, tck.cfg );
|
EEPROM.put( eeadrInfo, tck.cfg );
|
||||||
|
|
||||||
set_ramp( &tck );
|
init_ramp( &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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue