12#include <simgear/structure/exception.hxx>
13#include <simgear/misc/sg_path.hxx>
14#include <simgear/sg_inlines.h>
15#include <simgear/props/props_io.hxx>
16#include <simgear/debug/ErrorReportingCallback.hxx>
68 simgear::ErrorReportContext ec(
"primary-aircraft",
"yes");
70 SGPropertyNode_ptr config_props =
new SGPropertyNode;
71 SGPropertyNode* path_n =
fgGetNode(
"/sim/instrumentation/path");
73 SG_LOG(SG_COCKPIT, SG_DEV_WARN,
"No instrumentation model specified for this model!");
77 SGPath config =
globals->resolve_aircraft_path(path_n->getStringValue());
78 if (!config.exists()) {
79 simgear::reportFailure(simgear::LoadFailure::NotFound, simgear::ErrorCode::AircraftSystems,
80 "FGInstrumentMgr: Missing instrumentation file", config);
84 SG_LOG( SG_COCKPIT, SG_INFO,
"Reading instruments from " << config );
87 readProperties( config, config_props );
88 if (!build(config_props, config)) {
90 "Detected an internal inconsistency in the instrumentation\n"
91 "system specification file. See earlier errors for details.");
93 }
catch (
const sg_exception& e) {
94 simgear::reportFailure(simgear::LoadFailure::BadData, simgear::ErrorCode::AircraftSystems,
95 "Failed to load instrumentation system:" + e.getFormattedMessage(),
101 SG_LOG(SG_INSTR, SG_INFO,
"creating default GPS instrument");
102 SGPropertyNode_ptr nd(
new SGPropertyNode);
103 nd->setStringValue(
"name",
"gps");
104 nd->setIntValue(
"number", 0);
105 _instruments.push_back(
"gps[0]");
106 set_subsystem(
"gps[0]",
new GPS(nd,
true ));
109 SGSubsystemGroup::init();
112bool FGInstrumentMgr::build (SGPropertyNode* config_props,
const SGPath& path)
114 for (
int i = 0;
i < config_props->nChildren(); ++
i ) {
115 SGPropertyNode *node = config_props->getChild(
i);
116 std::string
name = node->getNameString();
118 std::ostringstream subsystemname;
119 subsystemname <<
"instrument-" <<
i <<
'-'
120 << node->getStringValue(
"name",
name.c_str());
121 int index = node->getIntValue(
"number", 0);
123 subsystemname <<
'['<< index <<
']';
124 std::string
id = subsystemname.str();
126 if (
name ==
"adf" ) {
127 set_subsystem(
id,
new ADF( node ), 0.15 );
129 }
else if (
name ==
"airspeed-indicator" ) {
130 set_subsystem(
id,
new AirspeedIndicator( node ) );
132 }
else if (
name ==
"altimeter" ) {
133 set_subsystem(
id,
new Altimeter( node,
"altimeter" ) );
135 }
else if (
name ==
"attitude-indicator" ) {
136 set_subsystem(
id,
new AttitudeIndicator( node ) );
138 }
else if (
name ==
"attitude-indicator-electric" ) {
139 set_subsystem(
id,
new AttitudeIndicatorElectric( node ) );
141 }
else if (
name ==
"clock" ) {
142 set_subsystem(
id,
new Clock( node ), 0.25 );
144 }
else if (
name ==
"dme" ) {
145 set_subsystem(
id,
new DME( node ), 1.0 );
147 }
else if (
name ==
"encoder" ) {
148 set_subsystem(
id,
new Altimeter( node,
"encoder" ), 0.15 );
150 }
else if (
name ==
"gps" ) {
155 set_subsystem(
id,
new GPS( node,
true ) );
157 }
else if (
name ==
"gsdi" ) {
158 set_subsystem(
id,
new GSDI( node ) );
160 }
else if (
name ==
"heading-indicator" ) {
161 set_subsystem(
id,
new HeadingIndicator( node ) );
163 }
else if (
name ==
"heading-indicator-fg" ) {
164 set_subsystem(
id,
new HeadingIndicatorFG( node ) );
166 }
else if (
name ==
"heading-indicator-dg" ) {
167 set_subsystem(
id,
new HeadingIndicatorDG( node ) );
169 }
else if (
name ==
"KR-87" ) {
170 set_subsystem(
id,
new FGKR_87( node ) );
172 }
else if (
name ==
"magnetic-compass" ) {
173 set_subsystem(
id,
new MagCompass( node ) );
175 }
else if (
name ==
"marker-beacon" ) {
176 set_subsystem(
id,
new FGMarkerBeacon(node));
178 }
else if (
name ==
"comm-radio" ) {
181 }
else if (
name ==
"nav-radio" ) {
184 }
else if (
name ==
"slip-skid-ball" ) {
185 set_subsystem(
id,
new SlipSkidBall( node ), 0.03 );
187 }
else if ((
name ==
"transponder" ) || (
name ==
"KT-70" )) {
188 if (
name ==
"KT-70") {
189 SG_LOG(SG_INSTR, SG_DEV_ALERT,
"KT-70 legacy instrument compatibility. "
190 "Please update aircraft to use transponder directly");
192 node->setBoolValue(
"kt70-compatibility",
true);
194 set_subsystem(
id,
new Transponder( node ), 0.2 );
196 }
else if (
name ==
"turn-indicator" ) {
197 set_subsystem(
id,
new TurnIndicator( node ) );
199 }
else if (
name ==
"vertical-speed-indicator" ) {
200 set_subsystem(
id,
new VerticalSpeedIndicator( node ) );
202 }
else if (
name ==
"inst-vertical-speed-indicator" ) {
203 set_subsystem(
id,
new InstVerticalSpeedIndicator( node ) );
205 }
else if (
name ==
"tacan" ) {
206 set_subsystem(
id,
new TACAN( node ), 0.2 );
208 }
else if (
name ==
"mk-viii" ) {
209 set_subsystem(
id,
new MK_VIII( node ), 0.2);
211 }
else if (
name ==
"master-reference-gyro" ) {
212 set_subsystem(
id,
new MasterReferenceGyro( node ) );
214 }
else if ((
name ==
"groundradar" ) ||
215 (
name ==
"radar" ) ||
216 (
name ==
"air-ground-radar" ) ||
217 (
name ==
"navigation-display" ))
223 }
else if (
name ==
"radar-altimeter" ) {
224 set_subsystem(
id,
new RadarAltimeter( node ) );
226 }
else if (
name ==
"tcas" ) {
227 set_subsystem(
id,
new TCAS( node ), 0.2);
230 simgear::reportFailure(simgear::LoadFailure::Misconfigured, simgear::ErrorCode::AircraftSystems,
231 "Unknown top level section in instrumentation:" +
name,
237 _instruments.push_back(
id);
245 SGSubsystemMgr::FDM);
virtual ~FGInstrumentMgr()
InitStatus incrementalInit() override
static SGSubsystem * createInstance(SGPropertyNode_ptr rootNode)
static SGSubsystem * createInstance(SGPropertyNode_ptr rootNode)
SGSubsystemMgr::Registrant< FGInstrumentMgr > registrantFGInstrumentMgr(SGSubsystemMgr::FDM)
SGPropertyNode * fgGetNode(const char *path, bool create)
Get a property node.