Difference between revisions of "C: XML Variables in C Gauges"
Line 45: | Line 45: | ||
// instead, and omit the mouse code! | // instead, and omit the mouse code! | ||
− | |||
pitot_cover = get_named_variable_value (pitot_cover_id); | pitot_cover = get_named_variable_value (pitot_cover_id); | ||
Latest revision as of 12:36, 23 July 2018
C: XML Variables in C Gauges
To control XML variables from a C gauge:
// declare the variable and pointer ID for the variable double pitot_cover = 1 ; // this is the C variable ID pitot_cover_id; // this is the pointer address to the XML variable
// Register the variable (this is the XML "name," e.g., L:PitotCover case PANEL_SERVICE_PRE_INITIALIZE: pitot_cover_id = register_named_variable ( "PitotCover" ); break;
// now, you can use the next two statements to // (a) associate the ID with the XML variable, then // (b) set the variable to be identical to the C variable, e.g., pitot_cover case PANEL_SERVICE_PRE_UPDATE: set_named_variable_value ( pitot_cover_id, (FLOAT64)pitot_cover ) ; break;
// now, in my mouse routine, I can set the value of pitot_cover, and it will //be automatically passed to the XML variable! BOOL FSAPI mouse_pitotcb( PPIXPOINT relative_point, FLAGS32 mouse_flags) { if ( pitot_cover == 0 ) { pitot_cover = 1 ; } else { pitot_cover = 0 ; } return FALSE; }
// now, to use the XML variable to control the C variable, the only // difference is that you would use the get_named_variable_value command // instead, and omit the mouse code! pitot_cover = get_named_variable_value (pitot_cover_id);
Alternate Method
There is another method that may be used to communicate between C gauges and XML gauges, using the execute_calculator_code(); function. Here is the prototype for the function:
execute_calculator_code(PCSTRINGZ code, FLOAT64* fvalue, SINT32* ivalue, PCSTRINGZ* svalue);
"Translating" the function into more easily understood pseudo-code, we have this:
execute_calculator_code(XML variable name,units, floating point var name, integer variable name, string variable name);
To use the function, first determine from the "units" of the XML variable whether the returned value will be a floating point number, an integer, or a string.
When constructing the function call, only ONE of the fields 2 through 4 will be used, an the unused fields filled with "NULL" value. For example, we want to fetch an ADF frequency, so we'd use something like this:
FLOAT64 adf1_frequency = 0; // first declare the float C variable execute_calculator_code("(A:ADF ACTIVE FREQUENCY:1, KHz)",&adf1_frequency,NULL,NULL);
If the XML variable is an integer, here is an example:
SINT32 time_of_day; // first declare the integer C variable execute_calculator_code("(E:TIME OF DAY,Enum)",NULL,&time_of_day,NULL);
If the XML variable is a string, here is an example:
PCSTRINGZ WP_NextID; // first declare the string C variable execute_calculator_code("(A:GPS WP_NEXT ID,string)",NULL,NULL,&WP_NextID);
Custom L:variables may also be obtained following the same structure shown above.
BOOLEAN:
execute_calculator_code("(L:MyCustomVariable,bool)",NULL,&my_custom_variable,NULL);
FLOAT:
execute_calculator_code("(L:MyCustomVariable,enum)",&my_custom_variable,NULL,NULL);
This method is much easier to use than the method described in the previous section.
To SEND a command with this method, use the following format:
execute_calculator_code("(>K:SOUND_TOGGLE)", NULL, NULL, NULL);
If you need to pass a value for a SET type key_event, simply use the same syntax used in an XML gauge by prefixing the command with the value (which can itself be another XML variable as shown below):
execute_calculator_code("(A:Plane heading degrees gyro,degrees) (>K:HEADING_BUG_SET)", NULL, NULL, NULL);
To set an L:variable, use this syntax:
Constant:
execute_calculator_code(" 120 (>L:CustomXMLvar,enum)",NULL,NULL,NULL);
C Variable:
FLOAT64 myVar = 100.00; char cTemp[60]; sprintf_s(cTemp, %f%s, myVar, " (>L:MyVar,number)"); PCSTRINGZ szString = cTemp; execute_calculator_code(szString,NULL,NULL,NULL);