📄 plc.c
字号:
help();
sscanf(&argv[i][2],"%ld",&baudrate);
break;
case 'Q': /* quick exit */
quickexit = TRUE;
break;
case 'E': /* big-endian target */
is_littleendian = FALSE;
break;
default:
help(); /* this does not return */
break;
}
for (j = i; j < argc-1; j++)
argv[j] = argv[j+1];
argc--;
i--; /* remove this cmdline parameter */
}
}
if (argc > 1)
{
switch(argv[1][0])
{
case '1':
commbase = 0x03f8;
irqnum = 4;
break;
case '2':
commbase = 0x02f8;
irqnum = 3;
break;
case '3':
commbase = 0x03e8;
irqnum = 4;
break;
case '4':
commbase = 0x02e8;
irqnum = 3;
break;
default:
help(); /* this does not return */
break;
}
}
take_comm_interrupt();
init_comm_port();
vesamode(vesa_mode);
dirty = FALSE;
newladder();
init_mouse_cursor();
while (!exitflag)
{
update_mouse();
if (csts())
if (ci() == ESC)
{
if (!quickexit)
cleanup_dirty();
exitflag = TRUE;
}
}
videomode(MODE_STANDARD_TEXT);
reset_comm_port();
reset_comm_interrupt();
exit(0);
}
WORD beep()
{
putchar('\007');
return(FALSE);
}
WORD mouseover_menuindex()
{
WORD i, menuindex;
menuindex = NULL_OBJECT;
for (i = 0; i < screen_index; i++)
{
if (screen_list[i].objindex == LADDER_OBJ)
{
if ((mouser+scroll_baserow >= screen_list[i].u_row) && (mouser+scroll_baserow < screen_list[i].l_row)
&& (mousec >= screen_list[i].l_col) && (mousec < screen_list[i].r_col))
menuindex = i;
/* return LAST menuindex, so we can identify elements in a rung */
}
else
{
if ((mouser >= screen_list[i].u_row) && (mouser < screen_list[i].l_row)
&& (mousec >= screen_list[i].l_col) && (mousec < screen_list[i].r_col))
menuindex = i;
/* return LAST menuindex, so we can identify elements in a rung */
}
}
return(menuindex);
}
void bad_filesave(savefile,filename)
FILE savefile;
BYTE *filename;
{
BYTE answer[8];
BYTE header[64];
if (savefile != NO_FILE)
close(savefile);
unlink(filename);
sprintf(header,"Cannot save %s!",filename);
draw_popbox(header);
cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Press <enter> to continue",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 25) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
show_ladder();
}
void filesave(menuindex)
WORD menuindex;
{
BYTE filename[16], answer[8];
WORD i, j;
FILE savefile;
null_mouse_object();
draw_popbox("Save Ladder");
cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Filename ? ",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 11) * TEXTWIDTH, filename, 12,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
if (!filename[0])
{
show_ladder();
return;
}
for (i = 0; filename[i]; i++)
if (filename[i] == '.')
break;
if ((filename[i] == '\0') && (i <= 8))
strcat(filename,".LAD");
if ((savefile = open(filename,0)) != NO_FILE)
{
close(savefile);
draw_popbox(filename);
cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Overwrite this file (Y/N) ? ",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 28) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
erase_popbox();
if (toupper(answer[0]) != 'Y')
{
show_ladder();
return;
}
}
if ((savefile = creat(filename)) == NO_FILE)
return(bad_filesave(savefile,filename));
if (write(savefile,fileversion,FILEVERSION_LEN) != FILEVERSION_LEN)
return(bad_filesave(savefile,filename));
if (write(savefile,rungs,sizeof(rungs)) != sizeof(rungs))
return(bad_filesave(savefile,filename));
if (write(savefile,used_rungs,sizeof(used_rungs)) != sizeof(used_rungs))
return(bad_filesave(savefile,filename));
if (write(savefile,rung_list,sizeof(rung_list)) != sizeof(rung_list))
return(bad_filesave(savefile,filename));
if (write(savefile,&ladder_size,sizeof(ladder_size)) != sizeof(ladder_size))
return(bad_filesave(savefile,filename));
if (write(savefile,modbus_dataregs,sizeof(modbus_dataregs)) != sizeof(modbus_dataregs))
return(bad_filesave(savefile,filename));
if (close(savefile) == NO_FILE)
return(bad_filesave(-1,filename));
show_ladder();
dirty = FALSE;
}
void cleanup_dirty()
{
BYTE answer[8];
if (dirty)
{
draw_popbox("Ladder has been changed");
cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Save this ladder first (Y/N) ? ",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 31) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
erase_popbox();
if (toupper(answer[0]) == 'Y')
filesave();
}
}
void bad_fileload(loadfile,filename)
FILE loadfile;
BYTE *filename;
{
BYTE answer[8];
BYTE header[64];
if (loadfile != NO_FILE)
close(loadfile);
sprintf(header,"Cannot load %s!",filename);
draw_popbox(header);
cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Press <enter> to continue",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 25) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
newladder();
}
void fileload(menuindex)
WORD menuindex;
{
BYTE filename[16], answer[8];
WORD i, j;
FILE loadfile;
cleanup_dirty();
null_mouse_object();
draw_popbox("Load Ladder");
cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Filename ? ",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
getstr(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + (3 + 11) * TEXTWIDTH, filename, 12,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
erase_popbox();
if (!filename[0])
{
show_ladder();
return;
}
for (i = 0; filename[i]; i++)
if (filename[i] == '.')
break;
if ((filename[i] == '\0') && (i <= 8))
strcat(filename,".LAD");
if ((loadfile = open(filename,0)) == NO_FILE)
{
close(loadfile);
draw_popbox(filename);
cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"This file cannot be found",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
cstrout(POPBOX_ROW + 6 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Press <enter> to continue",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
getstr(POPBOX_ROW + 6 * TEXTHEIGHT, POPBOX_COL + (3 + 28) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
show_ladder();
return;
}
if (read(loadfile,tempstr,FILEVERSION_LEN) != FILEVERSION_LEN)
return(bad_filesave(loadfile,filename));
for (i = 0; i < FILEVERSION_LEN; i++)
if (tempstr[i] != fileversion[i])
break;
if (i != FILEVERSION_LEN)
{
close(loadfile);
draw_popbox(filename);
cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Unknown file format",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
cstrout(POPBOX_ROW + 4 * TEXTHEIGHT, POPBOX_COL + 3 * TEXTWIDTH,"Press <enter> to continue",POPBOX_FOREGROUND,POPBOX_BACKGROUND);
getstr(POPBOX_ROW + 6 * TEXTHEIGHT, POPBOX_COL + (3 + 28) * TEXTWIDTH, answer, 1,POPBOX_FOREGROUND,POPBOX_BACKGROUND);
show_ladder();
return;
}
dirty = FALSE; /* from here on, success or fail, we are "clean" */
if (read(loadfile,rungs,sizeof(rungs)) != sizeof(rungs))
return(bad_fileload(loadfile,filename));
if (read(loadfile,used_rungs,sizeof(used_rungs)) != sizeof(used_rungs))
return(bad_fileload(loadfile,filename));
if (read(loadfile,rung_list,sizeof(rung_list)) != sizeof(rung_list))
return(bad_fileload(loadfile,filename));
if (read(loadfile,&ladder_size,sizeof(ladder_size)) != sizeof(ladder_size))
return(bad_fileload(loadfile,filename));
if (read(loadfile,modbus_dataregs,sizeof(modbus_dataregs)) != sizeof(modbus_dataregs))
return(bad_fileload(loadfile,filename));
close(loadfile);
screen_index = NUM_MENU_ELEMENTS;
for (i = 0; i < MAX_RUNGS; i++)
{
if (used_rungs[i])
{
rungs[i].info.left_action = ladder_node_add;
rungs[i].info.right_action = ladder_node_del;
screen_list[screen_index++] = (struct element_info *)&rungs[i];
}
}
show_ladder();
}
void ladder_node_add(menuindex)
WORD menuindex;
{
WORD r, c;
WORD index;
WORD rung;
for (rung = 0; rung < MAX_RUNGS; rung++)
if ((used_rungs[rung])
&& (mouser+scroll_baserow >= rungs[rung].info.u_row) && (mouser+scroll_baserow < rungs[rung].info.l_row)
&& (mousec >= rungs[rung].info.l_col) && (mousec < rungs[rung].info.r_col))
break;
if (rung == MAX_RUNGS) /* can't find correct rung */
{
strout(500,500,"Oops! can't find rung! ");
return;
}
if ((index = (mousec - rungs[rung].info.l_col) / LADDER_ELEMENT_WIDTH) >= rungs[rung].num_elements)
{
strout(500,500,"1: Oops! index > ELEMENTS_PER_RUNG ");
return;
}
if (mouse_object == ORBRANCH_OBJ)
{
add_or_branch(rung,index);
show_ladder();
return;
}
if (mouse_object == EXPAND_OBJ)
{
expand_or_branch(rung,index);
show_ladder();
return;
}
#ifndef SIMPLE_ADDROW
if (mouse_object == ADDROW_OBJ)
{
null_mouse_object();
for (r = 0; r < ladder_size; r++)
if (rung_list[r] == rung)
break;
if (r != ladder_size) /* if a "root" rung */
addrow(r+1); /* add AFTER current rung */
show_ladder();
return;
}
if (mouse_object == DELROW_OBJ)
{
null_mouse_object();
return;
}
#endif
if (rungs[rung].node[index].objindex == NULL_OBJ)
{
if (mouse_object == NULL_OBJ)
return; /* nothing to drop */
rungs[rung].node[index].objindex = mouse_object;
}
else
null_mouse_object();
dirty = TRUE;
strout(r = rungs[rung].info.u_row-scroll_baserow,c = rungs[rung].info.l_col+TEXTWIDTH+index*LADDER_ELEMENT_WIDTH,rung_element);
(*objs[rungs[rung].node[index].objindex].drawfn)(r,c,&rungs[rung].node[index],GREEN,TEXTBACKGROUND);
(*objs[rungs[rung].node[index].objindex].initfn)(&rungs[rung].node[index]);
show_ladder();
}
void ladder_node_del(menuindex)
WORD menuindex;
{
WORD r, c;
WORD index;
WORD rung;
for (rung = 0; rung < MAX_RUNGS; rung++)
if ((used_rungs[rung])
&& (mouser+scroll_baserow >= rungs[rung].info.u_row) && (mouser+scroll_baserow < rungs[rung].info.l_row)
&& (mousec >= rungs[rung].info.l_col) && (mousec < rungs[rung].info.r_col))
break;
if (rung == MAX_RUNGS) /* can't find correct rung */
{
strout(500,500,"Oops! can't find rung! ");
null_mouse_object();
return;
}
if ((index = (mousec - rungs[rung].info.l_col) / LADDER_ELEMENT_WIDTH) >= rungs[rung].num_elements)
{
strout(500,500,"2: Oops! index > ELEMENTS_PER_RUNG ");
null_mouse_object();
return;
}
#ifndef SIMPLE_ADDROW
if (mouse_object == ADDROW_OBJ)
{
null_mouse_object();
for (r = 0; r < ladder_size; r++)
if (rung_list[r] == rung)
break;
if (r != ladder_size) /* if a "root" rung */
addrow(r); /* add BEFORE current rung */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -