Почему все, кроме статуса gpsd, может быть распаковано? - PullRequest
0 голосов
/ 27 апреля 2020

Используя libgps.so.25.0.0, созданный из gpsd-3.19.tar.gz для цели aarch64- linux -gnu Linux target, почему все, кроме статуса (DGPS_FIX), может быть распаковано в (gps_data_t) m_gps_data во время gps_read?

int gps_bytes = gps_read( &m_gps_data, gpsd_msg, MAX_MSG_SIZE );

Статус, режим, флаги и т. д. c. отображаются в выводе отладки libgps

STATUS: status: 2 (DGPS_FIX)
MODE: mode: 3 (MODE_3D)
libgps: final flags: (0x5377c)
{TIME|TIMERR|LATLON|ALTITUDE|SPEED|CLIMB|STATUS|MODE|HERR|VERR|SPEEDERR|CLIMBERR}
libgps: gps_read() -> 270

и в сообщении (gpsd_msg), которое печатается моим клиентом

{"class":"TPV","device":"/dev/ttyACM0","status":2,"mode":3,"time":"2020-04-27T13:56:5
9.000Z","ept":0.005,"lat":26.343147000,"lon":-80.631992833,"alt":16.300,"epx":2.302,"
epy":2.153,"epv":7.878,"speed":0.004,"climb":0.000,"eps":4.60,"epc":15.76,"eph":3.990
,"sep":7.648}

, но m_gps_data.status (struct gps_data_t), по-видимому, единственное, что не было распаковано.

PRINTF_2("gps_bytes %d status %d mode %d lat %g lon %g alt %g\n",
   gps_bytes, m_gps_data.status, m_gps_data.fix.mode, m_gps_data.fix.latitude,
   m_gps_data.fix.longitude, m_gps_data.fix.altitude);

(PRINTF_2 добавляет FILE, LINE и fun c в printf)

nav_thread.cpp:277 (_thread_proc) - gps_bytes 270 status 0 mode 3 lat 26.3431 lon -80.632 alt 16.3

Сборка так:

scons minimal=yes shared=True gpsd=False gpsdclients=False socket_export=yes clientdebug=yes 
    target='aarch64-linux-gnu'

Обновление: я могу обойти проблему, проанализировав статус из сообщения и используя его для установки поля состояния gps_data_t, подобного этому

           if (STATUS_SET == (m_gps_data.set & STATUS_SET))
           {
              if (NULL != strstr(gpsd_msg, "\"status\":1"))
              {
                 PRINTF_("STATUS_FIX\n");
                 m_gps_data.status = STATUS_FIX;
              }
              else if (NULL != strstr(gpsd_msg, "\"status\":2"))
              {
                 PRINTF_("STATUS_DGPS_FIX\n");
                 m_gps_data.status = STATUS_DGPS_FIX;
              }

, но это не исправляет root причина

...