- added debug switch FS_DEBUG. With FS_DEBUG
- learn and eval Fs statistics - extra Gui element - lower Sample rate - try to detect replay mode - changes to FSM control git-svn-id: http://moon:8086/svn/software/trunk/projects/FsTrack@188 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
+158
-16
@@ -6,14 +6,27 @@
|
||||
*/
|
||||
|
||||
#include "FsLink.hpp"
|
||||
|
||||
#include "memdump.h"
|
||||
#define TWO_PWR_16 (65536.0)
|
||||
#define TWO_PWR_32 (TWO_PWR_16*TWO_PWR_16)
|
||||
#ifdef FS_DEBUG
|
||||
#define TIMER_INTEVAL_MS 1000
|
||||
#else
|
||||
#define TIMER_INTEVAL_MS 100
|
||||
|
||||
#endif
|
||||
const char* FsLink::linkStateString[] = {"Init", "Disconnected", "Connected", "Paused", "Recording"};
|
||||
const char* FsLink::flightStateString[] = {"Init", "Suspend", "Ground", "Take off", "Enroute", "Touch down"};
|
||||
|
||||
typedef struct _DumpStatistics
|
||||
{
|
||||
bool isDynamic;
|
||||
|
||||
} DumpStatistics;
|
||||
|
||||
static DumpStatistics dumpStatistics[0x7800];
|
||||
static uint8_t dumpStatisticsDataInitial[0x7800];
|
||||
static uint8_t dumpStatisticsDataCurr[0x7800];
|
||||
|
||||
FsLink::FsLink(const char *pDocRoot)
|
||||
: m_docRoot(pDocRoot)
|
||||
, m_pKml(nullptr)
|
||||
@@ -23,6 +36,8 @@ FsLink::FsLink(const char *pDocRoot)
|
||||
, m_flightStateNext(fs_suspend)
|
||||
, m_kmlUpdateInterval(10)
|
||||
, m_kmlUpdateCount(0)
|
||||
, m_dumpOffset(0)
|
||||
, m_dumpLearnCount(0)
|
||||
{
|
||||
startTimer(TIMER_INTEVAL_MS);
|
||||
}
|
||||
@@ -36,6 +51,97 @@ FsLink::~FsLink()
|
||||
{
|
||||
}
|
||||
|
||||
void FsLink::setDumpOffset(uint32_t offset)
|
||||
{
|
||||
m_dumpOffset = offset;
|
||||
}
|
||||
|
||||
void FsLink::dump()
|
||||
{
|
||||
uint8_t dump[1024];
|
||||
DWORD result;
|
||||
|
||||
printf("---------------------------------------------------\n");
|
||||
FSUIPC_Read(m_dumpOffset, sizeof(dump), dump, &result);
|
||||
if (result == FSUIPC_ERR_OK)
|
||||
FSUIPC_Process(&result);
|
||||
|
||||
if (result == FSUIPC_ERR_OK)
|
||||
{
|
||||
memdump(dump, m_dumpOffset, 16, sizeof(dump));
|
||||
}
|
||||
}
|
||||
|
||||
void FsLink::statisticsLearnStart(uint32_t count)
|
||||
{
|
||||
DWORD result;
|
||||
|
||||
m_dumpLearnCount = count;
|
||||
memset(dumpStatistics, 0, sizeof(dumpStatistics));
|
||||
FSUIPC_Read(0, sizeof(dumpStatisticsDataInitial), dumpStatisticsDataInitial, &result);
|
||||
if (result == FSUIPC_ERR_OK)
|
||||
FSUIPC_Process(&result);
|
||||
else
|
||||
printf("%s: Problem FSUIPC_Read\n", __func__);
|
||||
|
||||
printf("Learning(%d) ", m_dumpLearnCount);
|
||||
}
|
||||
|
||||
void FsLink::statisticsLearn()
|
||||
{
|
||||
DWORD result;
|
||||
if (m_dumpLearnCount)
|
||||
{
|
||||
FSUIPC_Read(0, sizeof(dumpStatisticsDataCurr), dumpStatisticsDataCurr, &result);
|
||||
if (result == FSUIPC_ERR_OK)
|
||||
FSUIPC_Process(&result);
|
||||
else
|
||||
printf("%s: Problem FSUIPC_Read\n", __func__);
|
||||
|
||||
for (uint32_t i=0; i < sizeof(dumpStatisticsDataInitial); i++)
|
||||
{
|
||||
if (dumpStatisticsDataInitial[i] != dumpStatisticsDataCurr[i])
|
||||
{
|
||||
dumpStatistics[i].isDynamic = true;
|
||||
}
|
||||
}
|
||||
m_dumpLearnCount--;
|
||||
if (m_dumpLearnCount)
|
||||
{
|
||||
printf(".");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("done\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FsLink::statisticsEval()
|
||||
{
|
||||
printf("---------------------------------------------------\n");
|
||||
printf("Dump eval\n");
|
||||
printf("---------------------------------------------------\n");
|
||||
|
||||
DWORD result;
|
||||
FSUIPC_Read(0, sizeof(dumpStatisticsDataCurr), dumpStatisticsDataCurr, &result);
|
||||
if (result == FSUIPC_ERR_OK)
|
||||
FSUIPC_Process(&result);
|
||||
else
|
||||
printf("%s: Problem FSUIPC_Read\n", __func__);
|
||||
|
||||
for (uint32_t i=0; i < sizeof(dumpStatisticsDataCurr); i++)
|
||||
{
|
||||
if (dumpStatisticsDataInitial[i] != dumpStatisticsDataCurr[i])
|
||||
{
|
||||
if (!dumpStatistics[i].isDynamic)
|
||||
{
|
||||
printf("%08X : Initial=%02X, Current=%02X\n", i, dumpStatisticsDataInitial[i], dumpStatisticsDataCurr[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FsLink::addListener(IFsLinkListener *pListener)
|
||||
{
|
||||
m_listeners.add(pListener);
|
||||
@@ -92,9 +198,10 @@ int FsLink::gatherData()
|
||||
DWORD result;
|
||||
unsigned lat_lo, lon_lo, alt_lo;
|
||||
char lat[8], lon[8], alt[8], FSRdy2Fly, FSDialog;
|
||||
int lat_hi, lon_hi, alt_hi, radio_alt, bank, pitch, hdg_true, gs, tas, ias, bpa, vs, groundLevel, replay_active;
|
||||
int lat_hi, lon_hi, alt_hi, radio_alt, bank, pitch, hdg_true, gs, tas, ias, bpa, vs, groundLevel;
|
||||
short mag_var, parking_brake, paused, framerate, plane_on_ground;
|
||||
|
||||
short replay_active;
|
||||
|
||||
FSUIPC_Read(0x600C, sizeof(m_flightData.timeZulu), &m_flightData.timeZulu, &result);
|
||||
FSUIPC_Read(0x20, sizeof(groundLevel), &groundLevel, &result);
|
||||
FSUIPC_Read(0x560, sizeof(lat), lat, &result);
|
||||
@@ -125,7 +232,7 @@ int FsLink::gatherData()
|
||||
FSUIPC_Read(0x3160, sizeof(m_flightData.atcAircraftTypeStr), m_flightData.atcAircraftTypeStr, &result);
|
||||
FSUIPC_Read(0x366, sizeof(plane_on_ground), &plane_on_ground, &result);
|
||||
FSUIPC_Read(0xBC8, sizeof(parking_brake), &parking_brake, &result);
|
||||
FSUIPC_Read(0x628, sizeof(replay_active), &replay_active, &result);
|
||||
FSUIPC_Read(0x11D4, sizeof(replay_active), &replay_active, &result);
|
||||
FSUIPC_Process(&result);
|
||||
|
||||
if (result != FSUIPC_ERR_OK)
|
||||
@@ -169,13 +276,46 @@ int FsLink::gatherData()
|
||||
m_flightData.bpa_knots = (double)bpa/128.0; // knots
|
||||
m_flightData.vs_feetPerMin = 100*(double)vs/128.0; // ft/min
|
||||
m_flightData.framerate = TWO_PWR_16/(2*framerate);
|
||||
m_flightData.isFsReady = (FSRdy2Fly == 0);
|
||||
m_flightData.isFsDialog = (FSDialog != 0);
|
||||
m_flightData.isPaused = (paused != 0);
|
||||
m_flightData.isReplay = (replay_active != 0);
|
||||
m_flightData.isReady = (FSRdy2Fly == 0) && (FSDialog == 0);
|
||||
m_flightData.isPaused = (paused != 0) && (replay_active != 0xFADE);
|
||||
m_flightData.isParked = (parking_brake != 0);
|
||||
m_flightData.isOnGround = (plane_on_ground != 0);
|
||||
|
||||
#ifdef FS_DEBUG
|
||||
printf("\n");
|
||||
printf("FSRdy2Fly = %08X\n", FSRdy2Fly);
|
||||
printf("FSDialog = %08X\n", FSDialog);
|
||||
printf("paused = %08X\n", paused);
|
||||
printf("replay_active = %08X\n", replay_active);
|
||||
printf("\n");
|
||||
#endif
|
||||
uint32_t x = (FSRdy2Fly == 0) << 3 | (FSDialog == 0) << 2 | (replay_active == 0xfade) << 1 | (paused == 0);
|
||||
|
||||
m_flightData.state = FlightData::State::STATE_INVALID;
|
||||
switch(x)
|
||||
{
|
||||
case 0x0d:
|
||||
m_flightData.state = FlightData::State::STATE_ACTIVE;
|
||||
break;
|
||||
|
||||
case 0x09:
|
||||
case 0x0c:
|
||||
m_flightData.state = FlightData::State::STATE_PAUSED;
|
||||
break;
|
||||
|
||||
case 0x00:
|
||||
case 0x05:
|
||||
case 0x08:
|
||||
m_flightData.state = FlightData::State::STATE_STOPPED;
|
||||
break;
|
||||
|
||||
default:
|
||||
#ifdef FS_DEBUG
|
||||
printf("State : 0x%02X\n", x);
|
||||
#endif
|
||||
break;
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -202,10 +342,12 @@ void FsLink::timerCallback()
|
||||
}
|
||||
}
|
||||
|
||||
// dump();
|
||||
statisticsLearn();
|
||||
switch(m_linkState)
|
||||
{
|
||||
case ls_connected:
|
||||
if (!m_flightData.isFsDialog && m_flightData.isFsReady)
|
||||
if (m_flightData.state == FlightData::State::STATE_ACTIVE)
|
||||
{
|
||||
m_pKml->updateFlightData(m_flightData);
|
||||
if (m_pKml)
|
||||
@@ -217,13 +359,13 @@ void FsLink::timerCallback()
|
||||
break;
|
||||
|
||||
case ls_recording:
|
||||
if (m_flightData.isFsDialog && !m_flightData.isFsReady)
|
||||
if (m_flightData.state == FlightData::State::STATE_STOPPED)
|
||||
{
|
||||
m_pKml->destroy();
|
||||
m_linkStateNext = ls_connected;
|
||||
break;
|
||||
}
|
||||
if (m_flightData.isPaused || m_flightData.isReplay)
|
||||
if (m_flightData.state == FlightData::State::STATE_PAUSED)
|
||||
{
|
||||
m_linkStateNext = ls_paused;
|
||||
break;
|
||||
@@ -232,13 +374,13 @@ void FsLink::timerCallback()
|
||||
break;
|
||||
|
||||
case ls_paused:
|
||||
if (m_flightData.isFsDialog)
|
||||
if (m_flightData.state == FlightData::State::STATE_STOPPED)
|
||||
{
|
||||
m_pKml->destroy();
|
||||
m_linkStateNext = ls_connected;
|
||||
break;
|
||||
}
|
||||
if (!(m_flightData.isPaused || m_flightData.isReplay))
|
||||
if (m_flightData.state == FlightData::State::STATE_ACTIVE)
|
||||
{
|
||||
m_linkStateNext = ls_recording;
|
||||
break;
|
||||
@@ -255,7 +397,7 @@ void FsLink::timerCallback()
|
||||
if (m_linkState == ls_disconnected)
|
||||
break;
|
||||
|
||||
if (!m_flightData.isFsDialog && !m_flightData.isReplay)
|
||||
if (m_flightData.isReady && !m_flightData.isPaused)
|
||||
{
|
||||
m_flightStateNext = fs_ground;
|
||||
if (!m_flightData.isOnGround)
|
||||
@@ -293,7 +435,7 @@ void FsLink::timerCallback()
|
||||
}
|
||||
|
||||
// Override flight states
|
||||
if (m_flightData.isFsDialog || m_flightData.isReplay)
|
||||
if (!m_flightData.isReady || m_flightData.isPaused)
|
||||
{
|
||||
m_flightStateNext = fs_suspend;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user