aboutsummaryrefslogtreecommitdiff
path: root/apps/gps/mtk.h
blob: 9fc1caec8367f056d1aeb3ffa817fe81139e15f8 (plain) (blame)
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
/*
 * mtk.h
 *
 *  Created on: Mar 6, 2012
 *      Author: thomasgubler
 */

#ifndef MTK_H_
#define MTK_H_

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <pthread.h>

//Definition for mtk custom mode
#define MEDIATEK_REFRESH_RATE_4HZ "$PMTK220,250*29\r\n" //refresh rate - 4Hz - 250 milliseconds
#define MEDIATEK_REFRESH_RATE_5HZ "$PMTK220,200*2C\r\n"
#define MEDIATEK_REFRESH_RATE_10HZ "$PMTK220,100*2F\r\n" //refresh rate - 10Hz - 100 milliseconds
#define MEDIATEK_FACTORY_RESET "$PMTK104*37\r\n" //clear current settings
#define MEDIATEK_CUSTOM_BINARY_MODE "$PGCMD,16,0,0,0,0,0*6A\r\n"
#define MEDIATEK_FULL_COLD_RESTART "$PMTK104*37\r\n"
//#define NMEA_GGA_ENABLE "$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0*27\r\n" //Set GGA messages

//definitions for watchdog
#define MTK_WATCHDOG_CRITICAL_TIME_MICROSECONDS 2000000
#define MTK_WATCHDOG_WAIT_TIME_MICROSECONDS 800000




// ************
// the structure of the binary packet

typedef struct {
	uint8_t payload; ///< Number of payload bytes
	int32_t latitude;  ///< Latitude in degrees * 10^7
	int32_t longitude; ///< Longitude in degrees * 10^7
	uint32_t msl_altitude;  ///< MSL altitude in meters * 10^2
	uint32_t ground_speed; ///< FIXME SPEC UNCLEAR
	int32_t heading;
	uint8_t satellites;
	uint8_t fix_type;
	uint32_t date;
	uint32_t utc_time;
	uint16_t hdop;
	uint8_t ck_a;
	uint8_t ck_b;
}  __attribute__((__packed__)) type_gps_bin_mtk_packet;

typedef type_gps_bin_mtk_packet gps_bin_mtk_packet_t;

enum MTK_DECODE_STATES {
	MTK_DECODE_UNINIT = 0,
	MTK_DECODE_GOT_CK_A = 1,
	MTK_DECODE_GOT_CK_B = 2
};

typedef struct {
	union {
		uint16_t ck;
		struct {
			uint8_t ck_a;
			uint8_t ck_b;
		};
	};
	uint8_t decode_state;
//    bool new_data;
//    uint8_t fix;
	bool print_errors;
	int16_t rx_count;

	uint64_t last_message_timestamp;
}  __attribute__((__packed__)) type_gps_bin_mtk_state;

typedef type_gps_bin_mtk_state gps_bin_mtk_state_t;

extern pthread_mutex_t *mtk_mutex;
extern gps_bin_mtk_state_t *mtk_state;

void mtk_decode_init(void);

void mtk_checksum(uint8_t b, uint8_t *ck_a, uint8_t *ck_b);

int mtk_parse(uint8_t b,  char *gps_rx_buffer);

int read_gps_mtk(int *fd, char *gps_rx_buffer, int buffer_size);

int configure_gps_mtk(int *fd);

void *mtk_loop(void *args);

void *mtk_watchdog_loop(void *args);

#endif /* MTK_H_ */