diff options
Diffstat (limited to 'ldmicro/includes/ldmicro.h')
-rw-r--r-- | ldmicro/includes/ldmicro.h | 857 |
1 files changed, 857 insertions, 0 deletions
diff --git a/ldmicro/includes/ldmicro.h b/ldmicro/includes/ldmicro.h new file mode 100644 index 0000000..c5db57f --- /dev/null +++ b/ldmicro/includes/ldmicro.h @@ -0,0 +1,857 @@ +//----------------------------------------------------------------------------- +// 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 <http://www.gnu.org/licenses/>. +//------ +// +// Constants, structures, declarations etc. for the PIC ladder logic compiler +// Jonathan Westhues, Oct 2004 +//----------------------------------------------------------------------------- + +#ifndef __LDMICRO_H +#define __LDMICRO_H + +#include <setjmp.h> +typedef signed short SWORD; +typedef signed long SDWORD; + +// #include "linuxUI.h" + +//----------------------------------------------- +// `Configuration options.' + +// The library that I use to do registry stuff. decleared in freezeLD.h due to build issues +// #define FREEZE_SUBKEY "LDMicro" + +// Size of the font that we will use to draw the ladder diagrams, in pixels +#define FONT_WIDTH 7 +#define FONT_HEIGHT 13 + +// Timer IDs associated with the main window. +#define TIMER_BLINK_CURSOR 1 +#define TIMER_SIMULATE 2 + +//----------------------------------------------- +// Constants for the GUI. We have drop-down menus, a listview for the I/Os, +// etc. + +#define NUM_SUPPORTED_MCUS 16 +#define IO_COLUMN_COUNT 5 + +// Menu IDs +#define MNU_NEW 0x01 +#define MNU_OPEN 0x02 +#define MNU_SAVE 0x03 +#define MNU_SAVE_AS 0x04 +#define MNU_EXPORT 0x05 +#define MNU_EXIT 0x06 + +#define MNU_UNDO 0x10 +#define MNU_REDO 0x11 +#define MNU_PUSH_RUNG_UP 0x12 +#define MNU_PUSH_RUNG_DOWN 0x13 +#define MNU_INSERT_RUNG_BEFORE 0x14 +#define MNU_INSERT_RUNG_AFTER 0x15 +#define MNU_DELETE_ELEMENT 0x16 +#define MNU_DELETE_RUNG 0x17 + +#define MNU_INSERT_COMMENT 0x20 +#define MNU_INSERT_CONTACTS 0x21 +#define MNU_INSERT_COIL 0x22 +#define MNU_INSERT_TON 0x23 +#define MNU_INSERT_TOF 0x24 +#define MNU_INSERT_RTO 0x25 +#define MNU_INSERT_RES 0x26 +#define MNU_INSERT_OSR 0x27 +#define MNU_INSERT_OSF 0x28 +#define MNU_INSERT_CTU 0x29 +#define MNU_INSERT_CTD 0x2a +#define MNU_INSERT_CTC 0x2b +#define MNU_INSERT_ADD 0x2c +#define MNU_INSERT_SUB 0x2d +#define MNU_INSERT_MUL 0x2e +#define MNU_INSERT_DIV 0x2f +#define MNU_INSERT_MOV 0x30 +#define MNU_INSERT_READ_ADC 0x31 +#define MNU_INSERT_SET_PWM 0x32 +#define MNU_INSERT_UART_SEND 0x33 +#define MNU_INSERT_UART_RECV 0x34 +#define MNU_INSERT_EQU 0x35 +#define MNU_INSERT_NEQ 0x36 +#define MNU_INSERT_GRT 0x37 +#define MNU_INSERT_GEQ 0x38 +#define MNU_INSERT_LES 0x39 +#define MNU_INSERT_LEQ 0x3a +#define MNU_INSERT_OPEN 0x3b +#define MNU_INSERT_SHORT 0x3c +#define MNU_INSERT_MASTER_RLY 0x3d +#define MNU_INSERT_SHIFT_REG 0x3e +#define MNU_INSERT_LUT 0x3f +#define MNU_INSERT_FMTD_STR 0x40 +#define MNU_INSERT_PERSIST 0x41 +#define MNU_MAKE_NORMAL 0x42 +#define MNU_NEGATE 0x43 +#define MNU_MAKE_SET_ONLY 0x44 +#define MNU_MAKE_RESET_ONLY 0x45 +#define MNU_INSERT_PWL 0x46 + +#define MNU_MCU_SETTINGS 0x50 +#define MNU_PROCESSOR_0 0xa0 + +#define MNU_SIMULATION_MODE 0x60 +#define MNU_START_SIMULATION 0x61 +#define MNU_STOP_SIMULATION 0x62 +#define MNU_SINGLE_CYCLE 0x63 + +#define MNU_COMPILE 0x70 +#define MNU_COMPILE_AS 0x71 + +#define MNU_MANUAL 0x80 +#define MNU_ABOUT 0x81 + +// #define MNU_ADV_SIMULATION + +// New menu items here +extern QAction* NewMenu; +extern QAction* OpenMenu; +extern QAction* SaveMenu; +extern QAction* SaveAsMenu; +extern QAction* ExportMenu; +extern QAction* ExitMenu; + +extern QAction* UndoMenu; +extern QAction* RedoMenu; +extern QAction* PushRungUpMenu; +extern QAction* PushRungDownMenu; +extern QAction* InsertRungBeforeMenu; +extern QAction* InsertRungAfterMenu; +extern QAction* DeleteElementMenu; +extern QAction* DeleteRungMenu; + +extern QAction* InsertCommentMenu; +extern QAction* InsertContactsMenu; +extern QAction* InsertCoilMenu; +extern QAction* InsertTonMenu; +extern QAction* InsertTofMenu; +extern QAction* InsertRtoMenu; +extern QAction* InsertResMenu; +extern QAction* InsertOsrMenu; +extern QAction* InsertOsfMenu; +extern QAction* InsertCtuMenu; +extern QAction* InsertCtdMenu; +extern QAction* InsertCtcMenu; +extern QAction* InsertAddMenu; +extern QAction* InsertSubMenu; +extern QAction* InsertMulMenu; +extern QAction* InsertDivMenu; +extern QAction* InsertMovMenu; +extern QAction* InsertReadAdcMenu; +extern QAction* InsertSetPwmMenu; +extern QAction* InsertUartSendMenu; +extern QAction* InsertUartRecvMenu; +extern QAction* InsertEquMenu; +extern QAction* InsertNeqMenu; +extern QAction* InsertGrtMenu; +extern QAction* InsertGeqMenu; +extern QAction* InsertLesMenu; +extern QAction* InsertLeqMenu; +extern QAction* InsertOpenMenu; +extern QAction* InsertShortMenu; +extern QAction* InsertMasterRlyMenu; +extern QAction* InsertShiftRegMenu; +extern QAction* InsertLutMenu; +extern QAction* InsertFmtdStrMenu; +extern QAction* InsertPersistMenu; +extern QAction* MakeNormalMenu; +extern QAction* NegateMenu; +extern QAction* MakeSetOnlyMenu; +extern QAction* MakeResetOnlyMenu; +extern QAction* InsertPwlMenu; + +extern QAction* McuSettingsMenu; +extern QAction* ProcessorMenuItems[NUM_SUPPORTED_MCUS+1]; +extern HMENU MicroControllerMenu; + +extern QAction* SimulationModeMenu; +extern QAction* StartSimulationMenu; +extern QAction* StopSimulationMenu; +extern QAction* SingleCycleMenu; + +extern QAction* CompileMenu; +extern QAction* CompileAsMenu; + +extern QAction* ManualMenu; +extern QAction* AboutMenu; + +extern QActionGroup* ProcessorMenuGroup; + +extern HWID PinList; + +// extern HMENU MNU_ADV_SIMULATION; + +// Columns within the I/O etc. listview. +#define LV_IO_NAME 0x00 +#define LV_IO_TYPE 0x01 +#define LV_IO_STATE 0x02 +#define LV_IO_PIN 0x03 +#define LV_IO_PORT 0x04 +//----------------------------------------------- +// Data structures for the actual ladder logic. A rung on the ladder +// is a series subcircuit. A series subcircuit contains elements or +// parallel subcircuits. A parallel subcircuit contains elements or series +// subcircuits. An element is a set of contacts (possibly negated) or a coil. + +#define MAX_ELEMENTS_IN_SUBCKT 16 + +#define ELEM_PLACEHOLDER 0x01 +#define ELEM_SERIES_SUBCKT 0x02 +#define ELEM_PARALLEL_SUBCKT 0x03 +#define ELEM_PADDING 0x04 +#define ELEM_COMMENT 0x05 + +#define ELEM_CONTACTS 0x10 +#define ELEM_COIL 0x11 +#define ELEM_TON 0x12 +#define ELEM_TOF 0x13 +#define ELEM_RTO 0x14 +#define ELEM_RES 0x15 +#define ELEM_ONE_SHOT_RISING 0x16 +#define ELEM_ONE_SHOT_FALLING 0x17 +#define ELEM_MOVE 0x18 +#define ELEM_ADD 0x19 +#define ELEM_SUB 0x1a +#define ELEM_MUL 0x1b +#define ELEM_DIV 0x1c +#define ELEM_EQU 0x1d +#define ELEM_NEQ 0x1e +#define ELEM_GRT 0x1f +#define ELEM_GEQ 0x20 +#define ELEM_LES 0x21 +#define ELEM_LEQ 0x22 +#define ELEM_CTU 0x23 +#define ELEM_CTD 0x24 +#define ELEM_CTC 0x25 +#define ELEM_SHORT 0x26 +#define ELEM_OPEN 0x27 +#define ELEM_READ_ADC 0x28 +#define ELEM_SET_PWM 0x29 +#define ELEM_UART_RECV 0x2a +#define ELEM_UART_SEND 0x2b +#define ELEM_MASTER_RELAY 0x2c +#define ELEM_SHIFT_REGISTER 0x2d +#define ELEM_LOOK_UP_TABLE 0x2e +#define ELEM_FORMATTED_STRING 0x2f +#define ELEM_PERSIST 0x30 +#define ELEM_PIECEWISE_LINEAR 0x31 + +#define CASE_LEAF \ + case ELEM_PLACEHOLDER: \ + case ELEM_COMMENT: \ + case ELEM_COIL: \ + case ELEM_CONTACTS: \ + case ELEM_TON: \ + case ELEM_TOF: \ + case ELEM_RTO: \ + case ELEM_CTD: \ + case ELEM_CTU: \ + case ELEM_CTC: \ + case ELEM_RES: \ + case ELEM_ONE_SHOT_RISING: \ + case ELEM_ONE_SHOT_FALLING: \ + case ELEM_EQU: \ + case ELEM_NEQ: \ + case ELEM_GRT: \ + case ELEM_GEQ: \ + case ELEM_LES: \ + case ELEM_LEQ: \ + case ELEM_ADD: \ + case ELEM_SUB: \ + case ELEM_MUL: \ + case ELEM_DIV: \ + case ELEM_MOVE: \ + case ELEM_SHORT: \ + case ELEM_OPEN: \ + case ELEM_READ_ADC: \ + case ELEM_SET_PWM: \ + case ELEM_UART_SEND: \ + case ELEM_UART_RECV: \ + case ELEM_MASTER_RELAY: \ + case ELEM_SHIFT_REGISTER: \ + case ELEM_LOOK_UP_TABLE: \ + case ELEM_PIECEWISE_LINEAR: \ + case ELEM_FORMATTED_STRING: \ + case ELEM_PERSIST: + +#define MAX_NAME_LEN 128 +#define MAX_COMMENT_LEN 384 +#define MAX_LOOK_UP_TABLE_LEN 60 + +typedef struct ElemSubckParallelTag ElemSubcktParallel; + +typedef struct ElemCommentTag { + char str[MAX_COMMENT_LEN]; +} ElemComment; + +typedef struct ElemContactsTag { + char name[MAX_NAME_LEN]; + BOOL negated; +} ElemContacts; + +typedef struct ElemCoilTag { + char name[MAX_NAME_LEN]; + BOOL negated; + BOOL setOnly; + BOOL resetOnly; +} ElemCoil; + +typedef struct ElemTimeTag { + char name[MAX_NAME_LEN]; + int delay; +} ElemTimer; + +typedef struct ElemResetTag { + char name[MAX_NAME_LEN]; +} ElemReset; + +typedef struct ElemMoveTag { + char src[MAX_NAME_LEN]; + char dest[MAX_NAME_LEN]; +} ElemMove; + +typedef struct ElemMathTag { + char op1[MAX_NAME_LEN]; + char op2[MAX_NAME_LEN]; + char dest[MAX_NAME_LEN]; +} ElemMath; + +typedef struct ElemCmpTag { + char op1[MAX_NAME_LEN]; + char op2[MAX_NAME_LEN]; +} ElemCmp; + +typedef struct ElemCounterTag { + char name[MAX_NAME_LEN]; + int max; +} ElemCounter; + +typedef struct ElemReadAdcTag { + char name[MAX_NAME_LEN]; +} ElemReadAdc; + +typedef struct ElemSetPwmTag { + char name[MAX_NAME_LEN]; + int targetFreq; +} ElemSetPwm; + +typedef struct ElemUartTag { + char name[MAX_NAME_LEN]; +} ElemUart; + +typedef struct ElemShiftRegisterTag { + char name[MAX_NAME_LEN]; + int stages; +} ElemShiftRegister; + +typedef struct ElemLookUpTableTag { + char dest[MAX_NAME_LEN]; + char index[MAX_NAME_LEN]; + int count; + BOOL editAsString; + SWORD vals[MAX_LOOK_UP_TABLE_LEN]; +} ElemLookUpTable; + +typedef struct ElemPiecewiseLinearTag { + char dest[MAX_NAME_LEN]; + char index[MAX_NAME_LEN]; + int count; + SWORD vals[MAX_LOOK_UP_TABLE_LEN]; +} ElemPiecewiseLinear; + +typedef struct ElemFormattedStringTag { + char var[MAX_NAME_LEN]; + char string[MAX_LOOK_UP_TABLE_LEN]; +} ElemFormattedString; + +typedef struct ElemPerisistTag { + char var[MAX_NAME_LEN]; +} ElemPersist; + +#define SELECTED_NONE 0 +#define SELECTED_ABOVE 1 +#define SELECTED_BELOW 2 +#define SELECTED_RIGHT 3 +#define SELECTED_LEFT 4 +typedef struct ElemLeafTag { + int selectedState; + BOOL poweredAfter; + union { + ElemComment comment; + ElemContacts contacts; + ElemCoil coil; + ElemTimer timer; + ElemReset reset; + ElemMove move; + ElemMath math; + ElemCmp cmp; + ElemCounter counter; + ElemReadAdc readAdc; + ElemSetPwmTag setPwm; + ElemUart uart; + ElemShiftRegister shiftRegister; + ElemFormattedString fmtdStr; + ElemLookUpTable lookUpTable; + ElemPiecewiseLinear piecewiseLinear; + ElemPersist persist; + } d; +} ElemLeaf; + +typedef struct ElemSubcktSeriesTag { + struct { + int which; + union { + void *any; + ElemSubcktParallel *parallel; + ElemLeaf *leaf; + } d; + } contents[MAX_ELEMENTS_IN_SUBCKT]; + int count; +} ElemSubcktSeries; + +typedef struct ElemSubckParallelTag { + struct { + int which; + union { + void *any; + ElemSubcktSeries *series; + ElemLeaf *leaf; + } d; + } contents[MAX_ELEMENTS_IN_SUBCKT]; + int count; +} ElemSubcktParallel; + +typedef struct McuIoInfoTag McuIoInfo; + +typedef struct PlcProgramSingleIoTag { + char name[MAX_NAME_LEN]; +#define IO_TYPE_PENDING 0 + +#define IO_TYPE_DIG_INPUT 1 +#define IO_TYPE_DIG_OUTPUT 2 +#define IO_TYPE_READ_ADC 3 +#define IO_TYPE_UART_TX 4 +#define IO_TYPE_UART_RX 5 +#define IO_TYPE_PWM_OUTPUT 6 +#define IO_TYPE_INTERNAL_RELAY 7 +#define IO_TYPE_TON 8 +#define IO_TYPE_TOF 9 +#define IO_TYPE_RTO 10 +#define IO_TYPE_COUNTER 11 +#define IO_TYPE_GENERAL 12 + int type; +#define NO_PIN_ASSIGNED 0 + int pin; +} PlcProgramSingleIo; + +#define MAX_IO 512 +typedef struct PlcProgramTag { + struct { + PlcProgramSingleIo assignment[MAX_IO]; + int count; + } io; + McuIoInfo *mcu; + int cycleTime; + int mcuClock; + int baudRate; + +#define MAX_RUNGS 99 + ElemSubcktSeries *rungs[MAX_RUNGS]; + BOOL rungPowered[MAX_RUNGS]; + int numRungs; +} PlcProgram; + +//----------------------------------------------- +// For actually drawing the ladder logic on screen; constants that determine +// how the boxes are laid out in the window, need to know that lots of +// places for figuring out if a mouse click is in a box etc. + +// dimensions, in characters, of the area reserved for 1 leaf element +#define POS_WIDTH 17 +#define POS_HEIGHT 3 + +// offset from the top left of the window at which we start drawing, in pixels +#define X_PADDING 35 +#define Y_PADDING 14 + +typedef struct PlcCursorTag { + int left; + int top; + int width; + int height; +} PlcCursor; + +//----------------------------------------------- +// The syntax highlighting style colours; a structure for the palette. + +typedef struct SyntaxHighlightingColoursTag { + COLORREF bg; // background + COLORREF def; // default foreground + COLORREF selected; // selected element + COLORREF op; // `op code' (like OSR, OSF, ADD, ...) + COLORREF punct; // punctuation, like square or curly braces + COLORREF lit; // a literal number + COLORREF name; // the name of an item + COLORREF rungNum; // rung numbers + COLORREF comment; // user-written comment text + + COLORREF bus; // the `bus' at the right and left of screen + + COLORREF simBg; // background, simulation mode + COLORREF simRungNum; // rung number, simulation mode + COLORREF simOff; // de-energized element, simulation mode + COLORREF simOn; // energzied element, simulation mode + COLORREF simBusLeft; // the `bus,' can be different colours for + COLORREF simBusRight; // right and left of the screen +} SyntaxHighlightingColours; +extern SyntaxHighlightingColours HighlightColours; + +//----------------------------------------------- +// Processor definitions. These tables tell us where to find the I/Os on +// a processor, what bit in what register goes with what pin, etc. There +// is one master SupportedMcus table, which contains entries for each +// supported microcontroller. + +typedef struct McuIoPinInfoTag { + char port; + int bit; + int pin; +} McuIoPinInfo; + +typedef struct McuAdcPinInfoTag { + int pin; + BYTE muxRegValue; +} McuAdcPinInfo; + +#define ISA_AVR 0x00 +#define ISA_PIC16 0x01 +#define ISA_ANSIC 0x02 +#define ISA_INTERPRETED 0x03 +#define ISA_ARDUINO 0x04 + +#define MAX_IO_PORTS 10 +#define MAX_RAM_SECTIONS 5 + +typedef struct McuIoInfoTag { + char *mcuName; + char portPrefix; + DWORD inputRegs[MAX_IO_PORTS]; // a is 0, j is 9 + DWORD outputRegs[MAX_IO_PORTS]; + DWORD dirRegs[MAX_IO_PORTS]; + DWORD flashWords; + struct { + DWORD start; + int len; + } ram[MAX_RAM_SECTIONS]; + McuIoPinInfo *pinInfo; + int pinCount; + McuAdcPinInfo *adcInfo; + int adcCount; + int adcMax; + struct { + int rxPin; + int txPin; + } uartNeeds; + int pwmNeedsPin; + int whichIsa; + BOOL avrUseIjmp; + DWORD configurationWord; +} McuIoInfo; + +//----------------------------------------------- +// Function prototypes + +// ldmicro.cpp +void ProgramChanged(void); + +void SetMenusEnabled(BOOL canNegate, BOOL canNormal, BOOL canResetOnly, + BOOL canSetOnly, BOOL canDelete, BOOL canInsertEnd, BOOL canInsertOther, + BOOL canPushRungDown, BOOL canPushRungUp, BOOL canInsertComment); + +void SetUndoEnabled(BOOL undoEnabled, BOOL redoEnabled); +void RefreshScrollbars(void); +extern HINSTANCE Instance; +extern QApplication* LDmicroApp; +extern HWID MainWindow; +extern QIcon* MWIcon; +extern QMenuBar* MainMenu; +extern HWID DrawWindow; +extern PlcProgram Prog; +extern char CurrentSaveFile[MAX_PATH]; +extern char CurrentCompileFile[MAX_PATH]; +extern McuIoInfo SupportedMcus[NUM_SUPPORTED_MCUS]; + +// memory debugging, because I often get careless; ok() will check that the +// heap used for all the program storage is not yet corrupt, and oops() if +// it is +void CheckHeap(char *file, int line); +#define ok() CheckHeap(__FILE__, __LINE__) + +// maincontrols.cpp +void MakeMainWindowControls(void); +HMENU MakeMainWindowMenus(void); +void VscrollProc(int wParam); +void HscrollProc(int wParam); +void GenerateIoListDontLoseSelection(void); +void RefreshControlsToSettings(void); +void MainWindowResized(void); +void ToggleSimulationMode(void); +void StopSimulation(void); +void StartSimulation(void); +void UpdateMainWindowTitleBar(void); +extern int ScrollWidth; +extern int ScrollHeight; +extern BOOL NeedHoriz; +extern HLIST IoList; +extern int IoListTop; +extern UINT IoListHeight; +extern HMENU ScrollWindow; + +// draw.cpp +int ProgCountWidestRow(void); +int CountHeightOfElement(int which, void *elem); +BOOL DrawElement(HCRDC Hcr, int which, void *elem, int *cx, int *cy, BOOL poweredBefore); +void DrawEndRung(HCRDC Hcr, int cx, int cy); +extern int ColsAvailable; +extern BOOL SelectionActive; +extern BOOL ThisHighlighted; + +// draw_outputdev.cpp +extern void (*DrawChars)(HCRDC Hcr, int, int, const char *); +BOOL BlinkCursor(BOOL kill); +void PaintWindow(); +void ExportDrawingAsText(char *file); +void InitForDrawing(void); +void SetUpScrollbars(BOOL *horizShown, SCROLLINFO *horiz, SCROLLINFO *vert); +int ScreenRowsAvailable(void); +int ScreenColsAvailable(void); +extern HFONT FixedWidthFont; +extern HFONT FixedWidthFontBold; +extern int SelectedGxAfterNextPaint; +extern int SelectedGyAfterNextPaint; +extern BOOL ScrollSelectedIntoViewAfterNextPaint; +extern int ScrollXOffset; +extern int ScrollYOffset; +extern int ScrollXOffsetMax; +extern int ScrollYOffsetMax; + +// schematic.cpp +void SelectElement(int gx, int gy, int state); +void MoveCursorKeyboard(int keyCode); +void MoveCursorMouseClick(int x, int y); +BOOL MoveCursorTopLeft(void); +void EditElementMouseDoubleclick(int x, int y); +void EditSelectedElement(void); +void MakeResetOnlySelected(void); +void MakeSetOnlySelected(void); +void MakeNormalSelected(void); +void NegateSelected(void); +void ForgetFromGrid(void *p); +void ForgetEverything(void); +void WhatCanWeDoFromCursorAndTopology(void); +BOOL FindSelected(int *gx, int *gy); +void MoveCursorNear(int gx, int gy); + +#define DISPLAY_MATRIX_X_SIZE 16 +#define DISPLAY_MATRIX_Y_SIZE 512 +extern ElemLeaf *DisplayMatrix[DISPLAY_MATRIX_X_SIZE][DISPLAY_MATRIX_Y_SIZE]; +extern int DisplayMatrixWhich[DISPLAY_MATRIX_X_SIZE][DISPLAY_MATRIX_Y_SIZE]; +extern ElemLeaf DisplayMatrixFiller; +#define PADDING_IN_DISPLAY_MATRIX (&DisplayMatrixFiller) +#define VALID_LEAF(x) ((x) != NULL && (x) != PADDING_IN_DISPLAY_MATRIX) +extern ElemLeaf *Selected; +extern int SelectedWhich; + +extern PlcCursor Cursor; +extern BOOL CanInsertEnd; +extern BOOL CanInsertOther; +extern BOOL CanInsertComment; + +// circuit.cpp +void AddTimer(int which); +void AddCoil(void); +void AddContact(void); +void AddEmpty(int which); +void AddMove(void); +void AddMath(int which); +void AddCmp(int which); +void AddReset(void); +void AddCounter(int which); +void AddReadAdc(void); +void AddSetPwm(void); +void AddUart(int which); +void AddPersist(void); +void AddComment(char *text); +void AddShiftRegister(void); +void AddMasterRelay(void); +void AddLookUpTable(void); +void AddPiecewiseLinear(void); +void AddFormattedString(void); +void DeleteSelectedFromProgram(void); +void DeleteSelectedRung(void); +void InsertRung(BOOL afterCursor); +int RungContainingSelected(void); +BOOL ItemIsLastInCircuit(ElemLeaf *item); +BOOL UartFunctionUsed(void); +BOOL PwmFunctionUsed(void); +void PushRungUp(void); +void PushRungDown(void); +void NewProgram(void); +ElemLeaf *AllocLeaf(void); +ElemSubcktSeries *AllocSubcktSeries(void); +ElemSubcktParallel *AllocSubcktParallel(void); +void FreeCircuit(int which, void *any); +void FreeEntireProgram(void); +void UndoUndo(void); +void UndoRedo(void); +void UndoRemember(void); +void UndoFlush(void); +BOOL CanUndo(void); + +// loadsave.cpp +BOOL LoadProjectFromFile(char *filename); +BOOL SaveProjectToFile(char *filename); + +// iolist.cpp +int GenerateIoList(int prevSel); +void SaveIoListToFile(FILE *f); +BOOL LoadIoListFromFile(FILE *f); +void ShowIoDialog(int item); +void IoListProc(NMHDR *h); +void ShowAnalogSliderPopup(char *name); + +// commentdialog.cpp +void ShowCommentDialog(char *comment); +// contactsdialog.cpp +void ShowContactsDialog(BOOL *negated, char *name); +// coildialog.cpp +void ShowCoilDialog(BOOL *negated, BOOL *setOnly, BOOL *resetOnly, char *name); + +//naminglist.cpp +void MakeSmplDialogClass(void); + +// simpledialog.cpp +void ShowTimerDialog(int which, int *delay, char *name); +void ShowCounterDialog(int which, int *count, char *name); +void ShowMoveDialog(char *dest, char *src); +void ShowReadAdcDialog(char *name); +void ShowSetPwmDialog(char *name, int *targetFreq); +void ShowPersistDialog(char *var); +void ShowUartDialog(int which, char *name); +void ShowCmpDialog(int which, char *op1, char *op2); +void ShowMathDialog(int which, char *dest, char *op1, char *op2); +void ShowShiftRegisterDialog(char *name, int *stages); +void ShowFormattedStringDialog(char *var, char *string); +void ShowLookUpTableDialog(ElemLeaf *l); +void ShowPiecewiseLinearDialog(ElemLeaf *l); +void ShowResetDialog(char *name); +// confdialog.cpp +void ShowConfDialog(void); +// helpdialog.cpp +void ShowHelpDialog(BOOL about); + +// miscutil.cpp +#define oops() { \ + dbp("bad at %d %s\n", __LINE__, __FILE__); \ + Error("Internal error at line %d file '%s'\n", __LINE__, __FILE__); \ + exit(1); \ + } + +void dbp(char *str, ...); +void Error(char *str, ...); +void *CheckMalloc(size_t n); +void CheckFree(void *p); +extern HANDLE MainHeap; +void StartIhex(FILE *f); +void WriteIhex(FILE *f, BYTE b); +void FinishIhex(FILE *f); +char *IoTypeToString(int ioType); +void PinNumberForIo(char *dest, PlcProgramSingleIo *io); +HWID CreateWindowClient(GtkWindowType wType, GdkWindowTypeHint wthint, char *windowName, + int x, int y, int width, int height, HWND parent); + +void MakeComponentListClass(void); +void MakeNamingListClass(void); +void MakeDialogBoxClass(void); +void NiceFont(HWID h); +void FixedFont(HWID h); +void CompileSuccessfulMessage(char *str); +extern BOOL RunningInBatchMode; +extern HFONT MyNiceFont; +extern HFONT MyFixedFont; +// extern HWID OkButton; +// extern HWID CancelButton; +// extern BOOL DialogDone; +// extern BOOL DialogCancel; + +// lang.cpp +char *_(char *in); + + +// simulate.cpp +void SimulateOneCycle(BOOL forceRefresh); +BOOL PlcCycleTimer(BOOL kill); +void StartSimulationTimer(void); +void ClearSimulationData(void); +void DescribeForIoList(char *name, char *out); +void SimulationToggleContact(char *name); +void SimulationSetContact(char* name); +void SimulationResetContact(char* name); +void SetAdcShadow(char *name, SWORD val); +SWORD GetAdcShadow(char *name); +void DestroyUartSimulationWindow(void); +void ShowUartSimulationWindow(void); +extern BOOL InSimulationMode; + +extern BOOL SimulateRedrawAfterNextCycle; + +// compilecommon.cpp +void AllocStart(void); +DWORD AllocOctetRam(void); +void AllocBitRam(DWORD *addr, int *bit); +void MemForVariable(char *name, DWORD *addrl, DWORD *addrh); +BYTE MuxForAdcVariable(char *name); +void MemForSingleBit(char *name, BOOL forRead, DWORD *addr, int *bit); +void MemCheckForErrorsPostCompile(void); +void BuildDirectionRegisters(BYTE *isInput, BYTE *isOutput); +void ComplainAboutBaudRateError(int divisor, double actual, double err); +void ComplainAboutBaudRateOverflow(void); +#define CompileError() longjmp(CompileErrorBuf, 1) +extern jmp_buf CompileErrorBuf; + +// intcode.cpp +void IntDumpListing(char *outFile); +BOOL GenerateIntermediateCode(void); +// pic16.cpp +void CompilePic16(char *outFile); +// avr.cpp +void CompileAvr(char *outFile); +// ansic.cpp +void CompileAnsiC(char *outFile); +// interpreted.c +void CompileInterpreted(char *outFile); +//Arduino.cpp +void CompileArduino(char *outFile); + +#endif |