# HG changeset patch # User sl # Date 1400739434 -7200 # Node ID e5b84f315be743add4f658cd3fbbb4b510002a2f # Parent 4a5538e0ccbfffda0cd2bc2fa1ff79606ffedc5a Sorting out connected state management with our new VFD object. diff -r 4a5538e0ccbf -r e5b84f315be7 inc/FutabaVfd.h --- a/inc/FutabaVfd.h Thu May 22 07:50:02 2014 +0200 +++ b/inc/FutabaVfd.h Thu May 22 08:17:14 2014 +0200 @@ -79,7 +79,6 @@ virtual int HeightInPixels()=0; virtual void SetPixel(int aX, int aY, bool aOn)=0; virtual void SetAllPixels(bool aOn)=0; - }; /** diff -r 4a5538e0ccbf -r e5b84f315be7 inc/HidDevice.h --- a/inc/HidDevice.h Thu May 22 07:50:02 2014 +0200 +++ b/inc/HidDevice.h Thu May 22 08:17:14 2014 +0200 @@ -15,6 +15,7 @@ class HidDevice { public: + HidDevice(); int Open(const char* aPath); int Open(unsigned short aVendorId, unsigned short aProductId, const wchar_t* aSerialNumber); void Close(); diff -r 4a5538e0ccbf -r e5b84f315be7 inc/MainWindow.h --- a/inc/MainWindow.h Thu May 22 07:50:02 2014 +0200 +++ b/inc/MainWindow.h Thu May 22 08:17:14 2014 +0200 @@ -56,7 +56,7 @@ long onConnect(FXObject *sender, FXSelector sel, void *ptr); long onDisconnect(FXObject *sender, FXSelector sel, void *ptr); - long onRescan(FXObject *sender, FXSelector sel, void *ptr); + long onScan(FXObject *sender, FXSelector sel, void *ptr); long onSendOutputReport(FXObject *sender, FXSelector sel, void *ptr); long onSendFeatureReport(FXObject *sender, FXSelector sel, void *ptr); long onGetFeatureReport(FXObject *sender, FXSelector sel, void *ptr); @@ -81,6 +81,10 @@ void SetPixelBlock(int aX, int aY, int aHeight, int aSize, unsigned char aValue); private: + void SetConnectedStates(); + bool IsConnected(); + +private: FXList *device_list; FXButton *connect_button; FXButton *disconnect_button; diff -r 4a5538e0ccbf -r e5b84f315be7 src/HidDevice.cpp --- a/src/HidDevice.cpp Thu May 22 07:50:02 2014 +0200 +++ b/src/HidDevice.cpp Thu May 22 08:17:14 2014 +0200 @@ -10,6 +10,11 @@ // class HidDevice // +HidDevice::HidDevice():iHidDevice(NULL) + { + + } + /** */ int HidDevice::Open(const char* aPath) diff -r 4a5538e0ccbf -r e5b84f315be7 src/test.cpp --- a/src/test.cpp Thu May 22 07:50:02 2014 +0200 +++ b/src/test.cpp Thu May 22 08:17:14 2014 +0200 @@ -29,7 +29,7 @@ FXDEFMAP(MainWindow) MainWindowMap [] = { FXMAPFUNC(SEL_COMMAND, MainWindow::ID_CONNECT, MainWindow::onConnect ), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_DISCONNECT, MainWindow::onDisconnect ), - FXMAPFUNC(SEL_COMMAND, MainWindow::ID_RESCAN, MainWindow::onRescan ), + FXMAPFUNC(SEL_COMMAND, MainWindow::ID_RESCAN, MainWindow::onScan ), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_SEND_OUTPUT_REPORT, MainWindow::onSendOutputReport ), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_SEND_FEATURE_REPORT, MainWindow::onSendFeatureReport ), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_GET_FEATURE_REPORT, MainWindow::onGetFeatureReport ), @@ -122,20 +122,6 @@ iButtonSetAllPixels = new FXButton(matrix, "Set All Pixels", NULL, this, ID_FUTABA_SET_ALL_PIXELS, BUTTON_NORMAL|LAYOUT_FILL_X); // - // - iButtonClearDisplay->disable(); - iButtonDimming->disable(); - iButtonDisplayDataInput->disable(); - iButtonReadId->disable(); - iButtonReadFirmwareRevision->disable(); - iButtonPowerSupplyMonitor->disable(); - iTextFieldX->disable(); - iTextFieldY->disable(); - iButtonSetPixel->disable(); - iButtonResetPixel->disable(); - iButtonSetAllPixels->disable(); - // - // Output Group Box new FXHorizontalFrame(vf); gb = new FXGroupBox(vf, "Output", FRAME_GROOVE|LAYOUT_FILL_X); @@ -171,6 +157,7 @@ input_text->setEditable(false); new FXButton(innerVF, "Clear", NULL, this, ID_CLEAR, BUTTON_NORMAL|LAYOUT_RIGHT); + SetConnectedStates(); } @@ -194,13 +181,14 @@ FXMainWindow::create(); show(); - onRescan(NULL, 0, NULL); + onScan(NULL, 0, NULL); - //Just testing our new VFD class + //Try to connect to our VFD from start-up if (iVfd01.Open()) { iVfd01.SetAllPixels(true); iVfd01.Close(); + SetConnectedStates(); } #ifdef __APPLE__ @@ -236,76 +224,110 @@ hid_set_nonblocking(connected_device, 1); - getApp()->addTimeout(this, ID_TIMER, - 5 * timeout_scalar /*5ms*/); - - FXString s; - s.format("Connected to: %04hx:%04hx -", device_info->vendor_id, device_info->product_id); - s += FXString(" ") + device_info->manufacturer_string; - s += FXString(" ") + device_info->product_string; - connected_label->setText(s); - output_button->enable(); - feature_button->enable(); - get_feature_button->enable(); - connect_button->disable(); - disconnect_button->enable(); - input_text->setText(""); // - iButtonClearDisplay->enable(); - iButtonDimming->enable(); - iButtonDisplayDataInput->enable(); - iButtonReadId->enable(); - iButtonReadFirmwareRevision->enable(); - iButtonPowerSupplyMonitor->enable(); - iTextFieldX->enable(); - iTextFieldY->enable(); - iButtonSetPixel->enable(); - iButtonResetPixel->enable(); - iButtonSetAllPixels->enable(); - - // - iOutputReportBuffer=new unsigned char[KFutabaMaxHidReportSize]; //TODO: use connected_device->output_report_length + iOutputReportBuffer=new unsigned char[KFutabaMaxHidReportSize]; return 1; } +/** +Tell whether or not we are currently connected to an HID device. +*/ +bool MainWindow::IsConnected() + { + return (connected_device||iVfd01.IsOpen()); + } + +/** +Update our UI states depending on whether or not we are connected to a device +*/ +void MainWindow::SetConnectedStates() + { + if (IsConnected()) + { + //Start pulling for input report + getApp()->addTimeout(this, ID_TIMER, 5 * timeout_scalar /*5ms*/); + + FXString s; + //s.format("Connected to: %04hx:%04hx -", device_info->vendor_id, device_info->product_id); + s.format("Connected to: "); + if (connected_device) + { + wchar_t string[256]; + hid_get_manufacturer_string(connected_device,string,sizeof(string)); + s += FXString(" ") + string; + hid_get_product_string(connected_device,string,sizeof(string)); + s += FXString(" ") + string; + } + else + { + //TODO: Missing function on our HidDevice class + } + connected_label->setText(s); + output_button->enable(); + feature_button->enable(); + get_feature_button->enable(); + connect_button->disable(); + disconnect_button->enable(); + input_text->setText(""); + // + iButtonClearDisplay->enable(); + iButtonDimming->enable(); + iButtonDisplayDataInput->enable(); + iButtonReadId->enable(); + iButtonReadFirmwareRevision->enable(); + iButtonPowerSupplyMonitor->enable(); + iTextFieldX->enable(); + iTextFieldY->enable(); + iButtonSetPixel->enable(); + iButtonResetPixel->enable(); + iButtonSetAllPixels->enable(); + } + else + { + //Stop pulling for input report + getApp()->removeTimeout(this, ID_TIMER); + // + connected_label->setText("Disconnected"); + output_button->disable(); + feature_button->disable(); + get_feature_button->disable(); + connect_button->enable(); + disconnect_button->disable(); + // + iButtonClearDisplay->disable(); + iButtonDimming->disable(); + iButtonDisplayDataInput->disable(); + iButtonReadId->disable(); + iButtonReadFirmwareRevision->disable(); + iButtonPowerSupplyMonitor->disable(); + iTextFieldX->disable(); + iTextFieldY->disable(); + iButtonSetPixel->disable(); + iButtonResetPixel->disable(); + iButtonSetAllPixels->disable(); + // + } + + } + long MainWindow::onDisconnect(FXObject *sender, FXSelector sel, void *ptr) { hid_close(connected_device); connected_device = NULL; - connected_label->setText("Disconnected"); - output_button->disable(); - feature_button->disable(); - get_feature_button->disable(); - connect_button->enable(); - disconnect_button->disable(); - - getApp()->removeTimeout(this, ID_TIMER); - - // - iButtonClearDisplay->disable(); - iButtonDimming->disable(); - iButtonDisplayDataInput->disable(); - iButtonReadId->disable(); - iButtonReadFirmwareRevision->disable(); - iButtonPowerSupplyMonitor->disable(); - iTextFieldX->disable(); - iTextFieldY->disable(); - iButtonSetPixel->disable(); - iButtonResetPixel->disable(); - iButtonSetAllPixels->disable(); - // - + iVfd01.Close(); delete iOutputReportBuffer; iOutputReportBuffer=NULL; + SetConnectedStates(); + return 1; } long -MainWindow::onRescan(FXObject *sender, FXSelector sel, void *ptr) +MainWindow::onScan(FXObject *sender, FXSelector sel, void *ptr) { struct hid_device_info *cur_dev;