summaryrefslogtreecommitdiffstats
path: root/positioning_hal/hal_api/gps_hal.h
blob: 3321275b8f4c62fd80d128afa20584203b8195c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
/*
 * @copyright Copyright (c) 2018-2020 TOYOTA MOTOR CORPORATION.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef HAL_API_GPS_HAL_H_
#define HAL_API_GPS_HAL_H_

/**
 * @file gps_hal.h
 */

/** @addtogroup positioning
 *  @{
 */
/** @addtogroup positioning_hal
 *  @ingroup positioning
 *  @{
 */

/*---------------------------------------------------------------------------*/
// Include files

#include <native_service/frameworkunified_types.h>
#include <vehicle_service/pos_message_header.h>
#include <vehicle_service/std_types.h>

/*---------------------------------------------------------------------------*/
// Value define

typedef int32               RET_API;
typedef uint32_t            DID;

/*************************************************************************
 *  RET_API define
 *************************************************************************/
/*--- for message ---*/
#define POS_TIMESTS_NG  0x00
//!< \~english time has not been adjusted after GPS receiver reset(time input or master reset or CSF start)
#define POS_TIMESTS_RTC 0x01
//!< \~english time output from RTC Backup(have time adjustment)
#define POS_TIMESTS_OK  0x02   //!< \~english time adjustment completed

/* command ID */
#define CID_POSIF_REGISTER_LISTENER_GPS_TIME          0x0201
//!< \~english GPS time delivery command ID

#define POS_DID_GPS__CWORD82__SETINITIAL                    0x80000033
//!< \~english data ID of setting initial location and time to GPS

#define POS_DID_GPS__CWORD82__SETRMODEEX 0x80000035
//!< \~english data ID of setting GPS receiver mode(pull extension sentence)

#define POS_DID_GPS__CWORD82__SELSENT  0x80000036
//!< \~english data ID of setting command to GPS that output any sentence

/* NAVIINFO_RET_API */
#define  NAVIINFO_RET_NORMAL                  (0)   //!< \~english normal finish
#define  NAVIINFO_RET_ERROR_PARAM             (-1)  //!< \~english parameter error
#define  NAVIINFO_RET_ERROR_INNER             (-2)  //!< \~english internal error
#define  NAVIINFO_RET_ERROR_BUFFULL           (-3)  //!< \~english buffer full
#define  NAVIINFO_RET_ERROR_NOSUPPORT         (-4)  //!< \~english no support
#define  NAVIINFO_RET_ERROR_RESOURCE          (-5)  //!< \~english lack of resource

/* Positioning Level/GPS Information Positioning Status Information Definition */
#define  NAVIINFO_DIAG_GPS_FIX_STS_NON        (0)   //!< \~english position not fix
#define  NAVIINFO_DIAG_GPS_FIX_STS_2D         (1)   //!< \~english 2D position fix
#define  NAVIINFO_DIAG_GPS_FIX_STS_3D         (2)   //!< \~english 3D position fix

/* Reception status definition */
#define  NAVIINFO_DIAG_GPS_RCV_STS_NOTUSE     (0)   //!< \~english not used
#define  NAVIINFO_DIAG_GPS_RCV_STS_SEARCHING  (1)   //!< \~english searching
#define  NAVIINFO_DIAG_GPS_RCV_STS_TRACHING   (2)   //!< \~english tracking
#define  NAVIINFO_DIAG_GPS_RCV_STS_NOTUSEFIX  (3)   //!< \~english not used for position fix
#define  NAVIINFO_DIAG_GPS_RCV_STS_USEFIX     (4)   //!< \~english used for position fix

/* GPS Response Status Definition */
#define GPS_SENDOK                            0     //!< \~english send result OK
#define GPS_SENDNG                            1     //!< \~english send result NG

/* GPS reset request mode definition */
#define GPS_RST_COLDSTART                     0xff
//!< \~english GPS reset request(cold start)

#define RET_NORMAL    0      //!< \~english normally end

#define RET_RCVMSG    1      //!< \~english receive message only
#define RET_RCVSIG    2      //!< \~english receive signal only
#define RET_RCVBOTH   3      //!< \~english receive message and signal
#define RET_NOMSG     4      //!< \~english receive no message

#define RET_QUE       5      //!< \~english insert signal
#define RET_NOTQUE    6      //!< \~english do not insert signal
#define RET_PROCDOWN  7      //!< \~english sub process down found
#define RET_SLEEP     100    //!< \~english sleep time


#define RET_OSERROR   (-127)  //!< \~english OS system call error

#define RET_ERROR     (-1)
//!< \~english abnormally end(do not know reason)
#define RET_ERRPARAM  (-2)   //!< \~english parameter error
#define RET_ERRNOTRDY (-3)
//!< \~english port or semphore ID is not created
#define RET_ERRPROC   (-4)   //!< \~english error occurs in API process
#define RET_ERRTIMEOUT  (-5)
//!< \~english timeout occurs but process unfinished
#define RET_ERRMSGFULL  (-6)  //!< \~english message table full


#define RET_ERROVERFLW  (-7)
//!< \~english message size exceeds receive buffer size

#define RET_ERRINIT   (-8)   //!< \~english  abnormally initialization

#define RET_EV_NONE   (-20)  //!< \~english event does not exist
#define RET_EV_MAX    (-21)  //!< \~english event value exceeds max value
#define RET_EV_MIN    (-22)
//!< \~english event value is lower than min value

/* POS_RET_API */
#define POS_RET_NORMAL              0       //!< \~english normal finish
#define POS_RET_ERROR               (-1)    //!< \~english error occured
#define POS_RET_ERROR_DID           (-2)    //!< \~english data ID error
#define POS_RET_ERROR_INNER         (-3)    //!< \~english internal error
#define POS_RET_ERROR_PARAM         (-4)    //!< \~english parameter error
#define POS_RET_ERROR_BUFFULL       (-5)    //!< \~english buffer full error
#define POS_RET_ERROR_CREATE_EVENT  (-6)    //!< \~english create event error
#define POS_RET_ERROR_OUTOF_MEMORY  (-8)
//!< \~english share memory allocation size error

#define POS_RET_ERROR_SIZE          (-9)    //!< \~english memory size error
#define POS_RET_ERROR_TIMEOUT       (-10)   //!< \~english timeout error
#define POS_RET_ERROR_NOSUPPORT     (-11)   //!< \~english no support
#define POS_RET_ERROR_BUSY          (-12)   //!< \~english busy
#define POS_RET_ERROR_RESOURCE      (-13)   //!< \~english lack of resources
#define POS_RET_ERROR_MIN           (-13)   //!< \~english min value of error


#define NUM_OF_100msData (10)
//!< \~english number of gyro data every 100ms


#define CID_GPS_SERIAL1              (CID)0x0101
//!< \~english Defination of notification about Gps Data has been receiced

#define CID_GPS_SERIAL2  (CID)0x0102  //!< \~english notification about 1PPS interupt


#define CID_GPS_SERIAL3              (CID)0x0103
//!< \~english Defination of SIF2 Data

#define CID_GPS_SERIAL4              (CID)0x0104
//!< \~english Defination of _CWORD82_ command send

#define CID_GPS_SERIAL5              (CID)0x0105
//!< \~english Defination of _CWORD82_ command send

#define CID_GPS_SERIAL6              (CID)0x0106
//!< \~english Defination of u-blox request data

#define CID_GPS_SERIAL7              (CID)0x0107
//!< \~english Defination of u-blox ack data

#define CID_GPS_RECVDATA             (CID)(CID_GPS_BASE | CID_GPS_SERIAL1)
//!< \~english gps data receiced CID

#define CID_GPS_1PPSINT              (CID)(CID_GPS_BASE | CID_GPS_SERIAL2)
//!< \~english 1PPS interupt CID

#define CID_GPS_SIF2DATA             (CID)(CID_GPS_BASE | CID_GPS_SERIAL3)
//!< \~english SIF2 Data CID

/**
 * \~english @brief _CWORD82_ command send CID
 * \~english @brief Message structure\n
 * \~english @brief Message buffer header structure @ref T_APIMSG_MSGBUF_HEADER\n
 * \~english @brief Message header structure @ref T_APIMSG_HEADER\n
 * \~english @brief Message main structure @ref TgGpsSndData\n
 * \~english @brief Message data(Vehicle sensor information setting message) structure @ref VEHICLE_MSG_SEND_DAT\n
 */
#define CID_GPS__CWORD82__REQUEST          (CID)(CID_GPS_BASE | CID_GPS_SERIAL4)

#define CID_GPS_CYCLEDATA_PROV       (CID)(CID_GPS_BASE | CID_GPS_SERIAL5)
//!< \~english Gps cycle data CID

#define CID_GPS_RCV_REQUESTDATA      (CID)(CID_GPS_BASE | CID_GPS_SERIAL6)
//!< \~english u-blox request data CID

#define CID_GPS_RCV_ACKDATA          (CID)(CID_GPS_BASE | CID_GPS_SERIAL7)
//!< \~english u-blox ack data CID

#define CID_GPS_SERIAL8              (CID)0x0108
//!< \~english Defination of Time Setting request

#define CID_GPS_SERIAL9              (CID)0x0109
//!< \~english Defination of Time Setting ack

#define CID_GPS_SERIAL10             (CID)0x010A
//!< \~english Defination of back up data read request

#define CID_GPS_SERIAL11             (CID)0x010B
//!< \~english Defination gps of week count request

/**
 * \~english  @brief Defination of Time Setting request
 * \~english  @brief Message structure\n
 * \~english  @brief Message header structure @ref T_APIMSG_MSGBUF_HEADER\n
 * \~english  @brief Message body structure   @ref TgGpsSndData\n
 * \~english  @brief Positioning information structure @ref POS_MSGINFO\n
 * */
#define CID_GPS_TIMESETTING          (CID)(CID_GPS_BASE | CID_GPS_SERIAL8)

/**
 * \~english  @brief Defination of Time Setting ack
 * \~english  @brief Message structure\n
 * \~english  @brief Message body structure   @ref TG_GPS_RET_TIMESET_MSG\n
 */
#define CID_GPS_RETTIMESETTING       (CID)(CID_GPS_BASE | CID_GPS_SERIAL9)

/**
 * \~english @brief  Read backup data request CID
 * \~english @brief  When this command is received, the backup data is read.\n
 * \~english @brief  Message-Related Structures\n
 * \~english @brief  Message buffer header structure @ref T_APIMSG_MSGBUF_HEADER
 */
#define CID_GPS_BACKUPDATA_LOAD      (CID)(CID_GPS_BASE | CID_GPS_SERIAL10)

/**
 * \~english @brief Gps Week count request CID
 * \~english @brief Message structure\n
 * \~english @brief Message buffer header structure @ref T_APIMSG_MSGBUF_HEADER\n
 * \~english @brief Message header structure @ref T_APIMSG_HEADER\n
 * \~english @brief Message data(Gps Week correction count notify message) structure @ref GpsWeekCorCntMsg\n
 */
#define CID_GPSWEEKCOR_CNT_NOTIFICATION (CID)(CID_GPS_BASE | CID_GPS_SERIAL11)



/**
 * \~english @brief  GPS reset result delivery command ID
 * \~english @brief  If you want to catch above envents, use NSFW like below.
 * \~english @code  
 * l_eStatus = FrameworkunifiedAttachCallbackToDispatcher(hThread, TN_POSITIONING_GPS, CID_POSIF_REQ_GPS_RESET, OnRecivePosResetMsg);
 *            @endcode  
 */
#define CID_POSIF_REQ_GPS_RESET                       0x0784

#define POSHAL_DID_GPS_CONNECT_ERROR   0x800000B5U
//!< \~english GPS receive error DID

#define GPS_READ_LEN                 316
//!< \~english Gps NMEA FULLBINARY max length

#define GPS_CMD_NMEA_GGA_SZ          (71U)        //!< \~english GGA
#define GPS_CMD_NMEA_DGGA_SZ         (75U)        //!< \~english double precison GGA
#define GPS_CMD_NMEA_VTG_SZ          (37U)        //!< \~english VTG
#define GPS_CMD_NMEA_RMC_SZ          (61U)        //!< \~english RMC
#define GPS_CMD_NMEA_DRMC_SZ         (67U)        //!< \~english double precison RMC
#define GPS_CMD_NMEA_GLL_SZ          (44U)        //!< \~english GLL
#define GPS_CMD_NMEA_DGLL_SZ         (50U)        //!< \~english double precison GLL
#define GPS_CMD_NMEA_GSA_SZ          (66U)        //!< \~english GSA
#define GPS_CMD_NMEA_GSV_SZ          (70U)        //!< \~english GSV
#define GPS_CMD_NMEA__CWORD44__GP_3_SZ   (78U)        //!< \~english _CWORD44_,GP,3
#define GPS_CMD_NMEA__CWORD44__GP_4_SZ   (25U)        //!< \~english _CWORD44_,GP,4
#define GPS_CMD_NMEA_P_CWORD82_F_GP_0_SZ   (50U)        //!< \~english _CWORD44_,GP,0
#define GPS_CMD_NMEA_P_CWORD82_J_GP_1_SZ   (31U)        //!< \~english _CWORD44_,GP,1
#define GPS_CMD_NMEA_P_CWORD82_I_GP_SZ     (71U)        //!< \~english P_CWORD82_I,GP
#define GPS_CMD_NMEA_P_CWORD82_E_GP_0_SZ   (50U)        //!< \~english P_CWORD82_E,GP,0
#define GPS_CMD_NMEA_P_CWORD82_J_GP_0_SZ   (63U)        //!< \~english P_CWORD82_J,GP,0
#define GPS_CMD_NMEA_P_CWORD82_E_GP_2_SZ   (21U)        //!< \~english P_CWORD82_E,GP,2
#define GPS_CMD_NMEA_P_CWORD82_G_GP_0_SZ   (34U)        //!< \~english P_CWORD82_G,GP,0
#define GPS_CMD_NMEA_P_CWORD82_J_GP_7_SZ   (37U)        //!< \~english P_CWORD82_J,GP,7
#define GPS_CMD_NMEA_P_CWORD82_J_GP_8_SZ   (45U)        //!< \~english P_CWORD82_J,GP,8
#define GPS_CMD_BINARY_SZ            (81U)        //!< \~english standard binary

#define GPS_CMD_FULLBIN_SZ   (316U)
//!< \~english FULL binary(GPS10 format)

#define GPS_CMD_FULLBIN_VINFO  (30U + 160U + 25U + 8U)
//!< \~english FULL bianry version

#define GPS_NMEA_MAX_SZ    (255U)  //!< \~english NMEA max size
#define GPS_DATASIZE_RTC   (13U)  //!< \~english RTC Data size
#define GPS_NMEARCVSTS_SZ   (1U)  //!< \~english received NMEA size

#define GPS_GPSANT_SZ       (1U)  //!< \~english gps antenna status size
#define GPS_SNSCNT_SZ       (1U)  //!< \~english Sensor Count value size


#define GPS_CMD_NMEA_PROV_SZ  (GPS_CMD_NMEA_DRMC_SZ + GPS_CMD_NMEA_GSA_SZ + \
                                    (GPS_CMD_NMEA_GSV_SZ*3) + GPS_CMD_NMEA__CWORD44__GP_3_SZ)
//!< \~english NMEA size

#define GPS_NMEA_SZ         (GPS_NMEARCVSTS_SZ + GPS_GPSANT_SZ + GPS_SNSCNT_SZ + GPS_CMD_NMEA_PROV_SZ)
//!< \~english NEMA size

#define GPS_FULLBIN_SZ      (GPS_GPSANT_SZ + GPS_SNSCNT_SZ + GPS_CMD_FULLBIN_SZ)
//!< \~english FULLBIN size

#define GPS__CWORD44_GP4_SZ     (GPS_GPSANT_SZ + GPS_SNSCNT_SZ + GPS_CMD_NMEA__CWORD44__GP_4_SZ)
//!< \~english _CWORD44_GP4 size

#define GPS_MSGDATA_SZ_MAX   (512U)  //!< \~english message maximum data size
#define GPS_TLGRM_LEN         253   //!< \~english message data length
#define GPS_MSG_VSINFO_DSIZE  1904  //!< \~english message body size

#define  POS_MSG_INFO_DSIZE       1028 //!< \~english message body maximum size

/**
 * @enum MdevGpsDataKind
 * \~english  enumeration of gps data kind
 */
typedef enum MdevGpsDataKind {
  MDEV_GPS_DATA_RAWDATA_NMEA   = 0,    //!< \~english raw NMEA data of GPS
  MDEV_GPS_DATA_RAWDATA_FULLBIN,       //!< \~english raw binary data of GPS
  MDEV_GPS_DATA_RAWDATA__CWORD44_GP4,      //!< \~english raw _CWORD44_ data of GPS
  MDEV_GPS_DATA_NAVISPEED,             //!< \~english speed data
  MDEV_GPS_DATA_CUSTOMDATA,            //!< \~english position information
  MDEV_GPS_DATA_GPSTIME,               //!< \~english GPS time
  MDEV_GPS_DATA_GPSTIME_RAW,           //!< \~english raw time of GPS
  MDEV_GPS_DATA_INITIAL                //!< \~english initialize data
} MDEV_GPS_DATA_KIND;

/**
 * @struct NAVIINFO_UTCTIME
 * \~english UTC time information structure
 */
typedef struct {
    uint16_t         year;         //!< \~english year
    uint8_t          month;        //!< \~english month
    uint8_t          date;         //!< \~english day
    uint8_t          hour;         //!< \~english hour
    uint8_t          minute;       //!< \~english minute
    uint8_t          second;       //!< \~english second
    uint8_t          reserved;     //!< \~english reserve
} NAVIINFO_UTCTIME;

/**
 * @struct SENSORLOCATION_LONLATINFO_DAT
 * \~english longitude and latitude information data
 *        - Get method(getMethod)
 *        - SENSOR_GET_METHOD_GPS - longitude and latitude from GPS
 *        - SENSOR_GET_METHOD_NAVI - longitude and latitude from Navigation
 *        - Synchrony count(SyncCnt)
 *        - Count for position data synchronous \n
 *          When delivery altitude and heading data, position data can be synchronized by SyncCnt.\n
 *          But the data of different method can not be synchronized by SyncCnt.\n
 *          Example 1: [LonLat from GPS] and [Heading from GPS] can be synchronized by SyncCnt.\n
 *          Example 2: [LonLat from GPS] and [LonLat from Navi] can not be synchronized by SyncCnt.\n
 *          Caution: The sensor count in sensor data delivery is another data.
 *        - Enable or not(isEnable) \n
 *          To describe this delivery message is whether can be used or not
 *        - 0 - not avaliable
 *        - not 0 - avaliable
 *        - when GPS data is specified,longitude and latitude is invalid at following condition:\n
 *          so [not avaliable] provieded
 *        - After system start, GPS unit has not received current location data and GPS unit \n
 *          status is not positioning fixed.
 *        - If it is not initialized status, certainly provide [avaliable] when Navigation data specified
 *        - If the status is [not avaliable], data following can not be guaranteed.
 *        - Position status(posSts)
 *        - It is valid only when "Get method is Navigation" and "evironment is _CWORD80_".(otherwise it will be set as 0)
 *        - Bit0 : GPS data used result(1:used, 0:not used, definition of maskbit:POS_LOC_INFO_USE_GSP)
 *        - Bit1 : DGPS data used result(1:used, 0:not used, definition of maskbit:POS_LOC_INFO_USE_DGPS)
 *        - Bit3 : MapMatching data used result(1:used, 0:not used, definition of \n
 *          maskbit:POS_LOC_INFO_USE_MAPMATCHING)
 *        - Position accuracy(posAcc)
 *        - Detected accruray of current position:1LSB=1m \n
 *        - It is valid only when "Get method is Navigation" and "evironment is _CWORD80_".(otherwise it will be set as 0)\n
 *          0000H:0m \n
 *          0001H:1m \n
 *          :\n
 *          FFFDH:65533m \n
 *          FFFEH:65534m and larger than 65534m \n
 *          FFFFH:no data
 *        - Longitude : (WGS-84)(10^ -7degree as 1) \n
 *          East longitude is positive value and west longitude is negative value.
 *        - Latitude : (WGS-84)(10^ -7degree as 1) \n
 *          North latitude positive value and south latitude is negative value.
 */
typedef struct {
  uint8_t   getMethod;   //!< \~english get method
  uint8_t   SyncCnt;     //!< \~english Synchrony count
  uint8_t   isEnable;    //!< \~english enable or not
  uint8_t   posSts;      //!< \~english position status
  uint16_t  posAcc;      //!< \~english position accuracy
  int32_t   Longitude;   //!< \~english longitude(10^-7degree)
  //!< \~english max: +180.0000000degree[east longitude]
  //!< \~english min: -170.9999999degree[west longitude]
  int32_t   Latitude;    //!< \~english latitude(10^-7degree)
  //!< \~english max: +90.0000000degree[north Latitude]
  //!< \~english min: -90.0000000degree[south Latitude]
} SENSORLOCATION_LONLATINFO_DAT;


/**
 * @struct SENSORLOCATION_ALTITUDEINFO_DAT
 * \~english altitude information data
 *        - Get method(getMethod)
 *        - SENSOR_GET_METHOD_GPS - altitude from GPS
 *        - SENSOR_GET_METHOD_NAVI - altitude from Navigation
 *        - Synchrony count(SyncCnt)
 *        - Count for position data synchronous \n
 *          When delivery altitude and heading data, position data can be synchronized by SyncCnt. \n
 *          But the data of different method can not be synchronized by SyncCnt.\n
 *          example 1: [longitude and latitude from GPS] and [heading from GPS] can be synchronized by SyncCnt.\n
 *          example 2: [longitude and latitude from GPS] and [longitude and latitude from Navi] can not be
 *          synchronized by SyncCnt. \n
 *          Caution: The sensor count in sensor data delivery is another data.
 *        - Enable or not(isEnable) \n
 *          To describe this delivery message is whether can be used or not.
 *        - 0 - not avaliable
 *        - not 0 - avaliable
 *        - when GPS data specified, Altitude is invalid at following condition(so [not avaliable] provieded):
 *        - Immediately after system start, GPS unit has not received current location data and GPS unit status \n
 *          is not positioning fix
 *        - If it is not initialization status, certainly provide [avaliable] when Navi data specified
 *        - If the status is [not avaliable], data following can not be guaranteed.
 *        - Altitude
 *        - altitude data(unit 0.01m)
 */
typedef struct {
  uint8_t   getMethod;    //!< \~english get method
  uint8_t   SyncCnt;      //!< \~english Synchrony count
  uint8_t   isEnable;     //!< \~english enable or not
  uint8_t   Reserved[3];  //!< \~english reserve
  int32_t   Altitude;     //!< \~english altitude(0.01m)
} SENSORLOCATION_ALTITUDEINFO_DAT;


/**
 * @struct SENSORMOTION_HEADINGINFO_DAT
 * \~english heading information data
 *        - Get method(getMethod)
 *        - SENSOR_GET_METHOD_GPS - Heading from GPS
 *        - SENSOR_GET_METHOD_NAVI - Heading from Navi
 *        - Synchrony count(SyncCnt)
 *        - Count for position data synchronous \n
 *          When delivery altitude and heading data, position data can be synchronized by this count. \n
 *          But the data of different method can not be synchronized by this count.\n
 *          example 1: [longitude and latitude from GPS] and [heading from GPS] can be synchronized by the count. \n
 *          example 2: [longitude and latitude from GPS] and [longitude and latitude from Navi] can not be \n
 *          synchronized by the count. \n
 *          Caution: The sensor count in sensor data delivery is another data.
 *        - Enable or not(isEnable) \n
 *          To describe this data is whether enable or not 
 *        - 0 - not avaliable
 *        - not 0 - avaliable
 *        - Heading is invalid at following condition when GPS data specified, so [not avaliable] provieded \n
 *        - Immediately after system start, GPS unit has not received current location data and GPS unit status \n
 *          is not positioning fix
 *        - If it is not initialization status, certainly provide [avaliable] when Navi data specified
 *        - If the status is [not avaliable], data following can not be guaranteed.
 *        - Position status(posSts)
 *        - It is valid only when "Get method is Navi" and "evironment is _CWORD80_".(otherwise it will be set as 0)
 *        - Bit0 : GPS data used result(1:used, 0:not used, definition of maskbit:POS_LOC_INFO_USE_GSP)
 *        - Bit1 : DGPS data used result(1:used, 0:not used, definition of maskbit:POS_LOC_INFO_USE_DGPS)
 *        - Bit3 : MapMatching data used result(1:used, 0:not used, definition of \n
 *          maskbit:POS_LOC_INFO_USE_MAPMATCHING)
 *        - Heading
 *        - Heading data(0.01degree as 1, based on north and clockwise count)\n
 *          But in environment _CWORD95_/_CWORD101___CWORD84_,the heading from Navi is a approximate that separate 360 degree \n
 *          into 16 part. \n
 *          example: 0, 2300, 4500, ..., 31500, 33800
 */
typedef struct {
  uint8_t   getMethod;    //!< \~english get method
  uint8_t   SyncCnt;      //!< \~english Synchrony count
  uint8_t   isEnable;     //!< \~english enable or not
  uint8_t   posSts;       //!< \~english position status
  uint8_t   Reserved1[2];  //!< \~english reserve
  uint16_t  Heading;     //!< \~english heading(0.01degree)
  //!< \~english max: 359.99 degree
  //!< \~english min: 0.00 degree
  uint8_t   Reserved2[2];    //!< \~english reserve
} SENSORMOTION_HEADINGINFO_DAT;

/**
 * @struct NAVIINFO_DIAG_GPS_FIX_CNT
 * \~english position fix count data structure
 */
typedef struct {
  uint32_t    ulCnt3d;    //!< \~english position fix count:3D
  uint32_t    ulCnt2d;    //!< \~english position fix count:2D
  uint32_t    ulCntElse;  //!< \~english position fix count:not fix
} NAVIINFO_DIAG_GPS_FIX_CNT;

/**
 * @struct NAVIINFO_DIAG_GPS_FIX_XYZ
 * \~english longitude and latitude data structure
 */
typedef struct {
  int32_t     lLat;       //!< \~english GPS latitude
  int32_t     lLon;       //!< \~english GPS longitude
} NAVIINFO_DIAG_GPS_FIX_XYZ;

/**
 * @struct NAVIINFO_DIAG_GPS_FIX
 * \~english position fix information structure
 */
typedef struct {
  uint8_t                   ucFixSts;     //!< \~english fix status
  uint8_t                   ucReserve[3];  //!< \~english reserve
  NAVIINFO_DIAG_GPS_FIX_CNT stCnt;        //!< \~english fix count data
  NAVIINFO_DIAG_GPS_FIX_XYZ stWgs84;      //!< \~english longitude and latitude data
} NAVIINFO_DIAG_GPS_FIX;

/**
 * @struct NAVIINFO_DIAG_GPS_PRN
 * \~english satellite information structure
 *        - reception status(ucRcvSts)
 *        - NAVIINFO_DIAG_GPS_RCV_STS_NOTUSE : not used
 *        - NAVIINFO_DIAG_GPS_RCV_STS_SEARCHING : searching
 *        - NAVIINFO_DIAG_GPS_RCV_STS_TRACHING : tracking
 *        - NAVIINFO_DIAG_GPS_RCV_STS_NOTUSEFIX : not used for position fix
 *        - NAVIINFO_DIAG_GPS_RCV_STS_USEFIX : used for position fix
 */
typedef struct {
  uint8_t     ucRcvSts;     //!< \~english reception status
  uint8_t     ucPrn;        //!< \~english satellite No.
  uint8_t     ucelv;        //!< \~english satellite dramatic angle
  uint8_t     ucLv;         //!< \~english satellite signal level
  uint16_t    usAzm;        //!< \~english satellite azimuth
  uint8_t     ucReserve[2];  //!< \~english reserve
} NAVIINFO_DIAG_GPS_PRN;

/**
 * @struct NAVIINFO_DIAG_GPS_SAT
 * \~english all satellite information structure
 */
typedef struct {
  NAVIINFO_DIAG_GPS_PRN   stPrn[12];    //!< \~english all satellite information
} NAVIINFO_DIAG_GPS_SAT;

/**
 * @struct NAVIINFO_DIAG_GPS
 * \~english position fixed and satellite information structure
 */
typedef struct {
  NAVIINFO_DIAG_GPS_FIX   stFix;    //!< \~english position fixed information
  NAVIINFO_DIAG_GPS_SAT   stSat;    //!< \~english all satellite information
} NAVIINFO_DIAG_GPS;

/**
 * @struct NAVIINFO_NAVI_GPS
 * \~english other GPS related information structure
 *        - altitude(altitude) \n
 *          As the altitude is used as unit [0.01m] in internal, \n
 *          the altitude data range is (-21,474,839~21,474,839).
 *        - UTC(utc)
 *        - The time set after rollover.
 *        - date and time status(tdsts)
 *        - 0= time has not been adjusted after GPS receiver reset(time input or master reset or CSF start)
 *        - 1= time output from RTC Backup(have time adjustment result)
 *        - 2= time adjustment completed
 */
typedef struct {
  int32_t           altitude;     //!< \~english altitude
  uint16_t          speed;        //!< \~english speed
  uint16_t          heading;      //!< \~english heading
  NAVIINFO_UTCTIME  utc;          //!< \~english UTC time
  uint8_t           tdsts;        //!< \~english date and time status
  uint8_t           reserve[3];   //!< \~english reserve
} NAVIINFO_NAVI_GPS;

/**
 * @struct NAVIINFO_ALL
 * \~english Navi data structure
 */
typedef struct {
  uint8_t           ucSensorCnt;  //!< \~english sensor count
  uint8_t           reserve[3];   //!< \~english reserve
  NAVIINFO_DIAG_GPS stDiagGps;    //!< \~english position fix related information
  NAVIINFO_NAVI_GPS stNaviGps;    //!< \~english other GPS related information
} NAVIINFO_ALL;

/**
 * @struct POS_MSGINFO
 * \~english message delivery positioning sensor information
 */
typedef struct {
    DID              did;          //!< \~english data ID
    PNO              pno;          //!< \~english delivery destination PNO
    uint16_t         size;         //!< \~english data body size
    uint8_t          rcv_flag;      //!< \~english received flag
    uint8_t          reserve;      //!< \~english reserve
    uint8_t          data[POS_MSG_INFO_DSIZE];  //!< \~english data body
} POS_MSGINFO;

/**
 * @struct SENSOR_GPSTIME
 * \~english GPS time information
 *        - date amd time status(tdsts)
 *        - 0= time has not been adjusted after GPS receiver reset(time input or master reset or CSF start)
 *        - 1= time output from RTC Backup(have time adjustment result)
 *        - 2= time adjustment completed
 */
typedef struct {
  NAVIINFO_UTCTIME  utc;          //!< \~english UTC time
  uint8_t           tdsts;        //!< \~english time status
  uint8_t           reserve[3];   //!< \~english reserve
} SENSOR_GPSTIME;

#define SENSOR_MSG_GPSTIME SENSOR_GPSTIME  //!< \~english GPS time information
#define SENSOR_GPSTIME_RAW SENSOR_GPSTIME  //!< \~english GPS time information

/**
 * @struct MdevGpsCustomData
 * \~english  Struct of Gps custom data
 */
typedef struct MdevGpsCustomData {
  MDEV_GPS_DATA_KIND                  e_kind;      //!< \~english kind
  SENSORLOCATION_LONLATINFO_DAT       st_lonlat;   //!< \~english longtitude,latitude
  SENSORLOCATION_ALTITUDEINFO_DAT     st_altitude;  //!< \~english  altitude
  SENSORMOTION_HEADINGINFO_DAT        st_heading;  //!< \~english  headings
  SENSOR_MSG_GPSTIME                  st_gps_time;  //!< \~english  Gps Time
  NAVIINFO_DIAG_GPS                   st_diag_gps;  //!< \~english  Gps data from diag
} MDEV_GPS_CUSTOMDATA;

/**
 * @struct MdevGpsCustomDataMgs
 * \~english  Struct of Gps custom data message
 */
typedef struct MdevGpsCustomDataMgs {
  T_APIMSG_MSGBUF_HEADER      h_dr;                //!< \~english header
  MDEV_GPS_CUSTOMDATA         st_data;             //!< \~english  Gps Custom Data
} MDEV_GPS_CUSTOMDATA_MGS;

/**
 * @struct MdevGpsRtc
 * \~english  Struct of Gps RTC data
 */
typedef struct MdevGpsRtc {
  u_int32     ul_retsts;                         //!< \~english return status
  u_int8      uc_datalen;                        //!< \~english data length
  u_int8      uc_ctrlcode;                       //!< \~english control code
  u_int8      uc_bcd_year;                        //!< \~english year
  u_int8      uc_bcd_month;                       //!< \~english month
  u_int8      uc_bcd_day;                         //!< \~english day
  u_int8      uc_bcd_hour;                        //!< \~english hour
  u_int8      uc_bcd_min;                         //!< \~english minute
  u_int8      uc_bcd_sec;                         //!< \~english second
  u_int8      uc_status;                         //!< \~english status
  u_int8      u_reserve[3];                       //!< \~english reserve
} MDEV_GPS_RTC;

/**
 * @struct MdevGpsGpsTime
 * \~english  Struct of Gps Time
 */
typedef struct MdevGpsGpsTime {
  MDEV_GPS_DATA_KIND          e_kind;              //!< \~english kind
  MDEV_GPS_RTC                st_rtc_data;          //!< \~english Gps Time
} MDEV_GPS_GPSTIME;

/**
 * @struct MdevGpsGpsTimeMgs
 * \~english  Struct of Gps Time message
 */
typedef struct MdevGpsGpsTimeMgs {
  T_APIMSG_MSGBUF_HEADER      h_dr;                //!< \~english header
  MDEV_GPS_GPSTIME            st_data;             //!< \~english Gps Time Data
} MDEV_GPS_GPSTIME_MGS;

/**
 * @struct DevGpsUtcTime
 * \~english  Struct of Gps UTC time
 */
typedef struct DevGpsUtcTime {
  u_int16                   us_year;               //!< \~english Year
  u_int8                    uc_month;              //!< \~english month
  u_int8                    uc_date;               //!< \~english day
  u_int8                    uc_hour;               //!< \~english hour
  u_int8                    uc_minute;             //!< \~english minute
  u_int8                    uc_second;             //!< \~english second
  u_int8                    u_reserved;           //!< \~english reserve
} DEV_GPS_UTCTIME;

/**
 * @enum MdevGpsFixSts
 * \~english  enumeration of gps fix status
 */
typedef enum MdevGpsFixSts {
  MDEV_GPS_NOTFIX  = 0,                           //!< \~english not fix
  MDEV_GPS_FIX                                    //!< \~english fix
} MDEV_GPS_FIX_STS;

/**
 * @struct MdevGpsNmea
 * \~english  Struct of gps NMEA Data
 */
typedef struct MdevGpsNmea {
  u_int8      uc_nmea_data[GPS_MSG_VSINFO_DSIZE];   //!< \~english NMEA Data
} MDEV_GPS_NMEA;

/**
 * @struct MdevGpsFullbin
 * \~english  Struct of Gps full bin data
 */
typedef struct MdevGpsFullbin {
  u_int8      uc_fullbin_data[GPS_FULLBIN_SZ];      //!< \~english gps full bin data
  u_int8      u_reserve[3];                         //!< \~english reserve
} MDEV_GPS_FULLBIN;

/**
 * @struct MdevGps_CWORD44_gp4
 * \~english  Struct of Gps _CWORD44_GP4 data
 */
typedef struct MdevGps_CWORD44_gp4 {
  u_int8      uc__CWORD44_gp4_data[GPS__CWORD44_GP4_SZ];    //!< \~english gps _CWORD44_GP4 data
  u_int8      u_reserve;                            //!< \~english reserve
} MDEV_GPS__CWORD44_GP4;

/**
 * @struct MdevGpsCycledata
 * \~english  Struct of Gps cycle data
 */
typedef struct MdevGpsCycledata {
  MDEV_GPS_DATA_KIND  e_kind;          //!< \~english kind
  u_int8      uc_data[GPS_MSGDATA_SZ_MAX - sizeof(MDEV_GPS_DATA_KIND)];  //!< \~english data
} MDEV_GPS_CYCLEDATA;

/**
 * @struct MdevGpsCycledataMsg
 * \~english  Struct of Gps cycle data message
 */
typedef struct MdevGpsCycledataMsg {
  T_APIMSG_MSGBUF_HEADER      h_dr;              //!< \~english header
  MDEV_GPS_CYCLEDATA          st_data;           //!< \~english data
} MDEV_GPS_CYCLEDATA_MSG;

/**
 * @struct MdevGpsRawdataNmea
 * \~english  Struct of Gps NMEA Raw Data
 */
typedef struct MdevGpsRawdataNmea {
  MDEV_GPS_DATA_KIND          e_kind;            //!< \~english kind
  MDEV_GPS_NMEA               st_nmea_data;       //!< \~english NMEA Data
} MDEV_GPS_RAWDATA_NMEA;

/**
 * @struct MdevGpsRawdataNmeaMsg
 * \~english  Struct of Gps NMEA Raw Data message
 */
typedef struct MdevGpsRawdataNmeaMsg {
  T_APIMSG_MSGBUF_HEADER      h_dr;              //!< \~english header(see vs-positioning-base-library)
  MDEV_GPS_RAWDATA_NMEA       st_data;           //!< \~english data
} MDEV_GPS_RAWDATA_NMEA_MSG;

/**
 * @struct MdevGpsRawdataFullbin
 * \~english  Struct of Gps Full Bin Raw Data
 */
typedef struct MdevGpsRawdataFullbin {
  MDEV_GPS_DATA_KIND          e_kind;            //!< \~english kind
  MDEV_GPS_FULLBIN            st_fullbin_data;    //!< \~english Full Binary Data
} MDEV_GPS_RAWDATA_FULLBIN;

/**
 * @struct MdevGpsRawdataFullbinMsg
 * \~english  Struct of Gps Full Bin Raw Data message
 */
typedef struct MdevGpsRawdataFullbinMsg {
  T_APIMSG_MSGBUF_HEADER      h_dr;      //!< \~english header
  MDEV_GPS_RAWDATA_FULLBIN    st_data;   //!< \~english Gps Full Bin Data
} MDEV_GPS_RAWDATA_FULLBIN_MSG;

/**
 * @struct MdevGpsRawdata_CWORD44_gp4
 * \~english  Struct of Gps _CWORD44_GP4 Raw Data
 */
typedef struct MdevGpsRawdata_CWORD44_gp4 {
  MDEV_GPS_DATA_KIND          e_kind;            //!< \~english kind
  MDEV_GPS__CWORD44_GP4           st__CWORD44_gp4;       //!< \~english Gps _CWORD44_GP4 Data
} MDEV_GPS_RAWDATA__CWORD44_GP4;

/**
 * @struct MdevGpsRawdata_CWORD44_gp4Msg
 * \~english  Struct of Gps _CWORD44_GP4 Raw Data message
 */
typedef struct MdevGpsRawdata_CWORD44_gp4Msg {
  T_APIMSG_MSGBUF_HEADER      h_dr;     //!< \~english header
  MDEV_GPS_RAWDATA__CWORD44_GP4   st_data;  //!< \~english Gps _CWORD44_GP4 Raw Data
} MDEV_GPS_RAWDATA__CWORD44_GP4_MSG;

/**
 * @struct SENSORMOTION_SPEEDINFO_DAT
 * \~english speed information data
 *        - Get method(getMethod)
 *        - SENSOR_GET_METHOD_POS - The speed calculated in positioning based on speed pulse will be deliveried.
 *        - SENSOR_GET_METHOD_NAVI - speed from Navi
 *        - Synchrony count(SyncCnt)
 *        - 0 (not change).
 *        - Enable or not(isEnable) \n
 *          To describe this data is whether enable or not 
 *        - 0 - not avaliable
 *        - not 0 - avaliable
 *        - Speed is invalid at following condition when speed pulse specified, so [not avaliable] provieded
 *        - Immediately after system start, the sensor data have not been received from SYS micon
 *        - If it is not initialization status, certainly provide [avaliable] when Navi data specified
 *        - If the status is [not avaliable], data following can not be guaranteed.
 *        - Speed
 *        - speed data(unit 0.01m/sec)
 */
typedef struct {
  uint8_t   getMethod;    //!< \~english get method
  uint8_t   SyncCnt;      //!< \~english Synchrony count
  uint8_t   isEnable;     //!< \~english enable or not
  uint8_t   Reserved1[3];  //!< \~english reserve
  uint16_t  Speed;        //!< \~english speed(0.01m/sec)
  uint8_t   Reserved2[2];  //!< \~english reserve
} SENSORMOTION_SPEEDINFO_DAT;

/**
 * @struct MdevGpsNavispeed
 * \~english  Struct of Gps speed data
 */
typedef struct MdevGpsNavispeed {
  MDEV_GPS_DATA_KIND          e_kind;            //!< \~english kind
  u_int16                     us_speed_kmph;     //!< \~english Speed(km/h)
  u_int8                      u_reserve[2];       //!< \~english reserve
  SENSORMOTION_SPEEDINFO_DAT  st_speed;          //!< \~english speed data
} MDEV_GPS_NAVISPEED;

/**
 * @struct MdevGpsNavispeedMsg
 * \~english  Struct of Gps speed data message
 */
typedef struct MdevGpsNavispeedMsg {
  T_APIMSG_MSGBUF_HEADER      h_dr;              //!< \~english header
  MDEV_GPS_NAVISPEED          st_data;           //!< \~english Gps Speed Data
} MDEV_GPS_NAVISPEED_MSG;

/**
 * @struct TgGpsSndData
 * \~english  Struct of _CWORD82_ Gps send data
 */
typedef struct TgGpsSndData {
  uint8_t     reserve[4];                         //!< \~english reserve
  u_int16     us_size;                            //!< \~english send data length
  u_int8      ub_data[502];                       //!< \~english send data
} TG_GPS_SND_DATA;

/**
 * @struct TgGpsRetPram
 * \~english  Gps Response data
 */
typedef struct TgGpsRetPram {
  unsigned int  ret_status;               //!< \~english response flag
  unsigned char data_len;                 //!< \~english data size
  unsigned char ctrl_code;                //!< \~english control code
  unsigned char gps_data[GPS_TLGRM_LEN];  //!< \~english data contents
} TG_GPS_RET_PRAM;

/**
 * @struct SensorWknRollOverHal
 * \~english  Struct of GPS week number
 */
typedef struct SensorWknRollOverHal {
  uint16_t  us_wkn;     //!< \~english  GPS week number
} SENSOR_WKN_ROLLOVER_HAL;

/**
 * @struct POS_DATETIME
 * \~english GPS time information structure
 */
typedef struct {
    uint16_t         year;         //!< \~english year
    uint8_t          month;        //!< \~english month
    uint8_t          date;         //!< \~english day
    uint8_t          hour;         //!< \~english hour
    uint8_t          minute;       //!< \~english minute
    uint8_t          second;       //!< \~english second
    uint8_t          reserved;     //!< \~english reserve
} POS_DATETIME;

/**
 * @struct TG_GPS_RET_RESET
 * \~english GPS reset status
 */
typedef struct {
  unsigned long     ret_rst_status;   //!< \~english response GPS reset status
} TG_GPS_RET_RESET;

/**
 * @struct TG_GPS_RET_RESET_MSG
 * \~english GPS reset information message
 */
typedef struct {
  TG_GPS_RET_RESET    data;   //!< \~english GPS reset status data
} TG_GPS_RET_RESET_MSG;

/**
 * @struct VEHICLE_MSG_SEND_DAT
 * \~english Vehicle information setting message structure
 */
typedef struct {
    DID                       did;          //!< \~english Data ID
    u_int16                   size;         //!< \~english Data size
    u_int8                    data[502];    //!< \~english Data
} VEHICLE_MSG_SEND_DAT;

/**
 * @struct GpsWeekCorCntMsg
 * \~english Gps Week correction count notify message structure
 */
typedef struct GpsWeekCorCntMsg {
  T_APIMSG_MSGBUF_HEADER  stHead;          //!< \~english Message header
  u_int8                  gpsweekcorcnt;    //!< \~english Gps Week correction count
  int8                    dummy[3];         //!< \~english Alignment adjustment
} CLOCKGPS_GPSWEEKCOR_CNT_MSG;

/** @}*/  // end of positioning_hal
/** @}*/  // end of positioning

/*---------------------------------------------------------------------------*/
#endif  // HAL_API_GPS_HAL_H_

/*---------------------------------------------------------------------------*/
/*EOF*/