2 * @copyright Copyright (c) 2016-2020 TOYOTA MOTOR CORPORATION.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 /*******************************************************************************
18 * File name :VehicleSens_Common.cpp
19 * System name :_CWORD107_
20 * Subsystem name :Vehicle sensor process
21 * Program name :Vehicle sensor common processing(VEHICLE_COMMON)
22 * Module configuration :VehicleSensmemcmp() Functions for Common Processing Memory Block Comparisons
23 * VehicleSensCheckDid() Common Processing Data ID Check Function
24 * VehicleSensGetDataMasterOffset() Get function for common processing data master offset value
25 ******************************************************************************/
27 #include <vehicle_service/positioning_base_library.h>
28 #include "VehicleSens_Common.h"
29 #include "POS_private.h"
30 #include <system_service/ss_ver.h>
31 #include <system_service/ss_package.h>
33 #include "VehicleSens_DataMaster.h"
36 #define _pb_strcat(pdest, psrc, size) (strncat(pdest, psrc, size) , (0))
39 /*************************************************/
41 /*************************************************/
42 static const VEHICLESENS_DID_OFFSET_TBL kGstDidList[] = {
43 /* Data ID Offset size Reserved */
44 { VEHICLE_DID_DESTINATION, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
45 { VEHICLE_DID_HV, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
46 { VEHICLE_DID_STEERING_WHEEL, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
47 { VEHICLE_DID_VB, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
48 { VEHICLE_DID_IG, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
49 { VEHICLE_DID_MIC, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
50 { VEHICLE_DID_BACKDOOR, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
51 { VEHICLE_DID_PKB, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
52 { VEHICLE_DID_ADIM, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
53 { VEHICLE_DID_ILL, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
54 { VEHICLE_DID_RHEOSTAT, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
55 { VEHICLE_DID_SYSTEMP, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
56 { POSHAL_DID_SPEED_PULSE, VEHICLESENS_OFFSET_20WORD, {0, 0} },
57 { POSHAL_DID_SPEED_PULSE_FLAG, VEHICLESENS_OFFSET_20WORD, {0, 0} },
58 { POSHAL_DID_SPEED_KMPH, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
59 { POSHAL_DID_GYRO_X, VEHICLESENS_OFFSET_20WORD, {0, 0} },
60 { POSHAL_DID_GYRO_Y, VEHICLESENS_OFFSET_20WORD, {0, 0} },
61 { POSHAL_DID_GYRO_Z, VEHICLESENS_OFFSET_20WORD, {0, 0} },
62 { POSHAL_DID_GSNS_X, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
63 { POSHAL_DID_GSNS_Y, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
64 { POSHAL_DID_GSNS_Z, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
65 { POSHAL_DID_REV, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
66 { POSHAL_DID_GPS_ANTENNA, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
67 { POSHAL_DID_SNS_COUNTER, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
68 { VEHICLE_DID_GPS_COUNTER, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
69 { POSHAL_DID_GPS_VERSION, VEHICLESENS_OFFSET_GPS_FORMAT, {0, 0} },
70 { VEHICLE_DID_LOCATION, VEHICLESENS_OFFSET_GPS_FORMAT, {0, 0} },
71 /* ++GPS _CWORD82_ support */
72 { POSHAL_DID_GPS__CWORD82___CWORD44_GP4, VEHICLESENS_OFFSET_GPS_FORMAT, {0, 0} },
73 { VEHICLE_DID_GPS__CWORD82__NMEA, VEHICLESENS_OFFSET_GPS_NMEA, {0, 0} },
74 { POSHAL_DID_GPS_NMEA, VEHICLESENS_OFFSET_GPS_NMEA, {0, 0} },
75 { POSHAL_DID_GPS__CWORD82__FULLBINARY, VEHICLESENS_OFFSET_GPS_FORMAT, {0, 0} },
76 /* --GPS _CWORD82_ support */
77 { VEHICLE_DID_REV_LINE, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
78 { VEHICLE_DID_REV_CAN, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
79 #if CONFIG_SENSOR_EXT_VALID /* Initial Sensor Support */
80 { POSHAL_DID_GYRO_EXT, VEHICLESENS_OFFSET_20WORD, {0, 0} },
81 { POSHAL_DID_SPEED_PULSE_FST, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
82 { POSHAL_DID_GYRO_X_FST, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
83 { POSHAL_DID_GYRO_Y_FST, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
84 { POSHAL_DID_GYRO_Z_FST, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
85 { POSHAL_DID_SPEED_PULSE_FLAG_FST, VEHICLESENS_OFFSET_20WORD_FST, {0, 0} },
86 { POSHAL_DID_REV_FST, VEHICLESENS_OFFSET_20WORD_FST, {0, 0} },
88 /* ++ PastModel002 support */
89 { VEHICLE_DID_GPS_UBLOX_NAV_POSLLH, VEHICLESENS_OFFSET_GPS_UBLOX, {0, 0} },
90 { VEHICLE_DID_GPS_UBLOX_NAV_STATUS, VEHICLESENS_OFFSET_GPS_UBLOX, {0, 0} },
91 { VEHICLE_DID_GPS_UBLOX_NAV_TIMEUTC, VEHICLESENS_OFFSET_GPS_UBLOX, {0, 0} },
92 { VEHICLE_DID_GPS_UBLOX_NAV_VELNED, VEHICLESENS_OFFSET_GPS_UBLOX, {0, 0} },
93 { VEHICLE_DID_GPS_UBLOX_NAV_DOP, VEHICLESENS_OFFSET_GPS_UBLOX, {0, 0} },
94 { VEHICLE_DID_GPS_UBLOX_NAV_TIMEGPS, VEHICLESENS_OFFSET_GPS_UBLOX, {0, 0} },
95 { VEHICLE_DID_GPS_UBLOX_NAV_SVINFO, VEHICLESENS_OFFSET_GPS_UBLOX, {0, 0} },
96 { VEHICLE_DID_GPS_UBLOX_NAV_CLOCK, VEHICLESENS_OFFSET_GPS_UBLOX, {0, 0} },
97 { VEHICLE_DID_GPS_UBLOX_MON_HW, VEHICLESENS_OFFSET_GPS_UBLOX, {0, 0} },
98 { VEHICLE_DID_GYRO_TROUBLE, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
99 { VEHICLE_DID_MAIN_GPS_INTERRUPT_SIGNAL, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
100 { VEHICLE_DID_SYS_GPS_INTERRUPT_SIGNAL, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
101 { VEHICLE_DID_GYRO_CONNECT_STATUS, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
102 /* -- PastModel002 support */
103 { POSHAL_DID_GPS_TIME, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
104 { POSHAL_DID_GPS_TIME_RAW, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
105 { POSHAL_DID_GPS_WKNROLLOVER, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
106 { VEHICLE_DID_NAVIINFO_DIAG_GPS, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
107 { POSHAL_DID_GYRO_TEMP, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
108 { POSHAL_DID_GYRO_TEMP_FST, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
109 { POSHAL_DID_GSNS_X_FST, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
110 { POSHAL_DID_GSNS_Y_FST, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
111 { POSHAL_DID_GSNS_Z_FST, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
112 { POSHAL_DID_PULSE_TIME, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
113 { VEHICLE_DID_LOCATION_LONLAT, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
114 { VEHICLE_DID_LOCATION_ALTITUDE, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
115 { VEHICLE_DID_MOTION_SPEED, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
116 { VEHICLE_DID_MOTION_HEADING, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
117 { VEHICLE_DID_LOCATION_LONLAT_NAVI, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
118 { VEHICLE_DID_LOCATION_ALTITUDE_NAVI, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
119 { VEHICLE_DID_MOTION_SPEED_NAVI, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
120 { VEHICLE_DID_MOTION_HEADING_NAVI, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
121 { VEHICLE_DID_SETTINGTIME, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
122 { VEHICLE_DID_MOTION_SPEED_INTERNAL, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
123 { POSHAL_DID_GPS_CLOCK_DRIFT, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
124 { POSHAL_DID_GPS_CLOCK_FREQ, VEHICLESENS_OFFSET_NORMAL, {0, 0} },
125 { 0, 0, {0, 0} } /* Termination code */
128 /*******************************************************************************
129 * MODULE : VehicleSensmemcmp
130 * ABSTRACT : Functions for Common Processing Memory Block Comparisons
131 * FUNCTION : Memory block comparison processing
132 * ARGUMENT : *vp_data1 : Comparison target address 1
133 * : *vp_data2 : Comparison target address 2
134 * : uc_size : Comparison Size
136 * RETURN : VEHICLESENS_EQ : No data change
137 * : VEHICLESENS_NEQ : Data change
138 ******************************************************************************/
139 u_int8 VehicleSensmemcmp(const void *vp_data1, const void *vp_data2, size_t uc_size) {
140 u_int8 ret = VEHICLESENS_EQ;
141 const u_int8 *ucp_data1 = (const u_int8 *)vp_data1;
142 const u_int8 *ucp_data2 = (const u_int8 *)vp_data2;
144 /* Loop by data size */
145 while (uc_size > 0) {
146 if (*ucp_data1 != *ucp_data2) {
148 ret = VEHICLESENS_NEQ;
158 /*******************************************************************************
159 * MODULE : VehicleSensCheckDid
160 * ABSTRACT : Common Processing Data ID Check Function
161 * FUNCTION : Check if the specified DID corresponds to the vehicle sensor information
162 * ARGUMENT : ul_did : Data ID
164 * RETURN : VEHICLESENS_INVALID :Disabled
165 * : VEHICLESENS_EFFECTIVE :Enabled
166 ******************************************************************************/
167 int32 VehicleSensCheckDid(DID ul_did) {
169 int32 ret = VEHICLESENS_INVALID;
171 while (0 != kGstDidList[i].ul_did) { // LCOV_EXCL_BR_LINE 200: did always valid
172 if (kGstDidList[i].ul_did == ul_did) {
174 ret = VEHICLESENS_EFFECTIVE;
182 /*******************************************************************************
183 * MODULE : VehicleSensGetDataMasterOffset
184 * ABSTRACT : Get function for common processing data master offset value
185 * FUNCTION : Get the fixed offset value for a given DID
186 * ARGUMENT : ul_did : Data ID
188 * RETURN : Offset value(Returns 0 if DID is invalid)
189 ******************************************************************************/
190 u_int16 VehicleSensGetDataMasterOffset(DID ul_did) {
191 int32 i = 0; /* Generic counters */
192 u_int16 ret = 0; /* Return value of this function */
194 while (0 != kGstDidList[i].ul_did) { // LCOV_EXCL_BR_LINE 200: did always valid
195 if (kGstDidList[i].ul_did == ul_did) {
197 ret = kGstDidList[i].us_offset;
205 /* Ignore->MISRA-C++:2008 Rule 2-7-2 */
206 #if CONFIG_SENSOR_EXT_VALID /* Initial Sensor Support */
207 /*******************************************************************************
208 * MODULE : VehicleSensGetDataMasterExtOffset
209 * ABSTRACT : Get function for common processing data master offset value
210 * FUNCTION : Get the fixed offset value for the first package delivery of the specified DID
211 * ARGUMENT : ul_did : Data ID
213 * RETURN : Offset value(Returns 0 for unspecified DID)
214 ******************************************************************************/
215 u_int16 VehicleSensGetDataMasterExtOffset(DID ul_did) {
216 u_int16 usRet = 0; /* Return value of this function */
219 case POSHAL_DID_GYRO_EXT:
220 case POSHAL_DID_GYRO_X:
221 case POSHAL_DID_GYRO_Y:
222 case POSHAL_DID_GYRO_Z:
223 case POSHAL_DID_GSNS_X: /* Ignore->MISRA-C++:2008 Rule 2-7-2 */
224 case POSHAL_DID_GSNS_Y: /* Ignore->MISRA-C++:2008 Rule 2-7-2 */
225 case POSHAL_DID_GSNS_Z:
226 case POSHAL_DID_SPEED_PULSE:
228 /* Returns the extended package size (one data 2byte) at the time of initial delivery */
229 usRet = VEHICLESENS_OFFSET_10WORD_PKG_EXT;
232 case POSHAL_DID_SNS_COUNTER:
235 /* Returns the extended package size (one data 1byte) at the time of initial delivery */
236 usRet = VEHICLESENS_OFFSET_BYTE_PKG_EXT;
239 case POSHAL_DID_GYRO_TEMP:
241 /* Returns the extended package size (one data 2byte) at the time of initial delivery */
242 usRet = VEHICLESENS_OFFSET_WORD_PKG_EXT;
245 case POSHAL_DID_PULSE_TIME:
247 /* Returns the expansion package size (132 bytes per data) at the time of initial delivery */
248 usRet = VEHICLESENS_OFFSET_32LONG_PKG_EXT;
251 default: /* Other than the above */ /* Ignore->MISRA-C++:2008 Rule 6-3-1, 6-4-1 */
257 /* Ignore->MISRA-C++:2008 Rule 2-7-2 */
261 * GPS version information setting request
263 * Request to set GPS version information to SS
265 * @param[in] pstData Pointer to received message data
267 void VehicleSensSetGpsVersion(const SENSOR_MSG_GPSDATA_DAT *pstData) {
268 static BOOL isExistGpsVersion = FALSE;
271 UNIT_TYPE eType = UNIT_TYPE_NONE; /* Supported HW Configuration Type */
272 EFrameworkunifiedStatus ret;
274 if (isExistGpsVersion == FALSE) {
275 memset(&info, 0x00, sizeof(info));
276 /* Supported HW Configuration Check */
277 eType = GetEnvSupportInfo();
278 if (UNIT_TYPE_GRADE1 == eType) { // LCOV_EXCL_BR_LINE 6:cannot be this env
279 // LCOV_EXCL_START 8 : dead code
280 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
282 memcpy(info.version, pstData->uc_data, sizeof(info.version));
284 /* Calling setPkgInfo() */
285 FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__,
286 "--- VehicleUtility_SetGpsVersion setPkgInfo -->");
287 ret = cssVer.setPkgInfo(SS_PKG_NAVI_GPS, info);
288 if (ret == eFrameworkunifiedStatusOK) {
289 FRAMEWORKUNIFIEDLOG(ZONE_INFO, __FUNCTION__,
290 "--- VehicleUtility_SetGpsVersion setPkgInfo <-- GPSVersion = %s", info.version);
291 isExistGpsVersion = TRUE; /* Update Flag */
294 FRAMEWORKUNIFIEDLOG(ZONE_ERR, __FUNCTION__,
295 "Failed to set PkgInfo EpositioningStatus = %d", ret);
298 } else if ( UNIT_TYPE_GRADE2 == eType ) {
301 * This feature branches processing depending on the unit type.
312 * Acquisition of location and time information (dump)
314 * @param[out] pBuf Dump information
315 * @param[in] Uc_get_method Retrieval method
317 void VehicleSensGetDebugPosDate(void* pBuf, u_int8 uc_get_method) { // LCOV_EXCL_START 7: uesd only in FrameworkunifiedOnDebugDump
318 AGL_ASSERT_NOT_TESTED(); // LCOV_EXCL_LINE 200: test assert
319 static uint8_t buf[DEBUG_DUMP_MAX_SIZE];
320 static uint8_t bufTmp[256];
321 VEHICLESENS_DATA_MASTER stSnsData;
322 SENSORLOCATION_LONLATINFO_DAT *pstLonLat;
323 SENSORLOCATION_ALTITUDEINFO_DAT *pstAltitude;
324 SENSORMOTION_HEADINGINFO_DAT *pstHeading;
325 SENSOR_MSG_GPSDATA_DAT stGpsData;
326 SENSOR_MSG_GPSTIME *pstDateTimeGps;
327 NAVIINFO_DIAG_GPS *pstDiagGps;
330 memset(&buf, 0x00, sizeof(buf));
332 switch ( uc_get_method ) {
333 case VEHICLESENS_GETMETHOD_GPS:
334 snprintf(reinterpret_cast<char *>(&buf), sizeof(buf), "GPS Info");
336 case VEHICLESENS_GETMETHOD_NAVI:
337 snprintf(reinterpret_cast<char *>(&buf), sizeof(buf), "Navi Info");
344 /* Latitude,Longitude */
345 VehicleSensGetLocationLonLat(&stSnsData, uc_get_method);
346 pstLonLat = reinterpret_cast<SENSORLOCATION_LONLATINFO_DAT*>(stSnsData.uc_data);
347 memset(&bufTmp[0], 0x00, sizeof(bufTmp));
348 snprintf( reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp),
349 "\n [LonLat] sync:%3d, Enable:%01d, Lon:%10d, Lat:%10d, PosSts:0x%02x, PosAcc:0x%04x",
352 pstLonLat->Longitude,
356 _pb_strcat(reinterpret_cast<char *>(&buf[0]), reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp));
359 VehicleSensGetLocationAltitude(&stSnsData, uc_get_method);
360 pstAltitude = reinterpret_cast<SENSORLOCATION_ALTITUDEINFO_DAT*>(stSnsData.uc_data);
361 memset(&bufTmp[0], 0x00, sizeof(bufTmp));
362 snprintf(reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp),
363 "\n [Alt] sync:%3d, Enable:%01d, Alt:%10d",
364 pstAltitude->SyncCnt,
365 pstAltitude->isEnable,
366 pstAltitude->Altitude);
367 _pb_strcat(reinterpret_cast<char *>(&buf[0]), reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp));
370 VehicleSensGetMotionHeading(&stSnsData, uc_get_method);
371 pstHeading = reinterpret_cast<SENSORMOTION_HEADINGINFO_DAT*>(stSnsData.uc_data);
372 memset(&bufTmp[0], 0x00, sizeof(bufTmp));
373 snprintf(reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp),
374 "\n [Head] sync:%3d, Enable:%01d, Head:%5d, PosSts:0x%02x",
376 pstHeading->isEnable,
379 _pb_strcat(reinterpret_cast<char *>(&buf[0]), reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp));
381 switch ( uc_get_method ) {
382 case VEHICLESENS_GETMETHOD_GPS:
383 /* Satellite information */
384 VehicleSensGetNaviinfoDiagGPSg(&stGpsData);
385 pstDiagGps = reinterpret_cast<NAVIINFO_DIAG_GPS*>(stGpsData.uc_data);
386 memset(&bufTmp[0], 0x00, sizeof(bufTmp));
387 snprintf(reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp),
388 "\n [Diag]\n FixSts:0x%02x",
389 pstDiagGps->stFix.ucFixSts);
390 _pb_strcat(reinterpret_cast<char *>(&buf[0]), reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp));
391 for (i = 0; i < 12; i++) {
392 memset(&bufTmp[0], 0x00, sizeof(bufTmp));
393 snprintf(reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp),
394 "\n [%02d] RcvSts:0x%02x, prn:0x%02x, elv:0x%02x, Lv:0x%02x, azm:0x%04x",
396 pstDiagGps->stSat.stPrn[i].ucRcvSts,
397 pstDiagGps->stSat.stPrn[i].ucPrn,
398 pstDiagGps->stSat.stPrn[i].ucelv,
399 pstDiagGps->stSat.stPrn[i].ucLv,
400 pstDiagGps->stSat.stPrn[i].usAzm);
401 _pb_strcat(reinterpret_cast<char *>(&buf[0]), reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp));
405 VehicleSensGetGpsTime(&stGpsData, VEHICLESENS_GETMETHOD_GPS);
406 pstDateTimeGps = reinterpret_cast<SENSOR_MSG_GPSTIME*>(stGpsData.uc_data);
407 memset(&bufTmp[0], 0x00, sizeof(bufTmp));
408 snprintf(reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp),
409 "\n [Time] %04d/%02d/%02d %02d:%02d:%02d, sts:%d",
410 pstDateTimeGps->utc.year,
411 pstDateTimeGps->utc.month,
412 pstDateTimeGps->utc.date,
413 pstDateTimeGps->utc.hour,
414 pstDateTimeGps->utc.minute,
415 pstDateTimeGps->utc.second,
416 pstDateTimeGps->tdsts);
417 _pb_strcat(reinterpret_cast<char *>(&buf[0]), reinterpret_cast<char *>(&bufTmp[0]), sizeof(bufTmp));
419 case VEHICLESENS_GETMETHOD_NAVI:
426 memcpy(pBuf, &buf[0], sizeof(buf));