From e967138326f4a78c4ed76b993f3dcd29104ec3ad Mon Sep 17 00:00:00 2001 From: egisz Date: Thu, 8 Jun 2023 15:07:58 +0300 Subject: [PATCH] update plugin to match current dash version --- bmw_f10_idrive.cpp | 93 +++++++++++++++++++++++---------------------- bmw_f10_idrive.hpp | 2 + bmw_f10_idrive.json | 4 ++ setup_can.sh | 88 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+), 45 deletions(-) create mode 100644 bmw_f10_idrive.json create mode 100755 setup_can.sh diff --git a/bmw_f10_idrive.cpp b/bmw_f10_idrive.cpp index 386c18b..fa547fd 100644 --- a/bmw_f10_idrive.cpp +++ b/bmw_f10_idrive.cpp @@ -2,39 +2,30 @@ #include "bmw_f10_idrive.hpp" -// QString BmwF10::toDebug(const QByteArray & line) { - -// QString s; -// uchar c; - -// for ( int i=0 ; i < line.size() ; i++ ){ -// c = line[i]; -// if ( c >= 0x20 and c <= 126 ) { -// s.append(c); -// } else { -// s.append(QString("<%1>").arg(c, 2, 16, QChar('0'))); -// } -// } -// return s; -// } +BmwF10::~BmwF10() +{ + if (this->debug) + delete this->debug; +} bool BmwF10::init(ICANBus* canbus){ + F10_LOG(info)<<"loading plugin..."; if (this->arbiter) { this->debug = new DebugWindow(*this->arbiter); - F10_LOG(info)<<"loading plugin..."; this->canbus = canbus; canbus->registerFrameHandler(0x264, [this](QByteArray payload){this->monitorIdriveRotaryStatus(payload);}); canbus->registerFrameHandler(0x267, [this](QByteArray payload){this->monitorIdriveButtonStatus(payload);}); canbus->registerFrameHandler(0x21A, [this](QByteArray payload){this->monitorGearStatus(payload);}); - canbus->registerFrameHandler(0x1A1, [this](QByteArray payload){this->monitorVehicleSpeed(payload);}); - canbus->registerFrameHandler(0x0A5, [this](QByteArray payload){this->monitorEngineRPM(payload);}); + // canbus->registerFrameHandler(0x1A1, [this](QByteArray payload){this->monitorVehicleSpeed(payload);}); + // canbus->registerFrameHandler(0x0A5, [this](QByteArray payload){this->monitorEngineRPM(payload);}); canbus->registerFrameHandler(0x273, [this](QByteArray payload){this->monitorCicStatus(payload);}); // Switch to TV screen on connect. - auto *oaPage = this->arbiter->layout().openauto_page; - connect(oaPage, &OpenAutoPage::connected, this, [this](bool connected){ - this->switchTVInput(); - }); + // connected event was removed :( + // auto *oaPage = this->arbiter->layout().openauto_page; + // connect(oaPage, &OpenAutoPage::connected, this, [this](bool connected){ + this->switchTVInput(); + // }); F10_LOG(info)<<"loaded successfully"; return true; } @@ -47,7 +38,9 @@ bool BmwF10::init(ICANBus* canbus){ QList BmwF10::widgets() { QList tabs; - tabs.append(this->debug); + if (this->debug) { + tabs.append(this->debug); + } return tabs; } @@ -63,11 +56,11 @@ void BmwF10::monitorIdriveRotaryStatus(QByteArray payload){ if (this->rotaryPos < this->rotaryPrevPos && this->rotaryPrevPos != -1) { // rotate counter clockwise this->arbiter->send_openauto_button_press(aasdk::proto::enums::ButtonCode::SCROLL_WHEEL, openauto::projection::WheelDirection::LEFT); - F10_LOG(info)<<"Rotate counter clockwise"; + // F10_LOG(info)<<"Rotate counter clockwise"; } else if (this->rotaryPos > this->rotaryPrevPos && this->rotaryPrevPos != -1) { // rotate clockwise this->arbiter->send_openauto_button_press(aasdk::proto::enums::ButtonCode::SCROLL_WHEEL, openauto::projection::WheelDirection::RIGHT); - F10_LOG(info)<<"Rotate clockwise"; + // F10_LOG(info)<<"Rotate clockwise"; } this->debug->rotaryPos->setText(QString::number(this->rotaryPos)); } @@ -79,32 +72,39 @@ void BmwF10::monitorIdriveButtonStatus(QByteArray payload){ // unsigned char j = 0xE1; // F10_LOG(info)<<"got 0x267 frame: "<< QString::number(j, 16).toStdString(); // qDebug() << "Value : " << hex << j; + //if(this->cic_fullscreen && payload.at(2) > this->msgCounter && - if(this->cic_fullscreen && payload.at(2) > this->msgCounter && + if(payload.at(2) > this->msgCounter && payload.at(0) == 0xE1 && payload.at(1) == 0xFD && (payload.at(4) == 0xDD || payload.at(4) == 0xDE)) { if(payload.at(3) == 0x00 && this->lastKey != aasdk::proto::enums::ButtonCode::NONE){ // Release - F10_LOG(info)<<"Idrive button release"; + // F10_LOG(info)<<"Idrive button release"; this->arbiter->send_openauto_button_press(this->lastKey); this->lastKey = aasdk::proto::enums::ButtonCode::NONE; - } else if(payload.at(3) == 0x01 && payload.at(4) == 0xDE){ - // Enter - F10_LOG(info)<<"Enter"; + // } else if(payload.at(3) == 0x01 && payload.at(4) == 0xDE){ + } else if(payload.at(3) == 0x11 && payload.at(4) == 0xDD){ + // UP -> Enter + // F10_LOG(info)<<"Up -> Enter"; this->lastKey = aasdk::proto::enums::ButtonCode::ENTER; this->debug->lastKey->setText(QString("Enter")); - } else if(payload.at(3) == 0x11 && payload.at(4) == 0xDD){ - // UP - F10_LOG(info)<<"Idrive button UP"; + // } else if(payload.at(3) == 0x11 && payload.at(4) == 0xDD){ + } else if(payload.at(3) == 0x12 && payload.at(4) == 0xDD){ + // UP Hold -> Up + // F10_LOG(info)<<"Idrive button UP Hold"; this->lastKey = aasdk::proto::enums::ButtonCode::UP; this->debug->lastKey->setText(QString("Up")); - } else if(payload.at(3) == 0x12 && payload.at(4) == 0xDD){ - // UP hold - this->lastKey = aasdk::proto::enums::ButtonCode::BACK; - this->debug->lastKey->setText(QString("Up Hold >> Back")); + // } else if(payload.at(3) == 0x12 && payload.at(4) == 0xDD){ + // // UP hold + // this->lastKey = aasdk::proto::enums::ButtonCode::BACK; + // this->debug->lastKey->setText(QString("Up Hold >> Back")); } else if(payload.at(3) == 0x41 && payload.at(4) == 0xDD){ // DOWN - F10_LOG(info)<<"Idrive button Down"; + // F10_LOG(info)<<"Idrive button Down"; + if (this->lastKey == aasdk::proto::enums::ButtonCode::DOWN) { + this->lastKey = aasdk::proto::enums::ButtonCode::UP; + this->debug->lastKey->setText(QString("Up")); + } this->lastKey = aasdk::proto::enums::ButtonCode::DOWN; this->debug->lastKey->setText(QString("Down")); } else if(payload.at(3) == 0x42 && payload.at(4) == 0xDD){ @@ -112,22 +112,25 @@ void BmwF10::monitorIdriveButtonStatus(QByteArray payload){ this->lastKey = aasdk::proto::enums::ButtonCode::HOME; this->debug->lastKey->setText(QString("Down Hold >> HOME")); } + } + if(payload.at(0) == 0xE1 && payload.at(1) == 0xFD && payload.at(4) == 0xDD && + (payload.at(3) == 0x41 || payload.at(3) == 0x11 || payload.at(3) == 0x12 )) { payload[3] = (uint) 0xFF; - payload[4] = (uint) 0xDD; this->canbus->writeFrame(QCanBusFrame(0x267, payload)); } + this->msgCounter = payload.at(2); } void BmwF10::monitorGearStatus(QByteArray payload){ if(payload.at(1)%2 == 1 && !this->inReverse){ - F10_LOG(info)<<"Reverse Gear"; + // F10_LOG(info)<<"Reverse Gear"; this->switchTVInput(); this->debug->inReverse->setText(QString("Yes")); this->inReverse = true; this->arbiter->set_curr_page(3); } else if(payload.at(1)%2 == 0 && this->inReverse){ - F10_LOG(info)<<"Not reverse"; + // F10_LOG(info)<<"Not reverse"; this->debug->inReverse->setText(QString("No")); this->inReverse = false; this->arbiter->set_curr_page(0); @@ -136,25 +139,25 @@ void BmwF10::monitorGearStatus(QByteArray payload){ void BmwF10::monitorEngineRPM(QByteArray payload){ int rpm = ((256.0 * (int)payload.at(6)) + (int)payload.at(5)) / 4.0; - F10_LOG(info)<<"RPM: "<debug->rpm->setText(QString::number(rpm)); // this->arbiter->vehicle_update_data("rpm", rpm); } void BmwF10::monitorVehicleSpeed(QByteArray payload){ int speed = ((256.0 * (int)payload.at(3)) + (int)payload.at(2)) * 1.609344 / 100.0; - F10_LOG(info)<<"Speed: "<arbiter->vehicle_update_data("speed", speed); } void BmwF10::monitorCicStatus(QByteArray payload){ this->cic_fullscreen = payload.at(0) == 0x5D; - F10_LOG(info)<<"CIC fullscreen: "<cic_fullscreen; + // F10_LOG(info)<<"CIC fullscreen: "<cic_fullscreen; } void BmwF10::switchTVInput(){ if (!this->cic_fullscreen) { - F10_LOG(info)<<"Switch to TV source"; + // F10_LOG(info)<<"Switch to TV source"; this->canbus->writeFrame(QCanBusFrame(0x0A2, QByteArray::fromHex("0080"))); this->canbus->writeFrame(QCanBusFrame(0x0A2, QByteArray::fromHex("0000"))); } diff --git a/bmw_f10_idrive.hpp b/bmw_f10_idrive.hpp index 76229be..501e62c 100644 --- a/bmw_f10_idrive.hpp +++ b/bmw_f10_idrive.hpp @@ -30,6 +30,8 @@ class BmwF10 : public QObject, VehiclePlugin Q_INTERFACES(VehiclePlugin) public: + BmwF10() {}; + ~BmwF10(); bool init(ICANBus* canbus) override; private: diff --git a/bmw_f10_idrive.json b/bmw_f10_idrive.json new file mode 100644 index 0000000..edcf21e --- /dev/null +++ b/bmw_f10_idrive.json @@ -0,0 +1,4 @@ +{ + "name" : "BMW F10 idrive integration", + "version" : "1.0" +} \ No newline at end of file diff --git a/setup_can.sh b/setup_can.sh new file mode 100755 index 0000000..ebf9ff8 --- /dev/null +++ b/setup_can.sh @@ -0,0 +1,88 @@ +#!/bin/bash -e + +CAN_INTERFACE=can0 +CAN_BITRATE=100k +CAN_OSCILATOR=8000000 +CAN_INTERRUPT=12 + +# install required packages: +sudo apt-get install can-utils + +echo "Setup can interface to bring up automatically on reboot..." + +# setup can interface to bring up automatically on reboot. +FILE_CAN_INTERFACE=/etc/network/interfaces.d/$CAN_INTERFACE +if [ -f "$FILE_CAN_INTERFACE" ]; then + echo "can0 network interface found, skipping..." +else + echo "Setting up can0 interface" + cat > $FILE_CAN_INTERFACE < $FILE_CAN_INTERFACE <> $FILE_BOOT_CFG <