Extend event-input with report-setting.
Can generate feature report data via Nasal callbacks. This is used to drive the GoFlight LCD / LEDs.
This commit is contained in:
parent
eb1c6adbc7
commit
347a89c1f2
4 changed files with 113 additions and 1 deletions
|
@ -251,6 +251,12 @@ void FGInputDevice::Configure( SGPropertyNode_ptr aDeviceNode )
|
||||||
debugEvents = deviceNode->getBoolValue("debug-events", debugEvents );
|
debugEvents = deviceNode->getBoolValue("debug-events", debugEvents );
|
||||||
grab = deviceNode->getBoolValue("grab", grab );
|
grab = deviceNode->getBoolValue("grab", grab );
|
||||||
|
|
||||||
|
PropertyList reportNodes = deviceNode->getChildren("report");
|
||||||
|
for( PropertyList::iterator it = reportNodes.begin(); it != reportNodes.end(); ++it ) {
|
||||||
|
FGReportSetting_ptr r = new FGReportSetting(*it);
|
||||||
|
reportSettings.push_back(r);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// add nodes for the last event:
|
// add nodes for the last event:
|
||||||
// last-event/name [string]
|
// last-event/name [string]
|
||||||
|
@ -273,6 +279,14 @@ void FGInputDevice::update( double dt )
|
||||||
{
|
{
|
||||||
for( map<string,FGInputEvent_ptr>::iterator it = handledEvents.begin(); it != handledEvents.end(); it++ )
|
for( map<string,FGInputEvent_ptr>::iterator it = handledEvents.begin(); it != handledEvents.end(); it++ )
|
||||||
(*it).second->update( dt );
|
(*it).second->update( dt );
|
||||||
|
|
||||||
|
report_setting_list_t::const_iterator it;
|
||||||
|
for (it = reportSettings.begin(); it != reportSettings.end(); ++it) {
|
||||||
|
if ((*it)->Test()) {
|
||||||
|
std::string reportData = (*it)->reportBytes(nasalModule);
|
||||||
|
SendFeatureReport((*it)->getReportId(), reportData);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FGInputDevice::HandleEvent( FGEventData & eventData )
|
void FGInputDevice::HandleEvent( FGEventData & eventData )
|
||||||
|
@ -292,6 +306,12 @@ void FGInputDevice::SetName( string name )
|
||||||
this->name = name;
|
this->name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FGInputDevice::SendFeatureReport(unsigned int reportId, const std::string& data)
|
||||||
|
{
|
||||||
|
SG_LOG(SG_INPUT, SG_WARN, "SendFeatureReport not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const char * FGEventInput::PROPERTY_ROOT = "/input/event";
|
const char * FGEventInput::PROPERTY_ROOT = "/input/event";
|
||||||
|
|
||||||
FGEventInput::FGEventInput() :
|
FGEventInput::FGEventInput() :
|
||||||
|
@ -389,3 +409,52 @@ void FGEventInput::RemoveDevice( unsigned index )
|
||||||
deviceNode = baseNode->removeChild("device", index);
|
deviceNode = baseNode->removeChild("device", index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FGReportSetting::FGReportSetting( SGPropertyNode_ptr base )
|
||||||
|
{
|
||||||
|
reportId = base->getIntValue("report-id");
|
||||||
|
nasalFunction = base->getStringValue("nasal-function");
|
||||||
|
|
||||||
|
PropertyList watchNodes = base->getChildren( "watch" );
|
||||||
|
for (PropertyList::iterator it = watchNodes.begin(); it != watchNodes.end(); ++it ) {
|
||||||
|
std::string path = (*it)->getStringValue();
|
||||||
|
SGPropertyNode_ptr n = globals->get_props()->getNode(path, true);
|
||||||
|
n->addChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FGReportSetting::Test()
|
||||||
|
{
|
||||||
|
bool d = dirty;
|
||||||
|
dirty = false;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string FGReportSetting::reportBytes(const std::string& moduleName) const
|
||||||
|
{
|
||||||
|
FGNasalSys *nas = (FGNasalSys *)globals->get_subsystem("nasal");
|
||||||
|
if (!nas) {
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
naRef module = nas->getModule(moduleName.c_str());
|
||||||
|
naRef func = naHash_cget(module, (char*) nasalFunction.c_str());
|
||||||
|
if (!naIsFunc(func)) {
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
naRef result = nas->call(func, 0, 0, naNil());
|
||||||
|
if (!naIsString(result)) {
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t len = naStr_len(result);
|
||||||
|
char* bytes = naStr_data(result);
|
||||||
|
return std::string(bytes, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FGReportSetting::valueChanged(SGPropertyNode * node)
|
||||||
|
{
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
|
@ -62,6 +62,37 @@ protected:
|
||||||
typedef SGSharedPtr<FGEventSetting> FGEventSetting_ptr;
|
typedef SGSharedPtr<FGEventSetting> FGEventSetting_ptr;
|
||||||
typedef std::vector<FGEventSetting_ptr> setting_list_t;
|
typedef std::vector<FGEventSetting_ptr> setting_list_t;
|
||||||
|
|
||||||
|
class FGReportSetting : public SGReferenced,
|
||||||
|
public SGPropertyChangeListener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FGReportSetting( SGPropertyNode_ptr base );
|
||||||
|
|
||||||
|
unsigned int getReportId() const
|
||||||
|
{
|
||||||
|
return reportId;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getNasalFunctionName() const
|
||||||
|
{
|
||||||
|
return nasalFunction;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Test();
|
||||||
|
|
||||||
|
std::string reportBytes(const std::string& moduleName) const;
|
||||||
|
|
||||||
|
virtual void valueChanged(SGPropertyNode * node);
|
||||||
|
protected:
|
||||||
|
unsigned int reportId;
|
||||||
|
std::string nasalFunction;
|
||||||
|
bool dirty;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef SGSharedPtr<FGReportSetting> FGReportSetting_ptr;
|
||||||
|
typedef std::vector<FGReportSetting_ptr> report_setting_list_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A wrapper class for a configured event.
|
* A wrapper class for a configured event.
|
||||||
*
|
*
|
||||||
|
@ -200,6 +231,8 @@ public:
|
||||||
Send( eventName.c_str(), value );
|
Send( eventName.c_str(), value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void SendFeatureReport(unsigned int reportId, const std::string& data);
|
||||||
|
|
||||||
virtual const char * TranslateEventName( FGEventData & eventData ) = 0;
|
virtual const char * TranslateEventName( FGEventData & eventData ) = 0;
|
||||||
|
|
||||||
|
|
||||||
|
@ -208,7 +241,7 @@ public:
|
||||||
|
|
||||||
void HandleEvent( FGEventData & eventData );
|
void HandleEvent( FGEventData & eventData );
|
||||||
|
|
||||||
void AddHandledEvent( FGInputEvent_ptr handledEvent ) {
|
virtual void AddHandledEvent( FGInputEvent_ptr handledEvent ) {
|
||||||
if( handledEvents.count( handledEvent->GetName() ) == 0 )
|
if( handledEvents.count( handledEvent->GetName() ) == 0 )
|
||||||
handledEvents[handledEvent->GetName()] = handledEvent;
|
handledEvents[handledEvent->GetName()] = handledEvent;
|
||||||
}
|
}
|
||||||
|
@ -240,6 +273,8 @@ private:
|
||||||
|
|
||||||
SGPropertyNode_ptr deviceNode;
|
SGPropertyNode_ptr deviceNode;
|
||||||
std::string nasalModule;
|
std::string nasalModule;
|
||||||
|
|
||||||
|
report_setting_list_t reportSettings;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef SGSharedPtr<FGInputDevice> FGInputDevice_ptr;
|
typedef SGSharedPtr<FGInputDevice> FGInputDevice_ptr;
|
||||||
|
|
|
@ -1223,6 +1223,12 @@ void FGNasalSys::deleteModule(const char* moduleName)
|
||||||
naFreeContext(ctx);
|
naFreeContext(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
naRef FGNasalSys::getModule(const char* moduleName)
|
||||||
|
{
|
||||||
|
naRef mod = naHash_cget(_globals, (char*) moduleName);
|
||||||
|
return mod;
|
||||||
|
}
|
||||||
|
|
||||||
naRef FGNasalSys::parse(naContext ctx, const char* filename, const char* buf, int len)
|
naRef FGNasalSys::parse(naContext ctx, const char* filename, const char* buf, int len)
|
||||||
{
|
{
|
||||||
int errLine = -1;
|
int errLine = -1;
|
||||||
|
|
|
@ -89,6 +89,8 @@ public:
|
||||||
|
|
||||||
void deleteModule(const char* moduleName);
|
void deleteModule(const char* moduleName);
|
||||||
|
|
||||||
|
naRef getModule(const char* moduleName);
|
||||||
|
|
||||||
void addCommand(naRef func, const std::string& name);
|
void addCommand(naRef func, const std::string& name);
|
||||||
void removeCommand(const std::string& name);
|
void removeCommand(const std::string& name);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue