Try to generate serial output for a motion platform company in California.
This commit is contained in:
parent
aa065f7068
commit
cea7b4b335
3 changed files with 87 additions and 3 deletions
|
@ -181,6 +181,17 @@ static bool config_port( fgIOCHANNEL &p )
|
||||||
FG_LOG( FG_SERIAL, FG_ALERT, "Unknown direction" );
|
FG_LOG( FG_SERIAL, FG_ALERT, "Unknown direction" );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else if ( p.format == "pve" ) {
|
||||||
|
if ( p.direction == "out" ) {
|
||||||
|
p.kind = fgIOCHANNEL::FG_SERIAL_PVE_OUT;
|
||||||
|
} else if ( p.direction == "in" ) {
|
||||||
|
FG_LOG( FG_SERIAL, FG_ALERT,
|
||||||
|
"ProVision Entertainment format is outgoing only" );
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
FG_LOG( FG_SERIAL, FG_ALERT, "Unknown direction" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
FG_LOG( FG_SERIAL, FG_ALERT, "Unknown format" );
|
FG_LOG( FG_SERIAL, FG_ALERT, "Unknown format" );
|
||||||
return false;
|
return false;
|
||||||
|
@ -450,7 +461,7 @@ static void read_fgfs_in( fgIOCHANNEL *p ) {
|
||||||
//
|
//
|
||||||
// For position it requires a 3-byte data packet defined as follows:
|
// For position it requires a 3-byte data packet defined as follows:
|
||||||
//
|
//
|
||||||
// First bite: ascII character"p" ( 80 decimal )
|
// First bite: ascII character "P" ( 0x50 or 80 decimal )
|
||||||
// Second byte X pos. (1-255) 1 being 0* and 255 being 359*
|
// Second byte X pos. (1-255) 1 being 0* and 255 being 359*
|
||||||
// Third byte Y pos.( 1-255) 1 being 0* and 255 359*
|
// Third byte Y pos.( 1-255) 1 being 0* and 255 359*
|
||||||
//
|
//
|
||||||
|
@ -510,6 +521,75 @@ static void send_rul_out( fgIOCHANNEL *p ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// "PVE" (ProVision Entertainment) output format (for some sort of
|
||||||
|
// motion platform)
|
||||||
|
//
|
||||||
|
// Outputs a 5-byte data packet defined as follows:
|
||||||
|
//
|
||||||
|
// First bite: ASCII character "P" ( 0x50 or 80 decimal )
|
||||||
|
// Second byte: "roll" value (1-255) 1 being 0* and 255 being 359*
|
||||||
|
// Third byte: "pitch" value (1-255) 1 being 0* and 255 being 359*
|
||||||
|
// Fourth byte: "heave" value (or forward acceleration)
|
||||||
|
//
|
||||||
|
// So sending 80 127 127 to the two axis motors will position on 180*
|
||||||
|
// The RS- 232 port is a nine pin connector and the only pins used are
|
||||||
|
// 3&5.
|
||||||
|
|
||||||
|
static void send_pve_out( fgIOCHANNEL *p ) {
|
||||||
|
char pve[256];
|
||||||
|
|
||||||
|
FGInterface *f;
|
||||||
|
FGTime *t;
|
||||||
|
|
||||||
|
f = current_aircraft.fdm_state;
|
||||||
|
t = FGTime::cur_time_params;
|
||||||
|
|
||||||
|
// run as often as possibleonce per second
|
||||||
|
|
||||||
|
// this runs once per second
|
||||||
|
// if ( p->last_time == t->get_cur_time() ) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// p->last_time = t->get_cur_time();
|
||||||
|
// if ( t->get_cur_time() % 2 != 0 ) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// get roll and pitch, convert to degrees
|
||||||
|
int roll_deg = (int)(f->get_Phi() * RAD_TO_DEG);
|
||||||
|
while ( roll_deg < -180 ) {
|
||||||
|
roll_deg += 360;
|
||||||
|
}
|
||||||
|
while ( roll_deg > 179 ) {
|
||||||
|
roll_deg -= 360;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pitch_deg = (int)(f->get_Theta() * RAD_TO_DEG);
|
||||||
|
while ( pitch_deg < -180 ) {
|
||||||
|
pitch_deg += 360;
|
||||||
|
}
|
||||||
|
while ( pitch_deg > 179 ) {
|
||||||
|
pitch_deg -= 360;
|
||||||
|
}
|
||||||
|
|
||||||
|
int heave = (int)(f->get_U_dot_body() * 3.0);
|
||||||
|
|
||||||
|
// scale roll and pitch to output format (1 - 255)
|
||||||
|
// straight && level == (128, 128)
|
||||||
|
|
||||||
|
int roll = (int)( (roll_deg+180.0) * 255.0 / 360.0) + 1;
|
||||||
|
int pitch = (int)( (pitch_deg+180.0) * 255.0 / 360.0) + 1;
|
||||||
|
|
||||||
|
sprintf( pve, "p%c%c\n", roll, pitch);
|
||||||
|
|
||||||
|
FG_LOG( FG_SERIAL, FG_INFO, "roll=" << roll << " pitch=" << pitch <<
|
||||||
|
" heave=" << heave );
|
||||||
|
|
||||||
|
string pve_sentence = pve;
|
||||||
|
p->port.write_port(pve_sentence);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// one more level of indirection ...
|
// one more level of indirection ...
|
||||||
static void process_port( fgIOCHANNEL *p ) {
|
static void process_port( fgIOCHANNEL *p ) {
|
||||||
if ( p->kind == fgIOCHANNEL::FG_SERIAL_NMEA_OUT ) {
|
if ( p->kind == fgIOCHANNEL::FG_SERIAL_NMEA_OUT ) {
|
||||||
|
@ -526,6 +606,8 @@ static void process_port( fgIOCHANNEL *p ) {
|
||||||
read_fgfs_in(p);
|
read_fgfs_in(p);
|
||||||
} else if ( p->kind == fgIOCHANNEL::FG_SERIAL_RUL_OUT ) {
|
} else if ( p->kind == fgIOCHANNEL::FG_SERIAL_RUL_OUT ) {
|
||||||
send_rul_out(p);
|
send_rul_out(p);
|
||||||
|
} else if ( p->kind == fgIOCHANNEL::FG_SERIAL_PVE_OUT ) {
|
||||||
|
send_pve_out(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,9 @@ public:
|
||||||
FG_SERIAL_FGFS_OUT = 5,
|
FG_SERIAL_FGFS_OUT = 5,
|
||||||
FG_SERIAL_FGFS_IN = 6,
|
FG_SERIAL_FGFS_IN = 6,
|
||||||
|
|
||||||
FG_SERIAL_RUL_OUT = 7 // Raul E Horcasitas <rul@compuserve.com>
|
FG_SERIAL_RUL_OUT = 7, // Raul E Horcasitas <rul@compuserve.com>
|
||||||
|
FG_SERIAL_PVE_OUT = 8 // "Jeff Vrachan"
|
||||||
|
// <jeffv@provisionentertainment.com>
|
||||||
};
|
};
|
||||||
|
|
||||||
string device;
|
string device;
|
||||||
|
|
|
@ -533,7 +533,7 @@ fgOPTIONS::parse_fov( const string& arg ) {
|
||||||
// Format is "--serial=device,format,baud,direction" where
|
// Format is "--serial=device,format,baud,direction" where
|
||||||
//
|
//
|
||||||
// device = OS device name to be open()'ed
|
// device = OS device name to be open()'ed
|
||||||
// format = {nmea, garmin,fgfs,rul}
|
// format = {nmea, garmin,fgfs,rul,pve}
|
||||||
// baud = {300, 1200, 2400, ..., 230400}
|
// baud = {300, 1200, 2400, ..., 230400}
|
||||||
// direction = {in, out, bi}
|
// direction = {in, out, bi}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue