//----------------------------------------------------------------------------- // Copyright 2007 Jonathan Westhues // // This file is part of LDmicro. // // LDmicro is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // LDmicro is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with LDmicro. If not, see . //------ // // A ladder logic compiler for 8 bit micros: user draws a ladder diagram, // with an appropriately constrained `schematic editor,' and then we can // simulated it under Windows or generate PIC/AVR code that performs the // requested operations. This files contains the program entry point, plus // most of the UI logic relating to the main window. // Jonathan Westhues, Oct 2004 //----------------------------------------------------------------------------- #include "linuxUI.h" #include #include #include "ldmicro.h" #include "freezeLD.h" #include "mcutable.h" #include #include #include // #include using namespace std; HINSTANCE Instance; QApplication* LDmicroApp; HWID MainWindow; QIcon* MWIcon; QMenuBar* MainMenu; QGroupBox* CursorObject; HWID DrawWindow; // parameters used to capture the mouse when implementing our totally non- // general splitter control //static HHOOK MouseHookHandle; static int MouseY; int CursorTimer; int SimulateTimer; // For the open/save dialog boxes #define LDMICRO_PATTERN "LDmicro Ladder Logic Programs (*.ld)\0*.ld\0" \ "All files\0*\0\0" char CurrentSaveFile[MAX_PATH]; static BOOL ProgramChangedNotSaved = FALSE; #define HEX_PATTERN "Intel Hex Files (*.hex)\0*.hex\0All files\0*\0\0" #define C_PATTERN "C Source Files (*.c)\0*.c\0All Files\0*\0\0" #define INTERPRETED_PATTERN \ "Interpretable Byte Code Files (*.int)\0*.int\0All Files\0*\0\0" char CurrentCompileFile[MAX_PATH]; #define TXT_PATTERN "Text Files (*.txt)\0*.txt\0All files\0*\0\0" // Everything relating to the PLC's program, I/O configuration, processor // choice, and so on--basically everything that would be saved in the // project file. PlcProgram Prog; /// Function to safely quit program gtk main loop gboolean LD_WM_Close_call(GtkWidget *widget, GdkEvent *event, gpointer user_data); //----------------------------------------------------------------------------- // Get a filename with a common dialog box and then save the program to that // file and then set our default filename to that. //----------------------------------------------------------------------------- /*static BOOL SaveAsDialog(void) { OPENFILENAME ofn; memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.parentWindow = MainWindow; ofn.lpstrFilter = LDMICRO_PATTERN; ofn.lpstrDefExt = "ld"; ofn.lpstrFile = CurrentSaveFile; ofn.nMaxFile = sizeof(CurrentSaveFile); ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; if(!GetSaveFileName(&ofn)) return FALSE; if(!SaveProjectToFile(CurrentSaveFile)) { Error(_("Couldn't write to '%s'."), CurrentSaveFile); return FALSE; } else { ProgramChangedNotSaved = FALSE; return TRUE; } } //----------------------------------------------------------------------------- // Get a filename with a common dialog box and then export the program as // an ASCII art drawing. //----------------------------------------------------------------------------- static void ExportDialog(void) { char exportFile[MAX_PATH]; OPENFILENAME ofn; exportFile[0] = '\0'; memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.parentWindow = MainWindow; ofn.lpstrFilter = TXT_PATTERN; ofn.lpstrFile = exportFile; ofn.lpstrDefExt = "txt"; ofn.lpstrTitle = _("Export As Text"); ofn.nMaxFile = sizeof(exportFile); ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; if(!GetSaveFileName(&ofn)) return; ExportDrawingAsText(exportFile); } //----------------------------------------------------------------------------- // If we already have a filename, save the program to that. Otherwise same // as Save As. Returns TRUE if it worked, else returns FALSE. //----------------------------------------------------------------------------- static BOOL SaveProgram(void) { if(strlen(CurrentSaveFile)) { if(!SaveProjectToFile(CurrentSaveFile)) { Error(_("Couldn't write to '%s'."), CurrentSaveFile); return FALSE; } else { ProgramChangedNotSaved = FALSE; return TRUE; } } else { return SaveAsDialog(); } }*/ //----------------------------------------------------------------------------- // Compile the program to a hex file for the target micro. Get the output // file name if necessary, then call the micro-specific compile routines. //----------------------------------------------------------------------------- static void CompileProgram(BOOL compileAs) { if(compileAs || strlen(CurrentCompileFile)==0) { OPENFILENAME ofn; memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.parentWindow = &MainWindow; ofn.lpstrTitle = _("Compile To"); if(Prog.mcu && Prog.mcu->whichIsa == ISA_ANSIC) { ofn.lpstrFilter = C_PATTERN; ofn.lpstrDefExt = "c"; } else if(Prog.mcu && Prog.mcu->whichIsa == ISA_INTERPRETED) { ofn.lpstrFilter = INTERPRETED_PATTERN; ofn.lpstrDefExt = "int"; } else { ofn.lpstrFilter = HEX_PATTERN; ofn.lpstrDefExt = "hex"; } ofn.lpstrFile = CurrentCompileFile; ofn.nMaxFile = sizeof(CurrentCompileFile); ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; if(!GetSaveFileName(&ofn)) return; // hex output filename is stored in the .ld file ProgramChangedNotSaved = TRUE; } if(!GenerateIntermediateCode()) return; if(Prog.mcu == NULL) { Error(_("Must choose a target microcontroller before compiling.")); return; } if(UartFunctionUsed() && Prog.mcu->uartNeeds.rxPin == 0) { Error(_("UART function used but not supported for this micro.")); return; } if(PwmFunctionUsed() && Prog.mcu->pwmNeedsPin == 0) { Error(_("PWM function used but not supported for this micro.")); return; } switch(Prog.mcu->whichIsa) { case ISA_AVR: CompileAvr(CurrentCompileFile); break; case ISA_PIC16: CompilePic16(CurrentCompileFile); break; case ISA_ANSIC: CompileAnsiC(CurrentCompileFile); break; case ISA_INTERPRETED: CompileInterpreted(CurrentCompileFile); break; case ISA_ARDUINO: CompileArduino(CurrentCompileFile); break; default: oops(); } IntDumpListing("t.pl"); } //----------------------------------------------------------------------------- // If the program has been modified then give the user the option to save it // or to cancel the operation they are performing. Return TRUE if they want // to cancel. //----------------------------------------------------------------------------- /*BOOL CheckSaveUserCancels(void) { if(!ProgramChangedNotSaved) { // no problem return FALSE; } int r = MessageBox(MainWindow, _("The program has changed since it was last saved.\r\n\r\n" "Do you want to save the changes?"), "LDmicro", MB_YESNOCANCEL | MB_ICONWARNING); switch(r) { case IDYES: if(SaveProgram()) return FALSE; else return TRUE; case IDNO: return FALSE; case IDCANCEL: return TRUE; default: return TRUE; oops(); } } //----------------------------------------------------------------------------- // Load a new program from a file. If it succeeds then set our default filename // to that, else we end up with an empty file then. //----------------------------------------------------------------------------- static void OpenDialog(void) { OPENFILENAME ofn; char tempSaveFile[MAX_PATH] = ""; memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.parentWindow = MainWindow; ofn.lpstrFilter = LDMICRO_PATTERN; ofn.lpstrDefExt = "ld"; ofn.lpstrFile = tempSaveFile; ofn.nMaxFile = sizeof(tempSaveFile); ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; if(!GetOpenFileName(&ofn)) return; if(!LoadProjectFromFile(tempSaveFile)) { Error(_("Couldn't open '%s'."), tempSaveFile); CurrentSaveFile[0] = '\0'; } else { ProgramChangedNotSaved = FALSE; strcpy(CurrentSaveFile, tempSaveFile); UndoFlush(); } GenerateIoListDontLoseSelection(); RefreshScrollbars(); UpdateMainWindowTitleBar(); } */ //----------------------------------------------------------------------------- // Housekeeping required when the program changes: mark the program as // changed so that we ask if user wants to save before exiting, and update // the I/O list. //----------------------------------------------------------------------------- void ProgramChanged(void) { ProgramChangedNotSaved = TRUE; GenerateIoListDontLoseSelection(); RefreshScrollbars(); } #define CHANGING_PROGRAM(x) { \ UndoRemember(); \ x; \ ProgramChanged();\ } //----------------------------------------------------------------------------- // Hook that we install when the user starts dragging the `splitter,' in case // they drag it out of the narrow area of the drawn splitter bar. Resize // the listview in response to mouse move, and unhook ourselves when they // release the mouse button. //----------------------------------------------------------------------------- // static LRESULT CALLBACK MouseHook(int code, WPARAM wParam, LPARAM lParam) // { // switch(code) { // case HC_ACTION: { // MSLLHOOKSTRUCT *mhs = (MSLLHOOKSTRUCT *)lParam; // switch(wParam) { // case WM_MOUSEMOVE: { // int dy = MouseY - mhs->pt.y; // IoListHeight += dy; // if(IoListHeight < 50) IoListHeight = 50; // MouseY = mhs->pt.y; // MainWindowResized(); // break; // } // case WM_LBUTTONUP: // UnhookWindowsHookEx(MouseHookHandle); // break; // } // break; // } // } // return CallNextHookEx(MouseHookHandle, code, wParam, lParam); // } //----------------------------------------------------------------------------- // Handle a selection from the menu bar of the main window. //----------------------------------------------------------------------------- // static void ProcessMenu(int code) // { // if(code >= MNU_PROCESSOR_0 && code < MNU_PROCESSOR_0+NUM_SUPPORTED_MCUS) { // strcpy(CurrentCompileFile, ""); // Prog.mcu = &SupportedMcus[code - MNU_PROCESSOR_0]; // RefreshControlsToSettings(); // return; // } // if(code == MNU_PROCESSOR_0+NUM_SUPPORTED_MCUS) { // Prog.mcu = NULL; // strcpy(CurrentCompileFile, ""); // RefreshControlsToSettings(); // return; // } // switch(code) { // case MNU_NEW: // if(CheckSaveUserCancels()) break; // NewProgram(); // strcpy(CurrentSaveFile, ""); // strcpy(CurrentCompileFile, ""); // GenerateIoListDontLoseSelection(); // RefreshScrollbars(); // UpdateMainWindowTitleBar(); // break; // case MNU_OPEN: // if(CheckSaveUserCancels()) break; // OpenDialog(); // break; // case MNU_SAVE: // SaveProgram(); // UpdateMainWindowTitleBar(); // break; // case MNU_SAVE_AS: // SaveAsDialog(); // UpdateMainWindowTitleBar(); // break; // case MNU_EXPORT: // ExportDialog(); // break; // case MNU_EXIT: // if(CheckSaveUserCancels()) break; // LD_WM_Close_call(NULL, NULL, NULL); // // PostQuitMessage(0); // break; // case MNU_INSERT_COMMENT: // CHANGING_PROGRAM(AddComment(_("--add comment here--"))); // break; // case MNU_INSERT_CONTACTS: // CHANGING_PROGRAM(AddContact()); // break; // case MNU_INSERT_COIL: // CHANGING_PROGRAM(AddCoil()); // break; // case MNU_INSERT_TON: // CHANGING_PROGRAM(AddTimer(ELEM_TON)); // break; // case MNU_INSERT_TOF: // CHANGING_PROGRAM(AddTimer(ELEM_TOF)); // break; // case MNU_INSERT_RTO: // CHANGING_PROGRAM(AddTimer(ELEM_RTO)); // break; // case MNU_INSERT_CTU: // CHANGING_PROGRAM(AddCounter(ELEM_CTU)); // break; // case MNU_INSERT_CTD: // CHANGING_PROGRAM(AddCounter(ELEM_CTD)); // break; // case MNU_INSERT_CTC: // CHANGING_PROGRAM(AddCounter(ELEM_CTC)); // break; // case MNU_INSERT_RES: // CHANGING_PROGRAM(AddReset()); // break; // case MNU_INSERT_OPEN: // CHANGING_PROGRAM(AddEmpty(ELEM_OPEN)); // break; // case MNU_INSERT_SHORT: // CHANGING_PROGRAM(AddEmpty(ELEM_SHORT)); // break; // case MNU_INSERT_MASTER_RLY: // CHANGING_PROGRAM(AddMasterRelay()); // break; // case MNU_INSERT_SHIFT_REG: // CHANGING_PROGRAM(AddShiftRegister()); // break; // case MNU_INSERT_LUT: // CHANGING_PROGRAM(AddLookUpTable()); // break; // case MNU_INSERT_PWL: // CHANGING_PROGRAM(AddPiecewiseLinear()); // break; // case MNU_INSERT_FMTD_STR: // CHANGING_PROGRAM(AddFormattedString()); // break; // case MNU_INSERT_OSR: // CHANGING_PROGRAM(AddEmpty(ELEM_ONE_SHOT_RISING)); // break; // case MNU_INSERT_OSF: // CHANGING_PROGRAM(AddEmpty(ELEM_ONE_SHOT_FALLING)); // break; // case MNU_INSERT_MOV: // CHANGING_PROGRAM(AddMove()); // break; // case MNU_INSERT_SET_PWM: // CHANGING_PROGRAM(AddSetPwm()); // break; // case MNU_INSERT_READ_ADC: // CHANGING_PROGRAM(AddReadAdc()); // break; // case MNU_INSERT_UART_SEND: // CHANGING_PROGRAM(AddUart(ELEM_UART_SEND)); // break; // case MNU_INSERT_UART_RECV: // CHANGING_PROGRAM(AddUart(ELEM_UART_RECV)); // break; // case MNU_INSERT_PERSIST: // CHANGING_PROGRAM(AddPersist()); // break; // { // int elem; // case MNU_INSERT_ADD: elem = ELEM_ADD; goto math; // case MNU_INSERT_SUB: elem = ELEM_SUB; goto math; // case MNU_INSERT_MUL: elem = ELEM_MUL; goto math; // case MNU_INSERT_DIV: elem = ELEM_DIV; goto math; // math: // CHANGING_PROGRAM(AddMath(elem)); // break; // } // { // int elem; // case MNU_INSERT_EQU: elem = ELEM_EQU; goto cmp; // case MNU_INSERT_NEQ: elem = ELEM_NEQ; goto cmp; // case MNU_INSERT_GRT: elem = ELEM_GRT; goto cmp; // case MNU_INSERT_GEQ: elem = ELEM_GEQ; goto cmp; // case MNU_INSERT_LES: elem = ELEM_LES; goto cmp; // case MNU_INSERT_LEQ: elem = ELEM_LEQ; goto cmp; // cmp: // CHANGING_PROGRAM(AddCmp(elem)); // break; // } // case MNU_MAKE_NORMAL: // CHANGING_PROGRAM(MakeNormalSelected()); // break; // case MNU_NEGATE: // CHANGING_PROGRAM(NegateSelected()); // break; // case MNU_MAKE_SET_ONLY: // CHANGING_PROGRAM(MakeSetOnlySelected()); // break; // case MNU_MAKE_RESET_ONLY: // CHANGING_PROGRAM(MakeResetOnlySelected()); // break; // case MNU_UNDO: // UndoUndo(); // break; // case MNU_REDO: // UndoRedo(); // break; // case MNU_INSERT_RUNG_BEFORE: // CHANGING_PROGRAM(InsertRung(FALSE)); // break; // case MNU_INSERT_RUNG_AFTER: // CHANGING_PROGRAM(InsertRung(TRUE)); // break; // case MNU_DELETE_RUNG: // CHANGING_PROGRAM(DeleteSelectedRung()); // break; // case MNU_PUSH_RUNG_UP: // CHANGING_PROGRAM(PushRungUp()); // break; // case MNU_PUSH_RUNG_DOWN: // CHANGING_PROGRAM(PushRungDown()); // break; // case MNU_DELETE_ELEMENT: // CHANGING_PROGRAM(DeleteSelectedFromProgram()); // break; // case MNU_MCU_SETTINGS: // CHANGING_PROGRAM(ShowConfDialog()); // break; // case MNU_SIMULATION_MODE: // ToggleSimulationMode(); // break; // case MNU_START_SIMULATION: // StartSimulation(); // break; // case MNU_STOP_SIMULATION: // StopSimulation(); // break; // case MNU_SINGLE_CYCLE: // SimulateOneCycle(TRUE); // break; // case MNU_COMPILE: // CompileProgram(FALSE); // break; // case MNU_COMPILE_AS: // CompileProgram(TRUE); // break; // case MNU_MANUAL: // ShowHelpDialog(FALSE); // break; // case MNU_ABOUT: // ShowHelpDialog(TRUE); // break; // } // gtk_widget_queue_draw(DrawWindow); // } // //----------------------------------------------------------------------------- // // WndProc functions for MainWindow. // //----------------------------------------------------------------------------- // gboolean LD_WM_KeyDown_call(GtkWidget *widget, GdkEventKey *event, gpointer user_data) // { // /* Handles: // * WM_KEYDOWN // */ // UINT wParam = event->keyval; // if(wParam == VK_TAB) { // // SetFocus(IoList); // gtk_window_set_focus (GTK_WINDOW(MainWindow), view); // // BlinkCursor(0, 0, 0, 0); // } // if(InSimulationMode) // { // switch(wParam) // { // case VK_DOWN: // if(ScrollYOffset < ScrollYOffsetMax) // ScrollYOffset++; // RefreshScrollbars(); // gtk_widget_queue_draw(DrawWindow); // break; // case VK_UP: // if(ScrollYOffset > 0) // ScrollYOffset--; // RefreshScrollbars(); // gtk_widget_queue_draw(DrawWindow); // break; // case VK_LEFT: // ScrollXOffset -= FONT_WIDTH; // if(ScrollXOffset < 0) // ScrollXOffset = 0; // RefreshScrollbars(); // gtk_widget_queue_draw(DrawWindow); // break; // case VK_RIGHT: // ScrollXOffset += FONT_WIDTH; // if(ScrollXOffset >= ScrollXOffsetMax) // ScrollXOffset = ScrollXOffsetMax; // RefreshScrollbars(); // gtk_widget_queue_draw(DrawWindow); // break; // case VK_RETURN: // case VK_ESCAPE: // ToggleSimulationMode(); // break; // } // } // switch(wParam) // { // case VK_UP: // if(event->state & GDK_SHIFT_MASK) // { // CHANGING_PROGRAM(PushRungUp()); // } // else // { // MoveCursorKeyboard(wParam); // } // gtk_widget_queue_draw(DrawWindow); // break; // case VK_DOWN: // if(event->state & GDK_SHIFT_MASK) // { // CHANGING_PROGRAM(PushRungDown()); // } // else // { // MoveCursorKeyboard(wParam); // } // gtk_widget_queue_draw(DrawWindow); // break; // case VK_RIGHT: // case VK_LEFT: // MoveCursorKeyboard(wParam); // gtk_widget_queue_draw(DrawWindow); // break; // case VK_RETURN: // CHANGING_PROGRAM(EditSelectedElement()); // gtk_widget_queue_draw(DrawWindow); // break; // default: // break; // } // return FALSE; // } // gboolean LD_WM_Close_call(GtkWidget *widget, GdkEvent *event, gpointer user_data) // { // /* Handles: // * WM_CLOSE // */ // if(CheckSaveUserCancels()) // return TRUE; // GdkRectangle allocation; // gtk_widget_get_allocation(GTK_WIDGET(view), &allocation); // IoListHeight = allocation.height; // FreezeWindowPos(MainWindow); // FreezeDWORD(IoListHeight); // g_print("List Height close: %d\n",IoListHeight); // gtk_main_quit(); // gdk_threads_leave(); // } // gboolean LD_GTK_mouse_click_hook(GtkWidget *widget, GdkEvent *event, gpointer user_data) // { // /* Handles: // * WM_LBUTTONDBLCLK, WM_LBUTTONDOWN // */ // RECT Rect; // GetWindowRect(ScrollWindow, &Rect); // int wy; // gtk_window_get_position(GTK_WINDOW(MainWindow), NULL, &wy); // // g_print("net: %i\n", wy + 30 + Rect.bottom); // /// Identify if mouse is clicked outside drawing area // if (wy + 30 + Rect.bottom < event->button.y_root) // return FALSE; // GtkAdjustment *adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(ScrollWindow)); // switch(event->button.type) // { // case GDK_BUTTON_PRESS: // if (event->button.button == 1) /// left click // { // GLOBAL_mouse_last_clicked_x = event->button.x_root; // GLOBAL_mouse_last_clicked_y = event->button.y_root; // int x = event->button.x; // int y = event->button.y - 30 + gtk_adjustment_get_value(adjustment); // if(!InSimulationMode) MoveCursorMouseClick(x, y); // gtk_widget_queue_draw(DrawWindow); // } // break; // case GDK_2BUTTON_PRESS: // if (event->button.button == 1) /// left click // { // GLOBAL_mouse_last_clicked_x = event->button.x_root; // GLOBAL_mouse_last_clicked_y = event->button.y_root; // int x = event->button.x; // int y = event->button.y - 30 + gtk_adjustment_get_value(adjustment); // if(InSimulationMode) { // EditElementMouseDoubleclick(x, y); // } else { // CHANGING_PROGRAM(EditElementMouseDoubleclick(x, y)); // } // gtk_widget_queue_draw(DrawWindow); // } // break; // } // return FALSE; // } // gboolean LD_GTK_mouse_scroll_hook(GtkWidget *widget, GdkEvent *event, gpointer user_data) // { // /* Handles: // * WM_VSCROLL, WM_HSCROLL, WM_MOUSEWHEEL // */ // GtkAdjustment *adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(ScrollWindow)); // switch(event->scroll.direction) // { // case GDK_SCROLL_UP: // if (gtk_adjustment_get_value(adjustment) == gtk_adjustment_get_lower(adjustment)) // VscrollProc(SB_TOP); // else // VscrollProc(SB_LINEUP); // break; // case GDK_SCROLL_DOWN: // if (gtk_adjustment_get_value(adjustment) == gtk_adjustment_get_upper(adjustment) - gtk_widget_get_allocated_height (ScrollWindow)) // VscrollProc(SB_BOTTOM); // else // VscrollProc(SB_LINEDOWN); // break; // case GDK_SCROLL_LEFT: // HscrollProc(SB_LINEUP); // break; // case GDK_SCROLL_RIGHT: // HscrollProc(SB_LINEDOWN); // break; // case GDK_SCROLL_SMOOTH: // double d_x, d_y; // gdk_event_get_scroll_deltas (event, &d_x, &d_y); // if(d_y > 0) { // VscrollProc(SB_LINEUP); // } else { // VscrollProc(SB_LINEDOWN); // } // break; // } // gtk_widget_queue_draw(DrawWindow); // return FALSE; // } // gboolean LD_WM_MouseMove_call(GtkWidget *widget, GdkEvent *event, gpointer user_data) // { // /* Handles: // * WM_MOUSEMOVE // */ // // int x = LOWORD(lParam); // // int y = HIWORD(lParam); // // if((y > (IoListTop - 9)) && (y < (IoListTop + 3))) { // // SetCursor(LoadCursor(NULL, IDC_SIZENS)); // // } else { // // SetCursor(LoadCursor(NULL, IDC_ARROW)); // // } // // int dy = MouseY - mhs->pt.y; // // int dy = MouseY - mhs->pt.y; // // IoListHeight += dy; // // if(IoListHeight < 50) IoListHeight = 50; // // MouseY = mhs->pt.y; // // MainWindowResized(); // return FALSE; // } // gboolean LD_WM_Paint_call(HWID widget, HCRDC cr, gpointer data) // { // /* Handles: // * WM_PAINT // */ // static BOOL Paint_call_first = TRUE; // if (Paint_call_first) // { // gtk_widget_override_background_color(GTK_WIDGET(widget), // GTK_STATE_FLAG_NORMAL, (HBRUSH)GetStockObject(BLACK_BRUSH)); // gint width = gtk_widget_get_allocated_width (widget); // gint height = gtk_widget_get_allocated_height (widget); // gtk_widget_set_size_request(widget, width, height + 1); // gdk_cairo_set_source_rgba (cr, (HBRUSH)GetStockObject(BLACK_BRUSH)); // cairo_rectangle(cr, 0, 0, width, height); // cairo_stroke_preserve(cr); // cairo_fill (cr); // Paint_call_first = FALSE; // } // /// This draws the schematic. // MainWindowResized(); // PaintWindow(cr); // return FALSE; // } // gboolean LD_WM_Destroy_call(GtkWidget *widget, GdkEvent *event, gpointer user_data) // { // /* Handles: // * WM_DESTROY // */ // if(CheckSaveUserCancels()) // return TRUE; // FreezeWindowPos(MainWindow); // FreezeDWORD(IoListHeight); // gtk_main_quit(); // gdk_threads_leave(); // } // gboolean LD_WM_Size_call(GtkWidget *widget, GdkEvent *event, gpointer user_data) // { // /* Handles: // * WM_SIZE // */ // MainWindowResized(); // return FALSE; // } // gboolean LD_WM_Command_call(GtkMenuItem* men, gpointer gpcode) // { // int tempcode = GPOINTER_TO_INT(gpcode); // ProcessMenu (tempcode); // return FALSE; // } // void ProcessorCall(GtkCheckMenuItem* men, gpointer gpcode) // { // int tempcode = GPOINTER_TO_INT(gpcode); // if(gtk_check_menu_item_get_active(men)) // { // ProcessMenu (tempcode); // } // } // gboolean LD_WM_SetFocus_call(GtkWidget *widget, GdkEvent *event, gpointer user_data) // { // /* Handles: // * WM_SETFOCUS // */ // InvalidateRect(DrawWindow, NULL, FALSE); // return FALSE; // } // void LD_WM_Notify_Row_Activate_call(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) // { // /* Handles: // * WM_NOTIFY // */ // // g_print("Row activated!\n"); // int *ip = gtk_tree_path_get_indices ( path ); // NMHDR h; // h.code = LVN_ITEMACTIVATE; // h.item.iItem = ip[0]; // h.hlistFrom = IoList; // IoListProc(&h); // } // void LD_WM_Notify_Cursor_Change_call(GtkTreeView *tree_view, gpointer user_data) // { // /* Handles: // * WM_NOTIFY // */ // ITLIST iter; // // BOOL empty = !gtk_tree_model_get_iter_first (IoList, &iter); // // g_print("empty = %i\n", (empty == TRUE) ); // HLIST pTreeModel; // int *ip; // GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); // gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); // if(gtk_tree_selection_get_selected (selection, &pTreeModel, &iter)) // { // GtkTreePath *path = gtk_tree_model_get_path ( pTreeModel , &iter ) ; // ip = gtk_tree_path_get_indices ( path ); // } // else // if(!gtk_tree_model_get_iter_first (IoList, &iter)) // return; // NMHDR h; // h.code = LVN_GETDISPINFO; // h.item.iItem = (ip == NULL) ? 0 : ip[0]; // h.hlistFrom = IoList; // h.hlistIter = &iter; // IoListProc(&h); // } inline void MenuHandler () { QObject::connect(ExitMenu, SIGNAL(triggered()), LDmicroApp, SLOT(quit())); // QObject::connect(ExitMenu, SIGNAL(changed()), LDmicroApp, SLOT(aboutQt())); // g_signal_connect(G_OBJECT(NewMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_NEW)); // g_signal_connect(G_OBJECT(OpenMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_OPEN)); // g_signal_connect(G_OBJECT(SaveMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_SAVE)); // g_signal_connect(G_OBJECT(SaveAsMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_SAVE_AS)); // g_signal_connect(G_OBJECT(ExportMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_EXPORT)); // g_signal_connect(G_OBJECT(ExitMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_EXIT)); // g_signal_connect(G_OBJECT(InsertCommentMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_COMMENT)); // g_signal_connect(G_OBJECT(InsertContactsMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_CONTACTS)); // g_signal_connect(G_OBJECT(InsertCoilMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_COIL)); // g_signal_connect(G_OBJECT(InsertTonMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_TON)); // g_signal_connect(G_OBJECT(InsertTofMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_TOF)); // g_signal_connect(G_OBJECT(InsertRtoMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_RTO)); // g_signal_connect(G_OBJECT(InsertCtuMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_CTU)); // g_signal_connect(G_OBJECT(InsertCtdMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_CTD)); // g_signal_connect(G_OBJECT(InsertCtcMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_CTC)); // g_signal_connect(G_OBJECT(InsertResMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_RES)); // g_signal_connect(G_OBJECT(InsertOpenMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_OPEN)); // g_signal_connect(G_OBJECT(InsertShortMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_SHORT)); // g_signal_connect(G_OBJECT(InsertMasterRlyMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_MASTER_RLY)); // g_signal_connect(G_OBJECT(InsertShiftRegMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_SHIFT_REG)); // g_signal_connect(G_OBJECT(InsertLutMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_LUT)); // g_signal_connect(G_OBJECT(InsertPwlMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_PWL)); // g_signal_connect(G_OBJECT(InsertFmtdStrMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_FMTD_STR)); // g_signal_connect(G_OBJECT(InsertOsrMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_OSR)); // g_signal_connect(G_OBJECT(InsertOsfMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_OSF)); // g_signal_connect(G_OBJECT(InsertMovMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_MOV)); // g_signal_connect(G_OBJECT(InsertSetPwmMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_SET_PWM)); // g_signal_connect(G_OBJECT(InsertReadAdcMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_READ_ADC)); // g_signal_connect(G_OBJECT(InsertUartSendMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_UART_SEND)); // g_signal_connect(G_OBJECT(InsertUartRecvMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_UART_RECV)); // g_signal_connect(G_OBJECT(InsertPersistMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_PERSIST)); // g_signal_connect(G_OBJECT(InsertAddMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_ADD)); // g_signal_connect(G_OBJECT(InsertSubMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_SUB)); // g_signal_connect(G_OBJECT(InsertMulMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_MUL)); // g_signal_connect(G_OBJECT(InsertDivMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_DIV)); // g_signal_connect(G_OBJECT(InsertEquMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_EQU)); // g_signal_connect(G_OBJECT(InsertNeqMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_NEQ)); // g_signal_connect(G_OBJECT(InsertGrtMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_GRT)); // g_signal_connect(G_OBJECT(InsertGeqMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_GEQ)); // g_signal_connect(G_OBJECT(InsertLesMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_LES)); // g_signal_connect(G_OBJECT(InsertLeqMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_LEQ)); // g_signal_connect(G_OBJECT(MakeNormalMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_MAKE_NORMAL)); // g_signal_connect(G_OBJECT(NegateMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_NEGATE)); // g_signal_connect(G_OBJECT(MakeSetOnlyMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_MAKE_SET_ONLY)); // g_signal_connect(G_OBJECT(MakeResetOnlyMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_MAKE_RESET_ONLY)); // g_signal_connect(G_OBJECT(UndoMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_UNDO)); // g_signal_connect(G_OBJECT(RedoMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_REDO)); // g_signal_connect(G_OBJECT(InsertRungBeforeMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_RUNG_BEFORE)); // g_signal_connect(G_OBJECT(InsertRungAfterMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_RUNG_AFTER)); // g_signal_connect(G_OBJECT(DeleteRungMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_DELETE_RUNG)); // g_signal_connect(G_OBJECT(PushRungUpMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_PUSH_RUNG_UP)); // g_signal_connect(G_OBJECT(PushRungDownMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_PUSH_RUNG_DOWN)); // g_signal_connect(G_OBJECT(DeleteElementMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_DELETE_ELEMENT)); // g_signal_connect(G_OBJECT(McuSettingsMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_MCU_SETTINGS)); // g_signal_connect(G_OBJECT(SimulationModeMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_SIMULATION_MODE)); // g_signal_connect(G_OBJECT(StartSimulationMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_START_SIMULATION)); // g_signal_connect(G_OBJECT(StopSimulationMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_STOP_SIMULATION)); // g_signal_connect(G_OBJECT(SingleCycleMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_SINGLE_CYCLE)); // g_signal_connect(G_OBJECT(CompileMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_COMPILE)); // g_signal_connect(G_OBJECT(CompileAsMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_COMPILE_AS)); // g_signal_connect(G_OBJECT(ManualMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_MANUAL)); // g_signal_connect(G_OBJECT(AboutMenu), "activate", // G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_ABOUT)); // // Connect microcontroller signals automatically // for(int i = 0; i < NUM_SUPPORTED_MCUS; i++) // { // g_signal_connect(G_OBJECT(ProcessorMenuItems[i]), "toggled", // G_CALLBACK(ProcessorCall), GINT_TO_POINTER((MNU_PROCESSOR_0 + i))); // } } //----------------------------------------------------------------------------- // Entry point into the program. //----------------------------------------------------------------------------- int main(int argc, char** argv) { /// Check if we're running in non-interactive mode; in that case we should /// load the file, compile, and exit. if(argc >= 2) { RunningInBatchMode = TRUE; char *err = "Bad command line arguments: run 'ldmicro /c src.ld dest.hex'\n"; if(argc < 4) { printf(err); exit(-1); } char *source = (char*)malloc(strlen(argv[2]) + strlen(argv[3]) + 2); sprintf(source, "%s %s", argv[2], argv[3]); while(isspace(*source)) { source++; } if(*source == '\0') { Error(err); free(source); exit(-1); } char *dest = source; while(!isspace(*dest) && *dest) { dest++; } if(*dest == '\0') { Error(err); free(source); exit(-1); } *dest = '\0'; dest++; while(isspace(*dest)) { dest++; } if(*dest == '\0') { Error(err); free(source); exit(-1); } if(!LoadProjectFromFile(source)) { Error("Couldn't open '%s', running non-interactively.\n", source); free(source); exit(-1); } strcpy(CurrentCompileFile, dest); GenerateIoList(-1); CompileProgram(FALSE); exit(0); } //Basic qt application ::QApplication app(argc, argv); LDmicroApp = &app; MainHeap = HeapCreate(0, 1024*64, 0); QSize MwSize(800,600); // Make main window MainWindow = new QWidget(); MWIcon = new QIcon(LDMICRO_ICON); MainMenu = new QMenuBar(MainWindow); // Initialize cursor and set color CursorObject = new QGroupBox(DrawWindow); // CursorObject->setColor(); // QMenu TopMenu("Top Menu", MainWindow); // MainMenu->addMenu(&TopMenu); // MainWindow->layout()->setMenuBar(MainMenu); MainWindow->setWindowTitle("LDmicro"); MainWindow->resize(MwSize); MainWindow->move( 10, 10); // MainWindow->setStyleSheet("background-color: black;"); //Default Icon for entire app app.setWindowIcon(*MWIcon); //Icon for main window MainWindow->setWindowIcon(*MWIcon); MakeMainWindowMenus(); MakeDialogBoxClass(); InitForDrawing(); ThawWindowPos(MainWindow); IoListHeight = 100; ThawDWORD(IoListHeight); MakeMainWindowControls(); MainWindowResized(); MenuHandler(); NewProgram(); strcpy(CurrentSaveFile, ""); MainWindow->show(); /// Blink cursor CursorTimer = SetTimer(DrawWindow, TIMER_BLINK_CURSOR, 500, CursorTimer); GenerateIoListDontLoseSelection(); // MakeDialogBoxClass(); /*ThawWindowPos(MainWindow); ThawDWORD(IoListHeight); g_print("IoListHeight start: %d\n", IoListHeight); MakeMainWindowControls(); /// takes care of MakeMainWindowMenus() MainWindowResized(); /// Keyboard and mouse hooks equivalent to MainWndProc g_signal_connect (MainWindow, "delete_event", G_CALLBACK (LD_WM_Close_call), NULL); g_signal_connect (MainWindow, "key_press_event", G_CALLBACK (LD_WM_KeyDown_call), NULL); g_signal_connect (MainWindow, "button_press_event", G_CALLBACK (LD_GTK_mouse_click_hook), NULL); g_signal_connect (MainWindow, "scroll_event", G_CALLBACK (LD_GTK_mouse_scroll_hook), NULL); g_signal_connect (MainWindow, "motion_notify_event", G_CALLBACK (LD_WM_MouseMove_call), NULL); g_signal_connect (DrawWindow, "draw", G_CALLBACK (LD_WM_Paint_call), NULL); g_signal_connect (MainWindow, "destroy_event", G_CALLBACK (LD_WM_Destroy_call), NULL); g_signal_connect (MainWindow, "configure_event", G_CALLBACK (LD_WM_Size_call), NULL); g_signal_connect (MainWindow, "focus_in_event", G_CALLBACK (LD_WM_SetFocus_call), NULL); g_signal_connect (view, "row_activated", G_CALLBACK (LD_WM_Notify_Row_Activate_call), NULL); g_signal_connect (view, "cursor_changed", G_CALLBACK (LD_WM_Notify_Cursor_Change_call), NULL); MenuHandler(); /// Keyboard and mouse hooks equivalent to MainWndProc - end NewProgram(); strcpy(CurrentSaveFile, ""); /// We are running interactively, or we would already have exited. We /// can therefore show the window now, and otherwise set up the GUI. /// Displaying the window gtk_widget_show_all(MainWindow); /// Blink cursor SetTimer(DrawWindow, TIMER_BLINK_CURSOR, 200, BlinkCursor); // SetTimer(MainWindow, TIMER_BLINK_CURSOR, 800, BlinkCursor); */ /*if(argc >= 2) { char line[MAX_PATH]; if(*argv[1] == '"') { strcpy(line, argv[1]+1); } else { strcpy(line, argv[1]); } if(strchr(line, '"')) *strchr(line, '"') = '\0'; realpath(line, CurrentSaveFile); if(!LoadProjectFromFile(CurrentSaveFile)) { NewProgram(); Error(_("Couldn't open '%s'."), CurrentSaveFile); CurrentSaveFile[0] = '\0'; } UndoFlush(); }*/ /*GenerateIoListDontLoseSelection(); RefreshScrollbars(); UpdateMainWindowTitleBar(); */ // MSG msg; // DWORD ret; // while(ret = GetMessage(&msg, NULL, 0, 0)) { // if(msg.hwnd == IoList && msg.message == WM_KEYDOWN) { // if(msg.wParam == VK_TAB) { // SetFocus(MainWindow); // continue; // } // } // if(msg.message == WM_KEYDOWN && msg.wParam != VK_UP && // msg.wParam != VK_DOWN && msg.wParam != VK_RETURN && msg.wParam // != VK_SHIFT) // { // if(msg.hwnd == IoList) { // msg.hwnd = MainWindow; // SetFocus(MainWindow); // } // } // TranslateMessage(&msg); // DispatchMessage(&msg); // } /* gtk_main(); return EXIT_SUCCESS;*/ return app.exec(); delete MainWindow; delete MWIcon; }