Skip to content

Commit 3a6b453

Browse files
VitaliyKurokhtinTrevelopment
authored andcommitted
Hud units (#162)
* Cleaning HUD on navigation stop. * Using AA distance unit for HUD display
1 parent 4a869a5 commit 3a6b453

File tree

5 files changed

+167
-40
lines changed

5 files changed

+167
-40
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ mazda/installer/config/androidauto/data_persist/dev/bin/headunit
1010
*.creator.user
1111
bin/
1212
*/version\.h
13+
.vscode

hu/hu.proto

+17-1
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,12 @@ message BluetoothAuthData
701701

702702
message NAVMessagesStatus
703703
{
704-
optional int32 status = 1;
704+
enum STATUS
705+
{
706+
START = 1;
707+
STOP = 2;
708+
}
709+
optional STATUS status = 1;
705710
}
706711

707712
message NAVTurnMessage
@@ -746,4 +751,15 @@ message NAVDistanceMessage
746751
{
747752
optional int32 distance = 1; //meters
748753
optional int32 time_until = 2; //seconds
754+
optional uint64 display_distance = 3; //distance rounded for display
755+
enum DISPLAY_DISTANCE_UNIT
756+
{
757+
METERS = 1; // meters * 1000, used when rounded distance < 1000m
758+
KILOMETERS10 = 2; // kilometers * 1000, used when rounded distance > 10km, not same as just meters because "km" is displayed on screen
759+
KILOMETERS = 3; // kilometers * 1000, used when rounded distance between 1km and 10km, not same as just meters because "km" is displayed on screen
760+
MILES10 = 4; // miles * 1000, used when rounded distance > 10mi
761+
MILES = 5; // miles * 1000, used when rounded distance between 1mi and 10mi
762+
FEET = 6; // feet * 1000
763+
}
764+
optional DISPLAY_DISTANCE_UNIT display_distance_unit = 4;
749765
}

mazda/callbacks.cpp

+130-25
Original file line numberDiff line numberDiff line change
@@ -649,63 +649,168 @@ void AudioManagerClient::Notify(const std::string &signalName, const std::string
649649
}
650650
}
651651

652+
extern NaviData *navi_data;
653+
extern std::mutex hudmutex;
654+
652655
void MazdaEventCallbacks::HandleNaviStatus(IHUConnectionThreadInterface& stream, const HU::NAVMessagesStatus &request){
656+
if (request.status() == HU::NAVMessagesStatus_STATUS_STOP) {
657+
hudmutex.lock();
658+
navi_data->event_name = "";
659+
navi_data->turn_event = 0;
660+
navi_data->turn_side = 0;
661+
navi_data->turn_number = -1;
662+
navi_data->turn_angle = -1;
663+
navi_data->changed = 1;
664+
navi_data->previous_msg = navi_data->previous_msg + 1;
665+
if (navi_data->previous_msg == 8){
666+
navi_data->previous_msg = 1;
667+
}
668+
hudmutex.unlock();
669+
}
653670
}
654671

655-
extern NaviData *navi_data;
656-
extern std::mutex hudmutex;
672+
void logUnknownFields(const ::google::protobuf::UnknownFieldSet& fields);
657673

658674
void MazdaEventCallbacks::HandleNaviTurn(IHUConnectionThreadInterface& stream, const HU::NAVTurnMessage &request){
675+
logw("NAVTurnMessage: turn_side: %d, turn_event: %d, turn_number: %d, turn_angle: %d, event_name: %s",
676+
request.turn_side(),
677+
request.turn_event(),
678+
request.turn_number(),
679+
request.turn_angle(),
680+
request.event_name().c_str()
681+
);
682+
logUnknownFields(request.unknown_fields());
683+
659684
hudmutex.lock();
660685
int changed = 0;
661-
if(navi_data->event_name != request.event_name()){
686+
if (navi_data->event_name != request.event_name()) {
662687
navi_data->event_name = request.event_name();
663688
changed = 1;
664689
}
665-
if(navi_data->turn_event != request.turn_event()){
690+
if (navi_data->turn_event != request.turn_event()) {
666691
navi_data->turn_event = request.turn_event();
667692
changed = 1;
668693
}
669-
if(navi_data->turn_side != request.turn_side()){
694+
if (navi_data->turn_side != request.turn_side()) {
670695
navi_data->turn_side = request.turn_side();
671696
changed = 1;
672697
}
673-
if(navi_data->turn_number != request.turn_number()){
698+
if (navi_data->turn_number != request.turn_number()) {
674699
navi_data->turn_number = request.turn_number();
675700
changed = 1;
676701
}
677-
if(navi_data->turn_angle != request.turn_angle()){
702+
if (navi_data->turn_angle != request.turn_angle()) {
678703
navi_data->turn_angle = request.turn_angle();
679704
changed = 1;
680705
}
681-
if(changed){
706+
if (changed) {
682707
navi_data->changed = 1;
683708
navi_data->previous_msg = navi_data->previous_msg+1;
684-
if(navi_data->previous_msg == 8){
709+
if (navi_data->previous_msg == 8) {
685710
navi_data->previous_msg = 1;
686711
}
687712
}
688713
hudmutex.unlock();
689714
}
690715

691-
void MazdaEventCallbacks::HandleNaviTurnDistance(IHUConnectionThreadInterface& stream, const HU::NAVDistanceMessage &request){
716+
void MazdaEventCallbacks::HandleNaviTurnDistance(IHUConnectionThreadInterface& stream, const HU::NAVDistanceMessage &request) {
692717
hudmutex.lock();
693-
if(request.distance() > 1000){
694-
int now_distance = request.distance()/100;
695-
if(now_distance != navi_data->distance){
696-
navi_data->distance_unit = 3;
697-
navi_data->distance = now_distance;
698-
navi_data->changed = 1;
699-
}
718+
int now_distance;
719+
HudDistanceUnit now_unit;
720+
switch (request.display_distance_unit()) {
721+
case HU::NAVDistanceMessage_DISPLAY_DISTANCE_UNIT_METERS:
722+
now_distance = request.display_distance() / 100;
723+
now_unit = HudDistanceUnit::METERS;
724+
break;
725+
case HU::NAVDistanceMessage_DISPLAY_DISTANCE_UNIT_KILOMETERS10:
726+
case HU::NAVDistanceMessage_DISPLAY_DISTANCE_UNIT_KILOMETERS:
727+
now_distance = request.display_distance() / 100;
728+
now_unit = HudDistanceUnit::KILOMETERS;
729+
break;
730+
case HU::NAVDistanceMessage_DISPLAY_DISTANCE_UNIT_MILES10:
731+
case HU::NAVDistanceMessage_DISPLAY_DISTANCE_UNIT_MILES:
732+
now_distance = request.display_distance() / 100;
733+
now_unit = HudDistanceUnit::MILES;
734+
break;
735+
case HU::NAVDistanceMessage_DISPLAY_DISTANCE_UNIT_FEET:
736+
now_distance = request.display_distance() / 100;
737+
now_unit = HudDistanceUnit::FEET;
738+
break;
739+
default: //not sure, use SI and log
740+
logw("NAVDistanceMessage: distance: %d, time: %d, display_distance: %u, display_distance_unit: %d",
741+
request.distance(),
742+
request.time_until(),
743+
request.display_distance(),
744+
request.display_distance_unit()
745+
);
746+
logUnknownFields(request.unknown_fields());
747+
748+
if (request.distance() > 1000) {
749+
now_distance = request.distance() / 100;
750+
now_unit = HudDistanceUnit::KILOMETERS;
751+
} else {
752+
now_distance = (((request.distance() + 5) / 10) * 10) * 10;
753+
now_unit = HudDistanceUnit::METERS;
754+
}
700755
}
701-
else{
702-
int now_distance = (((request.distance() + 5) / 10)*10)*10;
703-
if(now_distance != navi_data->distance){
704-
navi_data->distance_unit = 1;
705-
navi_data->distance = now_distance;
706-
navi_data->changed = 1;
707-
}
756+
757+
if (now_distance != navi_data->distance || now_unit != navi_data->distance_unit) {
758+
navi_data->distance_unit = now_unit;
759+
navi_data->distance = now_distance;
760+
navi_data->changed = 1;
761+
}
762+
763+
if (navi_data->time_until != request.time_until()) {
764+
navi_data->time_until = request.time_until();
765+
navi_data->changed = 1;
708766
}
709-
navi_data->time_until = request.time_until();
767+
710768
hudmutex.unlock();
711769
}
770+
771+
void logUnknownFields(const ::google::protobuf::UnknownFieldSet& fields) {
772+
for (int i = 0; i < fields.field_count(); i++) {
773+
switch (fields.field(i).type()) {
774+
case 0: // TYPE_VARINT
775+
logw("ExtraField: number: %d, type: %d, value: %d",
776+
fields.field(i).number(),
777+
0,
778+
fields.field(i).varint()
779+
);
780+
break;
781+
case 1: // TYPE_FIXED32
782+
logw("ExtraField: number: %d, type: %d, value: %d",
783+
fields.field(i).number(),
784+
1,
785+
fields.field(i).fixed32()
786+
);
787+
break;
788+
case 2: // TYPE_FIXED64
789+
logw("ExtraField: number: %d, type: %d, value: %d",
790+
fields.field(i).number(),
791+
2,
792+
fields.field(i).fixed64()
793+
);
794+
break;
795+
case 3: // TYPE_LENGTH_DELIMITED
796+
logw("ExtraField: number: %d, type: %d, value: %s",
797+
fields.field(i).number(),
798+
3,
799+
&(fields.field(i).length_delimited())
800+
);
801+
break;
802+
case 4: // TYPE_GROUP
803+
logw("ExtraField: number: %d, type: %d",
804+
fields.field(i).number(),
805+
4
806+
);
807+
break;
808+
default:
809+
logw("ExtraField: number: %d, type: %d",
810+
fields.field(i).number(),
811+
fields.field(i).type()
812+
);
813+
break;
814+
}
815+
}
816+
}

mazda/hud/hud.cpp

+9-12
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ static TMCClient *tmc_client = NULL;
2626

2727
NaviData *navi_data = NULL;
2828

29-
30-
3129
uint8_t turns[][3] = {
3230
{0,0,0}, //TURN_UNKNOWN
3331
{NaviTurns::FLAG_LEFT,NaviTurns::FLAG_RIGHT,NaviTurns::FLAG}, //TURN_DEPART
@@ -36,8 +34,8 @@ uint8_t turns[][3] = {
3634
{NaviTurns::LEFT,NaviTurns::RIGHT,0}, //TURN_TURN
3735
{NaviTurns::SHARP_LEFT,NaviTurns::SHARP_RIGHT,0}, //TURN_SHARP_TURN
3836
{NaviTurns::U_TURN_LEFT, NaviTurns::U_TURN_RIGHT,0}, //TURN_U_TURN
39-
{NaviTurns::LEFT,NaviTurns::RIGHT,0}, //TURN_ON_RAMP
40-
{NaviTurns::LEFT,NaviTurns::RIGHT,0}, //TURN_OFF_RAMP
37+
{NaviTurns::LEFT,NaviTurns::RIGHT,NaviTurns::STRAIGHT}, //TURN_ON_RAMP
38+
{NaviTurns::LEFT,NaviTurns::RIGHT,NaviTurns::STRAIGHT}, //TURN_OFF_RAMP
4139
{NaviTurns::FORK_LEFT, NaviTurns::FORK_RIGHT, 0}, //TURN_FORK
4240
{NaviTurns::MERGE_LEFT, NaviTurns::MERGE_RIGHT, 0}, //TURN_MERGE
4341
{0,0,0}, //TURN_ROUNDABOUT_ENTER
@@ -68,18 +66,17 @@ void hud_thread_func(std::condition_variable& quitcv, std::mutex& quitmutex, std
6866
hudmutex.lock();
6967

7068
uint32_t diricon;
71-
if(navi_data->turn_event == 13){
72-
diricon = roundabout(navi_data->turn_angle);
73-
}
74-
else{
69+
if (navi_data->turn_event == 13) {
70+
diricon = roundabout(navi_data->turn_angle);
71+
} else {
7572
int32_t turn_side = navi_data->turn_side-1; //Google starts at 1 for some reason...
7673
diricon = turns[navi_data->turn_event][turn_side];
7774
}
7875

7976
::DBus::Struct< uint32_t, uint16_t, uint8_t, uint16_t, uint8_t, uint8_t > hudDisplayMsg;
8077
hudDisplayMsg._1 = diricon;
81-
hudDisplayMsg._2 = navi_data->distance;
82-
hudDisplayMsg._3 = navi_data->distance_unit; //distance unit 1 = meter?
78+
hudDisplayMsg._2 = navi_data->distance;// distance;
79+
hudDisplayMsg._3 = navi_data->distance_unit;
8380
hudDisplayMsg._4 = 0; //Speed limit (Not Used)
8481
hudDisplayMsg._5 = 0; //Speed limit units (Not used)
8582
hudDisplayMsg._6 = navi_data->previous_msg;
@@ -116,7 +113,7 @@ void hud_start()
116113
{
117114
if (hud_client != NULL)
118115
return;
119-
116+
120117
try
121118
{
122119
DBus::Connection service_bus(SERVICE_BUS_ADDRESS, false);
@@ -164,4 +161,4 @@ bool hud_installed()
164161
loge("DBUS: GetHUDIsInstalled failed %s: %s\n", error.name(), error.message());
165162
return(false);
166163
}
167-
}
164+
}

mazda/hud/hud.h

+10-2
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,22 @@
1010

1111
#include "../dbus/generated_cmu.h"
1212

13+
enum HudDistanceUnit: uint8_t {
14+
METERS = 1,
15+
MILES = 2,
16+
KILOMETERS = 3,
17+
YARDS = 4,
18+
FEET = 5
19+
};
20+
1321
struct NaviData {
1422
std::string event_name;
1523
int32_t turn_side;
1624
int32_t turn_event;
1725
int32_t turn_number;
1826
int32_t turn_angle;
19-
int32_t distance;
20-
uint8_t distance_unit;
27+
int32_t distance; // distance * 10, encoded like that to store one digit after decimal dot in int type
28+
HudDistanceUnit distance_unit;
2129
int32_t time_until;
2230
uint8_t previous_msg;
2331
uint8_t changed;

0 commit comments

Comments
 (0)