mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-03 14:38:30 -04:00
7a4483b091
this makes use of DRefs to greatly improve XPlane support. It only supports XPlane 11 and later The key change is the use of a JSON file to map ArduPilot output channels to DataRefs, and map raw joystick inputs to RC inputs this gets rid of the awful throttle hack handling, and allows for control of a much wider range of aircraft
63 lines
1.5 KiB
C++
63 lines
1.5 KiB
C++
|
|
#include "SIM_Aircraft.h"
|
|
#include <AP_Filesystem/AP_Filesystem.h>
|
|
|
|
#if USE_PICOJSON
|
|
#include "picojson.h"
|
|
|
|
/*
|
|
load JSON file, returning a picojson object or nullptr on failure
|
|
*/
|
|
void *load_json(const char *filename)
|
|
{
|
|
struct stat st;
|
|
if (AP::FS().stat(filename, &st) != 0) {
|
|
::printf("No such json file %s\n", filename);
|
|
return nullptr;
|
|
}
|
|
int fd = AP::FS().open(filename, O_RDONLY);
|
|
if (fd == -1) {
|
|
::printf("failed to open json %s\n", filename);
|
|
return nullptr;
|
|
}
|
|
char buf[st.st_size+1];
|
|
memset(buf, '\0', sizeof(buf));
|
|
if (AP::FS().read(fd, buf, st.st_size) != st.st_size) {
|
|
::printf("failed to read json %s\n", filename);
|
|
AP::FS().close(fd);
|
|
return nullptr;
|
|
}
|
|
AP::FS().close(fd);
|
|
|
|
char *start = strchr(buf, '{');
|
|
if (!start) {
|
|
::printf("Invalid json %s", filename);
|
|
return nullptr;
|
|
}
|
|
|
|
/*
|
|
remove comments, as not allowed by the parser
|
|
*/
|
|
for (char *p = strchr(start,'#'); p; p=strchr(p+1, '#')) {
|
|
// clear to end of line
|
|
do {
|
|
*p++ = ' ';
|
|
} while (*p != '\n' && *p != '\r' && *p);
|
|
}
|
|
|
|
picojson::value *obj = new picojson::value;
|
|
if (obj == nullptr) {
|
|
::printf("Invalid allocate json for %s", filename);
|
|
return nullptr;
|
|
}
|
|
std::string err = picojson::parse(*obj, start);
|
|
if (!err.empty()) {
|
|
::printf("parse failed for json %s", filename);
|
|
delete obj;
|
|
return nullptr;
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
#endif // USE_PICOJSON
|