# HG changeset patch # User sl # Date 1400531618 -7200 # Node ID 2dbfd75c2bbee7943289a5fc9b776d447ac82e53 # Parent 5c2c48109457635e2405f5f4a273171ec9412bcb Adding buttons to test basic functionality of Futaba VFD GP1212A01A. diff -r 5c2c48109457 -r 2dbfd75c2bbe test.cpp --- a/test.cpp Mon May 19 21:11:52 2014 +0200 +++ b/test.cpp Mon May 19 22:33:38 2014 +0200 @@ -23,6 +23,8 @@ #include #include +const int KFutabaOutputReportLength = 65; + #ifdef _WIN32 // Thanks Microsoft, but I know how to use strncpy(). #pragma warning(disable:4996) @@ -43,6 +45,12 @@ ID_CLEAR, ID_TIMER, ID_MAC_TIMER, + ID_FUTABA_CLEAR_DISPLAY, + ID_FUTABA_DIMMING, + ID_FUTABA_DISPLAY_DATA_INPUT, + ID_FUTABA_READ_ID, + ID_FUTABA_READ_FIRMWARE_REVISION, + ID_FUTABA_POWER_SUPPLY_MONITOR, ID_LAST, }; @@ -62,6 +70,21 @@ FXTextField *get_feature_text; FXText *input_text; FXFont *title_font; + //Futaba VFD control + FXButton *iButtonClearDisplay; + FXButton *iButtonDimming; + FXButton *iButtonDisplayDataInput; + FXButton *iButtonReadId; + FXButton *iButtonReadFirmwareRevision; + FXButton *iButtonPowerSupplyMonitor; + + unsigned char* iOutputReportBuffer; + unsigned char iDimming; + + //FXTextField *iTextX; + //FXTextField *iTextY; + + struct hid_device_info *devices; hid_device *connected_device; @@ -83,6 +106,15 @@ long onSendFeatureReport(FXObject *sender, FXSelector sel, void *ptr); long onGetFeatureReport(FXObject *sender, FXSelector sel, void *ptr); long onClear(FXObject *sender, FXSelector sel, void *ptr); + // + long onFutabaClearDisplay(FXObject *sender, FXSelector sel, void *ptr); + long onFutabaDimming(FXObject *sender, FXSelector sel, void *ptr); + long onFutabaDisplayDataInput(FXObject *sender, FXSelector sel, void *ptr); + long onFutabaReadId(FXObject *sender, FXSelector sel, void *ptr); + long onFutabaReadFirmwareRevision(FXObject *sender, FXSelector sel, void *ptr); + long onFutabaPowerSupplyMonitor(FXObject *sender, FXSelector sel, void *ptr); + // + long onTimeout(FXObject *sender, FXSelector sel, void *ptr); long onMacTimeout(FXObject *sender, FXSelector sel, void *ptr); }; @@ -106,6 +138,12 @@ FXMAPFUNC(SEL_COMMAND, MainWindow::ID_SEND_FEATURE_REPORT, MainWindow::onSendFeatureReport ), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_GET_FEATURE_REPORT, MainWindow::onGetFeatureReport ), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_CLEAR, MainWindow::onClear ), + FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_CLEAR_DISPLAY, MainWindow::onFutabaClearDisplay ), + FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_DIMMING, MainWindow::onFutabaDimming ), + FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_DISPLAY_DATA_INPUT, MainWindow::onFutabaDisplayDataInput ), + FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_READ_ID, MainWindow::onFutabaReadId ), + FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_READ_FIRMWARE_REVISION, MainWindow::onFutabaReadFirmwareRevision ), + FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_POWER_SUPPLY_MONITOR, MainWindow::onFutabaPowerSupplyMonitor ), FXMAPFUNC(SEL_TIMEOUT, MainWindow::ID_TIMER, MainWindow::onTimeout ), FXMAPFUNC(SEL_TIMEOUT, MainWindow::ID_MAC_TIMER, MainWindow::onMacTimeout ), }; @@ -115,6 +153,7 @@ MainWindow::MainWindow(FXApp *app) : FXMainWindow(app, "HIDAPI Test Application", NULL, NULL, DECOR_ALL, 200,100, 425,700) { + iDimming=0x35; devices = NULL; connected_device = NULL; @@ -154,11 +193,29 @@ connected_label = new FXLabel(vf, "Disconnected"); + //Futaba VFD commands new FXHorizontalFrame(vf); - + FXGroupBox *gb = new FXGroupBox(vf, "Futaba GP1212A01A", FRAME_GROOVE|LAYOUT_FILL_X); + FXMatrix *matrix = new FXMatrix(gb, 3, MATRIX_BY_COLUMNS|LAYOUT_FILL_X); + iButtonClearDisplay = new FXButton(matrix, "Clear Display", NULL, this, ID_FUTABA_CLEAR_DISPLAY, BUTTON_NORMAL|LAYOUT_FILL_X); + iButtonDimming = new FXButton(matrix, "Dimming", NULL, this, ID_FUTABA_DIMMING, BUTTON_NORMAL|LAYOUT_FILL_X); + iButtonDisplayDataInput = new FXButton(matrix, "Display Data Input", NULL, this, ID_FUTABA_DISPLAY_DATA_INPUT, BUTTON_NORMAL|LAYOUT_FILL_X); + iButtonReadId = new FXButton(matrix, "Read Id", NULL, this, ID_FUTABA_READ_ID, BUTTON_NORMAL|LAYOUT_FILL_X); + iButtonReadFirmwareRevision = new FXButton(matrix, "Read Firmware Revision", NULL, this, ID_FUTABA_READ_FIRMWARE_REVISION, BUTTON_NORMAL|LAYOUT_FILL_X); + iButtonPowerSupplyMonitor = new FXButton(matrix, "Power Supply Monitor", NULL, this, ID_FUTABA_POWER_SUPPLY_MONITOR, BUTTON_NORMAL|LAYOUT_FILL_X); + // + iButtonClearDisplay->disable(); + iButtonDimming->disable(); + iButtonDisplayDataInput->disable(); + iButtonReadId->disable(); + iButtonReadFirmwareRevision->disable(); + iButtonPowerSupplyMonitor->disable(); + // + // Output Group Box - FXGroupBox *gb = new FXGroupBox(vf, "Output", FRAME_GROOVE|LAYOUT_FILL_X); - FXMatrix *matrix = new FXMatrix(gb, 3, MATRIX_BY_COLUMNS|LAYOUT_FILL_X); + new FXHorizontalFrame(vf); + gb = new FXGroupBox(vf, "Output", FRAME_GROOVE|LAYOUT_FILL_X); + matrix = new FXMatrix(gb, 3, MATRIX_BY_COLUMNS|LAYOUT_FILL_X); new FXLabel(matrix, "Data"); new FXLabel(matrix, "Length"); new FXLabel(matrix, ""); @@ -257,7 +314,15 @@ connect_button->disable(); disconnect_button->enable(); input_text->setText(""); - + // + iButtonClearDisplay->enable(); + iButtonDimming->enable(); + iButtonDisplayDataInput->enable(); + iButtonReadId->enable(); + iButtonReadFirmwareRevision->enable(); + iButtonPowerSupplyMonitor->enable(); + // + iOutputReportBuffer=new unsigned char[KFutabaOutputReportLength]; //TODO: use connected_device->output_report_length return 1; } @@ -275,6 +340,19 @@ disconnect_button->disable(); getApp()->removeTimeout(this, ID_TIMER); + + // + iButtonClearDisplay->disable(); + iButtonDimming->disable(); + iButtonDisplayDataInput->disable(); + iButtonReadId->disable(); + iButtonReadFirmwareRevision->disable(); + iButtonPowerSupplyMonitor->disable(); + // + + + delete iOutputReportBuffer; + iOutputReportBuffer=NULL; return 1; } @@ -286,21 +364,27 @@ device_list->clearItems(); + //Define Futaba vendor ID to filter our list of device + const unsigned short KFutabaVendorId = 0x1008; + // List the Devices hid_free_enumeration(devices); devices = hid_enumerate(0x0, 0x0); cur_dev = devices; while (cur_dev) { - // Add it to the List Box. - FXString s; - FXString usage_str; - s.format("%04hx:%04hx -", cur_dev->vendor_id, cur_dev->product_id); - s += FXString(" ") + cur_dev->manufacturer_string; - s += FXString(" ") + cur_dev->product_string; - usage_str.format(" (usage: %04hx:%04hx) ", cur_dev->usage_page, cur_dev->usage); - s += usage_str; - FXListItem *li = new FXListItem(s, NULL, cur_dev); - device_list->appendItem(li); + // Add it to the List Box only if it is a Futaba device + if (cur_dev->vendor_id == KFutabaVendorId) + { + FXString s; + FXString usage_str; + s.format("%04hx:%04hx -", cur_dev->vendor_id, cur_dev->product_id); + s += FXString(" ") + cur_dev->manufacturer_string; + s += FXString(" ") + cur_dev->product_string; + usage_str.format(" (usage: %04hx:%04hx) ", cur_dev->usage_page, cur_dev->usage); + s += usage_str; + FXListItem *li = new FXListItem(s, NULL, cur_dev); + device_list->appendItem(li); + } cur_dev = cur_dev->next; } @@ -476,6 +560,116 @@ return 1; } + +long +MainWindow::onFutabaClearDisplay(FXObject *sender, FXSelector sel, void *ptr) +{ + memset(iOutputReportBuffer, 0x0, KFutabaOutputReportLength); + iOutputReportBuffer[0]=0x00; //Report ID + iOutputReportBuffer[1]=0x04; //Report length + iOutputReportBuffer[2]=0x1B; // + iOutputReportBuffer[3]=0x5B; // + iOutputReportBuffer[4]=0x32; // + iOutputReportBuffer[5]=0x4A; // + int res = hid_write(connected_device, iOutputReportBuffer, KFutabaOutputReportLength); + + return 1; +} + +long +MainWindow::onFutabaDimming(FXObject *sender, FXSelector sel, void *ptr) +{ + memset(iOutputReportBuffer, 0x0, KFutabaOutputReportLength); + iOutputReportBuffer[0]=0x00; //Report ID + iOutputReportBuffer[1]=0x06; //Report length + iOutputReportBuffer[2]=0x1B; // + iOutputReportBuffer[3]=0x5C; // + iOutputReportBuffer[4]=0x3F; // + iOutputReportBuffer[5]=0x4C; // + iOutputReportBuffer[6]=0x44; // + iDimming = (iDimming==0x35?0x30:++iDimming); + iOutputReportBuffer[7]=iDimming; + int res = hid_write(connected_device, iOutputReportBuffer, KFutabaOutputReportLength); + + return 1; +} + +long +MainWindow::onFutabaDisplayDataInput(FXObject *sender, FXSelector sel, void *ptr) +{ + //@1B 5B F0 00 00 07 00 01 FF + + memset(iOutputReportBuffer, 0x0, KFutabaOutputReportLength); + iOutputReportBuffer[0]=0x00; //Report ID + iOutputReportBuffer[1]=0x09; //Report length + iOutputReportBuffer[2]=0x1B; // + iOutputReportBuffer[3]=0x5B; // + iOutputReportBuffer[4]=0xF0; // + iOutputReportBuffer[5]=0x00; // + iOutputReportBuffer[6]=0x00; // + iOutputReportBuffer[7]=0x07; // + iOutputReportBuffer[8]=0x00; // + iOutputReportBuffer[9]=0x01; // + iOutputReportBuffer[10]=0xFF; // + int res = hid_write(connected_device, iOutputReportBuffer, KFutabaOutputReportLength); + + + return 1; +} + +long +MainWindow::onFutabaReadId(FXObject *sender, FXSelector sel, void *ptr) +{ + //1BH,5BH,63H,49H,44H + memset(iOutputReportBuffer, 0x0, KFutabaOutputReportLength); + iOutputReportBuffer[0]=0x00; //Report ID + iOutputReportBuffer[1]=0x05; //Report length + iOutputReportBuffer[2]=0x1B; // + iOutputReportBuffer[3]=0x5B; // + iOutputReportBuffer[4]=0x63; // + iOutputReportBuffer[5]=0x49; // + iOutputReportBuffer[6]=0x44; // + int res = hid_write(connected_device, iOutputReportBuffer, KFutabaOutputReportLength); + + return 1; +} + +long +MainWindow::onFutabaReadFirmwareRevision(FXObject *sender, FXSelector sel, void *ptr) +{ + //1BH,5BH,63H,46H,52H + memset(iOutputReportBuffer, 0x0, KFutabaOutputReportLength); + iOutputReportBuffer[0]=0x00; //Report ID + iOutputReportBuffer[1]=0x05; //Report length + iOutputReportBuffer[2]=0x1B; // + iOutputReportBuffer[3]=0x5B; // + iOutputReportBuffer[4]=0x63; // + iOutputReportBuffer[5]=0x46; // + iOutputReportBuffer[6]=0x52; // + int res = hid_write(connected_device, iOutputReportBuffer, KFutabaOutputReportLength); + + return 1; +} + +long +MainWindow::onFutabaPowerSupplyMonitor(FXObject *sender, FXSelector sel, void *ptr) +{ + //1BH,5BH,63H,50H,4DH + memset(iOutputReportBuffer, 0x0, KFutabaOutputReportLength); + iOutputReportBuffer[0]=0x00; //Report ID + iOutputReportBuffer[1]=0x05; //Report length + iOutputReportBuffer[2]=0x1B; // + iOutputReportBuffer[3]=0x5B; // + iOutputReportBuffer[4]=0x63; // + iOutputReportBuffer[5]=0x50; // + iOutputReportBuffer[6]=0x4D; // + int res = hid_write(connected_device, iOutputReportBuffer, KFutabaOutputReportLength); + + return 1; +} + + + long MainWindow::onTimeout(FXObject *sender, FXSelector sel, void *ptr) { @@ -523,7 +717,7 @@ int main(int argc, char **argv) { - FXApp app("HIDAPI Test Application", "Signal 11 Software"); + FXApp app("Futaba VFD", "Slions Software"); app.init(argc, argv); g_main_window = new MainWindow(&app); app.create();