//-----------------------------------------------------------------------------
// 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 .
//------
//
// Constants, structures, declarations etc. for the PIC ladder logic compiler
// Jonathan Westhues, Oct 2004
//-----------------------------------------------------------------------------
#ifndef __LDMICRO_H
#define __LDMICRO_H
#include
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
// 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 HMENU NewMenu;
extern HMENU OpenMenu;
extern HMENU SaveMenu;
extern HMENU SaveAsMenu;
extern HMENU ExportMenu;
extern HMENU ExitMenu;
extern HMENU UndoMenu;
extern HMENU RedoMenu;
extern HMENU PushRungUpMenu;
extern HMENU PushRungDownMenu;
extern HMENU InsertRungBeforeMenu;
extern HMENU InsertRungAfterMenu;
extern HMENU DeleteElementMenu;
extern HMENU DeleteRungMenu;
extern HMENU InsertCommentMenu;
extern HMENU InsertContactsMenu;
extern HMENU InsertCoilMenu;
extern HMENU InsertTonMenu;
extern HMENU InsertTofMenu;
extern HMENU InsertRtoMenu;
extern HMENU InsertResMenu;
extern HMENU InsertOsrMenu;
extern HMENU InsertOsfMenu;
extern HMENU InsertCtuMenu;
extern HMENU InsertCtdMenu;
extern HMENU InsertCtcMenu;
extern HMENU InsertAddMenu;
extern HMENU InsertSubMenu;
extern HMENU InsertMulMenu;
extern HMENU InsertDivMenu;
extern HMENU InsertMovMenu;
extern HMENU InsertReadAdcMenu;
extern HMENU InsertSetPwmMenu;
extern HMENU InsertUartSendMenu;
extern HMENU InsertUartRecvMenu;
extern HMENU InsertEquMenu;
extern HMENU InsertNeqMenu;
extern HMENU InsertGrtMenu;
extern HMENU InsertGeqMenu;
extern HMENU InsertLesMenu;
extern HMENU InsertLeqMenu;
extern HMENU InsertOpenMenu;
extern HMENU InsertShortMenu;
extern HMENU InsertMasterRlyMenu;
extern HMENU InsertShiftRegMenu;
extern HMENU InsertLutMenu;
extern HMENU InsertFmtdStrMenu;
extern HMENU InsertPersistMenu;
extern HMENU MakeNormalMenu;
extern HMENU NegateMenu;
extern HMENU MakeSetOnlyMenu;
extern HMENU MakeResetOnlyMenu;
extern HMENU InsertPwlMenu;
extern HMENU McuSettingsMenu;
extern HMENU ProcessorMenuItems[NUM_SUPPORTED_MCUS+1];
extern HMENU MicroControllerMenu;
extern HMENU SimulationModeMenu;
extern HMENU StartSimulationMenu;
extern HMENU StopSimulationMenu;
extern HMENU SingleCycleMenu;
extern HMENU CompileMenu;
extern HMENU CompileAsMenu;
extern HMENU ManualMenu;
extern HMENU AboutMenu;
// 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 HWID MainWindow;
extern HDC Hdc;
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(WPARAM wParam);
void HscrollProc(WPARAM 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 int IoListHeight;
extern HMENU ScrollWindow;
// draw.cpp
int ProgCountWidestRow(void);
int CountHeightOfElement(int which, void *elem);
BOOL DrawElement(int which, void *elem, int *cx, int *cy, BOOL poweredBefore);
void DrawEndRung(int cx, int cy);
extern int ColsAvailable;
extern BOOL SelectionActive;
extern BOOL ThisHighlighted;
// draw_outputdev.cpp
extern void (*DrawChars)(int, int, char *);
void CALLBACK BlinkCursor(HWND hwnd, UINT msg, UINT_PTR id, DWORD time);
void PaintWindow(void);
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);
HWND CreateWindowClient(DWORD exStyle, char *className, char *windowName,
DWORD style, int x, int y, int width, int height, HWND parent,
HMENU menu, HINSTANCE instance, void *param);
void MakeComponentListClass(void);
void MakeNamingListClass(void);
void MakeDialogBoxClass(void);
void NiceFont(HWND h);
void FixedFont(HWND h);
void CompileSuccessfulMessage(char *str);
extern BOOL RunningInBatchMode;
extern HFONT MyNiceFont;
extern HFONT MyFixedFont;
extern HWND OkButton;
extern HWND CancelButton;
extern BOOL DialogDone;
extern BOOL DialogCancel;
// lang.cpp
char *_(char *in);
// simulate.cpp
void SimulateOneCycle(BOOL forceRefresh);
void CALLBACK PlcCycleTimer(HWND hwnd, UINT msg, UINT_PTR id, DWORD time);
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