mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-26 16:30:07 +08:00
[gps] update gps_mtk to use generic device
This commit is contained in:
@@ -393,9 +393,12 @@ restart:
|
||||
*/
|
||||
#ifdef GPS_CONFIGURE
|
||||
|
||||
#include "mcu_periph/link_device.h"
|
||||
|
||||
static void MtkSend_CFG(char *dat)
|
||||
{
|
||||
while (*dat != 0) { GpsLink(Transmit(*dat++)); }
|
||||
struct link_device *dev = &((GPS_LINK).device);
|
||||
while (*dat != 0) { dev->transmit(dev->periph, *dat++); }
|
||||
}
|
||||
|
||||
void gps_configure_uart(void)
|
||||
|
||||
@@ -58,7 +58,6 @@ extern struct GpsMtk gps_mtk;
|
||||
#define _GpsLink(dev, _x) __GpsLink(dev, _x)
|
||||
#define GpsLink(_x) _GpsLink(GPS_LINK, _x)
|
||||
|
||||
#define GpsBuffer() GpsLink(ChAvailable())
|
||||
|
||||
#ifdef GPS_CONFIGURE
|
||||
extern bool_t gps_configuring;
|
||||
@@ -70,44 +69,43 @@ extern bool_t gps_configuring;
|
||||
#define GpsConfigure() {}
|
||||
#endif
|
||||
|
||||
#define GpsEvent(_sol_available_callback) { \
|
||||
if (GpsBuffer()) { \
|
||||
ReadGpsBuffer(); \
|
||||
GpsConfigure(); \
|
||||
} \
|
||||
if (gps_mtk.msg_available) { \
|
||||
gps.last_msg_ticks = sys_time.nb_sec_rem; \
|
||||
gps.last_msg_time = sys_time.nb_sec; \
|
||||
gps_mtk_read_message(); \
|
||||
if (gps_mtk.msg_class == MTK_DIY14_ID && \
|
||||
gps_mtk.msg_id == MTK_DIY14_NAV_ID) { \
|
||||
if (gps.fix == GPS_FIX_3D) { \
|
||||
gps.last_3dfix_ticks = sys_time.nb_sec_rem; \
|
||||
gps.last_3dfix_time = sys_time.nb_sec; \
|
||||
} \
|
||||
_sol_available_callback(); \
|
||||
} \
|
||||
if (gps_mtk.msg_class == MTK_DIY16_ID && \
|
||||
gps_mtk.msg_id == MTK_DIY16_NAV_ID) { \
|
||||
if (gps.fix == GPS_FIX_3D) { \
|
||||
gps.last_3dfix_ticks = sys_time.nb_sec_rem; \
|
||||
gps.last_3dfix_time = sys_time.nb_sec; \
|
||||
} \
|
||||
_sol_available_callback(); \
|
||||
} \
|
||||
gps_mtk.msg_available = FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define ReadGpsBuffer() { \
|
||||
while (GpsLink(ChAvailable())&&!gps_mtk.msg_available) \
|
||||
gps_mtk_parse(GpsLink(Getch())); \
|
||||
}
|
||||
|
||||
|
||||
extern void gps_mtk_read_message(void);
|
||||
extern void gps_mtk_parse(uint8_t c);
|
||||
|
||||
static inline void GpsEvent(void (* _sol_available_callback)(void))
|
||||
{
|
||||
struct link_device *dev = &((GPS_LINK).device);
|
||||
|
||||
if (dev->char_available(dev->periph)) {
|
||||
while (dev->char_available(dev->periph) && !gps_ubx.msg_available) {
|
||||
gps_mtk_parse(dev->getchar(dev->periph));
|
||||
}
|
||||
GpsConfigure();
|
||||
}
|
||||
if (gps_mtk.msg_available) {
|
||||
gps.last_msg_ticks = sys_time.nb_sec_rem;
|
||||
gps.last_msg_time = sys_time.nb_sec;
|
||||
gps_mtk_read_message();
|
||||
if (gps_mtk.msg_class == MTK_DIY14_ID &&
|
||||
gps_mtk.msg_id == MTK_DIY14_NAV_ID) {
|
||||
if (gps.fix == GPS_FIX_3D) {
|
||||
gps.last_3dfix_ticks = sys_time.nb_sec_rem;
|
||||
gps.last_3dfix_time = sys_time.nb_sec;
|
||||
}
|
||||
_sol_available_callback();
|
||||
}
|
||||
if (gps_mtk.msg_class == MTK_DIY16_ID &&
|
||||
gps_mtk.msg_id == MTK_DIY16_NAV_ID) {
|
||||
if (gps.fix == GPS_FIX_3D) {
|
||||
gps.last_3dfix_ticks = sys_time.nb_sec_rem;
|
||||
gps.last_3dfix_time = sys_time.nb_sec;
|
||||
}
|
||||
_sol_available_callback();
|
||||
}
|
||||
gps_mtk.msg_available = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* dynamic GPS configuration
|
||||
*/
|
||||
|
||||
@@ -105,33 +105,7 @@ let parse_message = fun class_name m ->
|
||||
if l <> !offset then raise (Length_error (m, l, !offset))
|
||||
with
|
||||
Xml.No_attribute("length") -> () (** Undefined length authorized *)
|
||||
end;
|
||||
|
||||
(** Generating send function *)
|
||||
let param_name = fun f -> String.lowercase (field_name f) in
|
||||
let rec param_names = fun f r ->
|
||||
if Xml.tag f = "field" then
|
||||
param_name f :: r
|
||||
else
|
||||
List.fold_right param_names (Xml.children f) r in
|
||||
let param_type = fun f -> c_type (format f) in
|
||||
fprintf out "\n#define MtkSend_%s_%s(" class_name msg_name;
|
||||
fprintf out "%s" (String.concat "," (param_names m []));
|
||||
fprintf out ") { \\\n";
|
||||
fprintf out " MtkHeader(MTK_%s_ID, %s, %d);\\\n" class_name msg_id !offset;
|
||||
let rec send_one_field = fun f ->
|
||||
match Xml.tag f with
|
||||
"field" ->
|
||||
let s = sizeof (format f) in
|
||||
let p = param_name f in
|
||||
let t = param_type f in
|
||||
fprintf out " %s _%s = %s; MtkSend%dByAddr((uint8_t*)&_%s);\\\n" t p p s p
|
||||
| "block" ->
|
||||
List.iter send_one_field (Xml.children f)
|
||||
| _ -> assert (false) in
|
||||
List.iter send_one_field (Xml.children m);
|
||||
fprintf out " MtkTrailer();\\\n";
|
||||
fprintf out "}\n\n#define MTK_%s_%s_LENGTH %d\n" class_name msg_name !offset
|
||||
end
|
||||
|
||||
|
||||
let parse_class = fun c ->
|
||||
|
||||
Reference in New Issue
Block a user