# HG changeset patch # User sl # Date 1401283421 -7200 # Node ID 52372bbbc0f8ad8637f2a81724bb573d8a266d26 # Parent 9543e1703afbf9ae1798a088a530759887333bcd Now supporting read request for device ID, firmware version and power status. diff -r 9543e1703afb -r 52372bbbc0f8 DisplayStatusBar.qml --- a/DisplayStatusBar.qml Wed May 28 11:42:49 2014 +0200 +++ b/DisplayStatusBar.qml Wed May 28 15:23:41 2014 +0200 @@ -7,11 +7,54 @@ StatusBar { Component.onCompleted: { - display.closed.connect(updateDisplayStatus); - display.opened.connect(updateDisplayStatus); + display.closed.connect(onDisplayClosed); + display.opened.connect(onDisplayOpened); display.openError.connect(updateDisplayStatusError); + display.powerStatus.connect(updatePowerStatus); + display.deviceId.connect(updateDeviceId); + display.firmwareVersion.connect(updateFirmwareVersion); } + function updatePowerStatus(powerOn) + { + if (powerOn) + { + labelDisplayPowerStatus.text=qsTr("Power: ON"); + } + else + { + labelDisplayPowerStatus.text=qsTr("Power: OFF"); + } + } + + function updateDeviceId(deviceId) + { + labelDisplayDeviceId.text = deviceId; + display.requestFirmwareVersion(); + } + + function updateFirmwareVersion(version) + { + labelDisplayFirmwareVersion.text = "Firmware v" + version; + display.requestPowerStatus(); + } + + function onDisplayOpened() + { + updateDisplayStatus(); + // + display.requestDeviceId(); + } + + function onDisplayClosed() + { + updateDisplayStatus(); + labelDisplayDeviceId.text=""; + labelDisplayFirmwareVersion.text=""; + labelDisplayPowerStatus.text=""; + } + + function updateDisplayStatusError() { updateDisplayStatus(); @@ -56,5 +99,21 @@ visible: false //We don't want to display that. GP1212A01A does not even provide a proper string. text: qsTr("") } + + Label { + id: labelDisplayDeviceId + text: qsTr("") + } + + Label { + id: labelDisplayFirmwareVersion + text: qsTr("") + } + + Label { + id: labelDisplayPowerStatus + text: qsTr("") + } + } } diff -r 9543e1703afb -r 52372bbbc0f8 MiniDisplay/FutabaVfd.cpp --- a/MiniDisplay/FutabaVfd.cpp Wed May 28 11:42:49 2014 +0200 +++ b/MiniDisplay/FutabaVfd.cpp Wed May 28 15:23:41 2014 +0200 @@ -73,7 +73,7 @@ GP1212A01A::GP1212A01A(): iDisplayPositionX(0),iDisplayPositionY(0), - iOffScreenMode(true),iFrameBuffer(NULL) + iOffScreenMode(true),iFrameBuffer(NULL),iRequest(ERequestNone),iPowerOn(false) { //ResetBuffers(); } @@ -381,8 +381,14 @@ /** */ -void GP1212A01A::RequestId() +void GP1212A01A::RequestDeviceId() { + if (RequestPending()) + { + //Abort silently for now + return; + } + //1BH,5BH,63H,49H,44H //Send Read ID command FutabaVfdReport report; @@ -393,13 +399,22 @@ report[4]=0x63; //Command ID report[5]=0x49; //Command ID report[6]=0x44; //Command ID - Write(report); + if (Write(report)==report.Size()) + { + iRequest=ERequestDeviceId; + } } /** */ void GP1212A01A::RequestFirmwareRevision() { + if (RequestPending()) + { + //Abort silently for now + return; + } + //1BH,5BH,63H,46H,52H //Send Software Revision Read Command FutabaVfdReport report; @@ -410,13 +425,21 @@ report[4]=0x63; //Command ID report[5]=0x46; //Command ID report[6]=0x52; //Command ID - Write(report); + if (Write(report)==report.Size()) + { + iRequest=ERequestFirmwareRevision; + } } /** */ void GP1212A01A::RequestPowerSupplyStatus() { + if (RequestPending()) + { + //Abort silently for now + return; + } //1BH,5BH,63H,50H,4DH //Send Power Suppply Monitor Command FutabaVfdReport report; @@ -427,7 +450,10 @@ report[4]=0x63; //Command ID report[5]=0x50; //Command ID report[6]=0x4D; //Command ID - Write(report); + if (Write(report)==report.Size()) + { + iRequest=ERequestPowerSupplyStatus; + } } @@ -444,3 +470,39 @@ SwapBuffers(); Clear(); } + +/** + */ +GP1212A01A::Request GP1212A01A::AttemptRequestCompletion() + { + if (!RequestPending()) + { + return ERequestNone; + } + + int res=Read(iInputReport); + + if (!res) + { + return ERequestNone; + } + + //Process our request + if (CurrentRequest()==GP1212A01A::ERequestPowerSupplyStatus) + { + if (iInputReport[1]==0x4F && iInputReport[2]==0x4E) + { + iPowerOn = true; + } + else if (iInputReport[1]==0x4F && iInputReport[2]==0x46 && iInputReport[3]==0x46) + { + iPowerOn = false; + } + } + + Request completed=iRequest; + //Our request was completed + iRequest=ERequestNone; + + return completed; + } diff -r 9543e1703afb -r 52372bbbc0f8 MiniDisplay/FutabaVfd.h --- a/MiniDisplay/FutabaVfd.h Wed May 28 11:42:49 2014 +0200 +++ b/MiniDisplay/FutabaVfd.h Wed May 28 15:23:41 2014 +0200 @@ -117,8 +117,18 @@ class GP1212A01A : public GP1212XXXX { public: - GP1212A01A(); - ~GP1212A01A(); + enum Request + { + ERequestNone, + ERequestDeviceId, + ERequestFirmwareRevision, + ERequestPowerSupplyStatus + }; + +public: + GP1212A01A(); + ~GP1212A01A(); + // int Open(); //From FutabaGraphicVfd @@ -139,14 +149,19 @@ void SetDisplayPosition(unsigned char aX, unsigned char aY); void SwapBuffers(); // - void RequestId(); + void RequestDeviceId(); void RequestFirmwareRevision(); void RequestPowerSupplyStatus(); // void ToggleOffScreenMode(); bool OffScreenMode() const {return iOffScreenMode;} // - + bool RequestPending(){return iRequest!=ERequestNone;} + Request CurrentRequest(){return iRequest;} + void CancelRequest(){iRequest=ERequestNone;} + Request AttemptRequestCompletion(); + FutabaVfdReport& InputReport() {return iInputReport;} + bool PowerOn(){return iPowerOn;} private: enum DW @@ -175,6 +190,9 @@ //unsigned char iFrameBeta[256*64]; //unsigned char *iFrontBuffer; //unsigned char *iBackBuffer; + Request iRequest; + FutabaVfdReport iInputReport; + bool iPowerOn; }; diff -r 9543e1703afb -r 52372bbbc0f8 MiniDisplay/minidisplay.cpp --- a/MiniDisplay/minidisplay.cpp Wed May 28 11:42:49 2014 +0200 +++ b/MiniDisplay/minidisplay.cpp Wed May 28 15:23:41 2014 +0200 @@ -1,8 +1,11 @@ #include "minidisplay.h" #include +#include + +const int KMaxReadAttempt=100; MiniDisplay::MiniDisplay(QQuickItem *parent): - QQuickItem(parent) + QQuickItem(parent),iReadAttempt(0) { // By default, QQuickItem does not draw anything. If you subclass // QQuickItem to create a visual item, you will need to uncomment the @@ -66,6 +69,35 @@ iDisplay.SwapBuffers(); } +void MiniDisplay::requestPowerStatus() +{ + if (!iDisplay.IsOpen()) return; + + iDisplay.RequestPowerSupplyStatus(); + QTimer::singleShot(4, this, SLOT(readTimer())); + iReadAttempt=0; +} + +void MiniDisplay::requestDeviceId() +{ + if (!iDisplay.IsOpen()) return; + + iDisplay.RequestDeviceId(); + QTimer::singleShot(4, this, SLOT(readTimer())); + iReadAttempt=0; +} + +void MiniDisplay::requestFirmwareVersion() +{ + if (!iDisplay.IsOpen()) return; + + iDisplay.RequestFirmwareRevision(); + QTimer::singleShot(4, this, SLOT(readTimer())); + iReadAttempt=0; +} + + + /** * @brief setFont * @param aFont @@ -133,4 +165,42 @@ return QString::fromWCharArray(iDisplay.SerialNumber()); } +/** + * @brief MiniDisplay::readTimer + */ +void MiniDisplay::readTimer() +{ + if (!iDisplay.IsOpen()) return; + if (!iDisplay.RequestPending()) return; + iReadAttempt++; + GP1212A01A::Request request = iDisplay.AttemptRequestCompletion(); + + if (!request) + { + if (iReadAttempt