static void statsdisplay (short idstat, long n) { bigstring bs; getstatsstring (idstat, bs); pushstring ((ptrstring) "\x03" " = ", bs); pushlong (n, bs); statsline (bs); } /*statsdisplay*/
boolean getuntitledfilename (bigstring bs) { /* 5.0d6 dmb: added numeric sequencing */ static long untitledsequencer = 0; if (!getstringlist (defaultlistnumber, untitledfilename, bs)) return (false); if (++untitledsequencer > 1) { pushchar ('-', bs); pushlong (untitledsequencer, bs); } return (true); } /*getuntitledfilename*/
boolean getuntitledfilename (bigstring bs) { // // 2006-09-15 creedon; push space character instead of dash // // 5.0d6 dmb: added numeric sequencing // static long untitledsequencer = 0; if (!getstringlist (defaultlistnumber, untitledfilename, bs)) return (false); if (++untitledsequencer > 1) { pushchar ( ' ', bs ); pushlong (untitledsequencer, bs); } return (true); } // getuntitledfilename
S16_T exec_program(S16_T current_prg, U8_T *prog_code) { Point p_var; Point_Net point_net; S16_T val1, val2, step; S16_T nbytes; // S32_T *i_stack, *idecl_stack; // S16_T ind, i, j; S16_T i; S16_T id, len, /*nprog, ndeclare ,*/nitem, lvar; S8_T then_else; S8_T ana_dig; S8_T *return_pointer, /**decl_prog,*/ *p_buf, *p, *q; U32_T r; U8_T type_var; S32_T value, v1, v2; U8_T *local; // S16_T r_ind_remote; // Program_remote_points /**r_remote,*/ *remote_local_list; S16_T ind_remote_local_list; S32_T tempval = 0; then_else = alarm_flag /*= error_flag*/ = 0; prog = (U8_T *)prog_code; /* if (called_program) { if (*(prog+2+3)!=DECLARE) return 1; } else */ index_stack = stack; memcpy(&nbytes, prog, 2); nbytes = mGetPointWord2(nbytes); // add by chelsea prog += nbytes+2+3; memcpy(&nbytes, prog, 2); /*LOCAL VARIABLES*/ nbytes = mGetPointWord2(nbytes); // add by chelsea local = (prog+2); prog += 2 + nbytes; memcpy(&nbytes, prog, 2); nbytes = mGetPointWord2(nbytes); // add by chelsea prog += 2; p_buf = (S8_T*)prog + nbytes; time_buf = (S8_T*)prog; memcpy(&ind_remote_local_list,prog+nbytes,2); ind_remote_local_list = mGetPointWord2(ind_remote_local_list); // remote_local_list = (Program_remote_points*)(prog+nbytes+2); /* memcpy(remote_local_list,prog+nbytes+2,ind_remote_local_list*sizeof(Remote_local_list));*/ while( (S8_T*)prog < p_buf) { cond = (int)veval_exp( local ); pn = (S32_T *)(prog + 1); if(cond) { if(*prog++) { if(just_load) *pn = 0; (*pn) += miliseclast_cur; } else { *(prog-1) = 1; *pn = 0; } } else if(*prog++) { *(prog-1) = 0; *pn = 0; } else { if(just_load) *pn = 0; (*pn) += miliseclast_cur; } prog += 4; } prog = (U8_T *)prog_code; p_buf = (S8_T*)prog; memcpy(&nbytes, prog, 2); nbytes = mGetPointWord2(nbytes); // add by chelsea // g_ind_remote_local_list = ind_remote_local_list; // g_remote_local_list = remote_local_list; p_buf += 2; prog += 2; prog = prog + *(prog + nbytes + 1); // alarm_at_all = OFF; // ind_alarm_panel = 0; // timeout = 0; while(*prog != 0xfe) { // if (timeout==8) // { // //programs[current_prg].errcode = 1; tested by chelsea // break; // } lvar = 0; if(!then_else) { if (*prog!=0x01) { /* printf("ERROR!!!!!!Virtual!!!!!!!!!!!!!!\n"); */ /* exit(1);*/ return -1; } prog++; /* step over 01*/ /* memcpy(&cur_line, prog, 2);*/ prog += 2; } else if (*prog==0x01) { then_else = 0; continue; } switch (*prog++) { case ASSIGN: case ASSIGNAR: case ASSIGNARRAY_1: case ASSIGNARRAY_2: case STARTPRG: case OPEN: case ENABLEX: case STOP: case CLOSE: case DISABLEX: Test[10] = 6; id = *(prog-1); if (id == ASSIGN || id == ASSIGNAR) ana_dig=ANALOG; else ana_dig=DIGITAL; if (*prog >= LOCAL_VARIABLE && *prog <= STRING_TYPE_ARRAY) { type_var = LOCAL; p = prog; prog++; prog += 2; } else if (*prog == LOCAL_POINT_PRG) { prog++; type_var = LOCAL_POINT_PRG; p_var = *((Point *)prog); prog += sizeof(Point); } else { if (*prog == REMOTE_POINT_PRG) { prog++; type_var = REMOTE_POINT_PRG; point_net = *((Point_Net *)prog); prog += sizeof(Point_Net); } } if ( id==OPEN ) { // if (type_var == LOCAL_POINT_PRG) // { // if ( p_var.point_type - 1 == GRP ) // { // *((Point *)&localopenscreen) = p_var; // localopenscreen.panel = Station_NUM-1; // localopenscreen.network_number = 0xFFFF; /*NetworkAddress;*/ // break; // } // } // if (type_var == REMOTE_POINT_PRG) // { // if ( point_net.point_type - 1 == GRP ) // { // localopenscreen = point_net; // break; // } // } } if (id==STARTPRG || id==OPEN || id==ENABLEX) { value = 1000L; Test[3] = 10; } if (id==STOP || id==CLOSE || id==DISABLEX) { value = 0L; Test[3] = 11;} if (id==ASSIGN) { value = veval_exp(local); if (type_var == LOCAL) { put_local_var(p,value,local); } } else if (id==ASSIGNARRAY_1) { v2 = 0; v1 = 1; v2 = veval_exp(local); value=veval_exp(local); put_local_array(p,value,v1,v2/1000L,local); } else if (id==ASSIGNARRAY_2) { v2 = 0; v1 = veval_exp(local); v2 = veval_exp(local); value=veval_exp(local); put_local_array(p,value,v1/1000L,v2/1000L,local); } else { if( id==ASSIGNAR ) { ana_dig = (int)(veval_exp(local)/1000)-1; value=veval_exp(local); } else { if (type_var == LOCAL) put_local_var(p,value,local); } } if (type_var == LOCAL_POINT_PRG) { Test[10]++; put_point_value( &p_var, &value, ana_dig, PROGR ); } break; // case PHONE: // len = *prog++; // i=0; // while(*prog!='\x1' && i<len) message[i++] = *prog++; // message[i]=0; // phone(message,i); // break; case REM: case DIM: case INTEGER_TYPE: case BYTE_TYPE: case STRING_TYPE: case LONG_TYPE: case FLOAT_TYPE: len = *prog++; prog += len; break; case PRINT: break; case CLEARX: /* clear all local variables to zero*/ /* for(ind=0;ind<MAX_VAR;ind++) local[ind]=0; */ break; case CLEARPORT: /*if( port >= 0 ) { Port_parameters[port].Length = Port_parameters[port].Index; }*/ break; case ENDPRG: return 1; /* end program*/ case RETURN: r = poplong(); prog = (S8_T *)r; break; case HANGUP: // handup(); /* end phone call*/ break; case SET_PRINTER: break; case RUN_MACRO: break; case ON: nitem = veval_exp(local); if (nitem < 1 || nitem > *(prog+1)) { while(*prog!='\x1') prog++; break; } if (*prog==GOSUB) /*gosub*/ { return_pointer = (S8_T *)prog + 2 + *(prog+1)*2; pushlong((S32_T)return_pointer); } memcpy(&i, prog + 2 + (nitem-1)*2, 2); i = mGetPointWord2(i); prog = (U8_T *)p_buf + i - 2; break; case GOSUB: return_pointer = (S8_T*)prog + 2 ; memcpy(&i, prog, 2); i = mGetPointWord2(i); prog = (U8_T *)p_buf + i - 2; pushlong((S32_T)return_pointer); break; case ON_ALARM: if (alarm_flag) { memcpy(&i, prog, 2); i = mGetPointWord2(i); prog = (U8_T *)p_buf + i - 2; alarm_flag=0; } else prog += 2; break; // case ON_ERROR: // if (error_flag) // { // memcpy(&i, prog, 2); // i = mGetPointWord2(i); // prog = (U8_T *)p_buf + i - 2; // error_flag=0; // } // else // prog += 2; // break; case GOTOIF: case GOTO: memcpy(&i, prog, 2); i = mGetPointWord2(i); prog = (U8_T *)p_buf + i - 2; break; case Alarm: break; case ALARM_AT: if (*prog==0xFF) { alarm_at_all = ON; prog++; } else { while(*prog) alarm_panel[ind_alarm_panel++]=*prog++; prog++; } break; // case PRINT_AT: // if (*prog==0xFF) // { //// alarm_at_all = ON; // prog++; // } // else // { //// while(*prog) //// print_panel[ind_print_panel++]=*prog++; // prog++; // } // break; // break; // case CALLB: // break; case DALARM: { alarm_flag = 0; cond = veval_exp(local); /* condition */ memcpy(&value,prog,4); /* delay time */ value = DoulbemGetPointWord2(value); prog += 4; len = *prog++; if (cond) /* test condition*/ { memcpy(message, prog, len); message[len]=0; prog += len; if(just_load) { memcpy(prog,&value,4); } memcpy(&v1,prog,4); v1 /= 1000; if( v1 > 0 ) { v1 -= miliseclast_cur; memcpy(prog, &v1, 4); } if (v1 <= 0) /* delayed time elapsed */ { // Test[40]++; i = generatealarm(message, current_prg+1, Station_NUM, VIRTUAL_ALARM, alarm_at_all, ind_alarm_panel, alarm_panel, 0); /*printAlarms=1*/ if ( i > 0 ) /* new alarm message*/ { alarm_flag = 1; } } } else { /* condition is false*/ memcpy(&v1,prog+len,4); v1 = DoulbemGetPointWord2(v1); if (v1<=0) /* test for restore*/ { memcpy(message, prog, len); message[len]=0; dalarmrestore(message,current_prg+1,Station_NUM); new_alarm_flag |= 0x01; /* send the alarm to the destination panels*/ #if 0 // TBD: resume(ALARMTASK); #endif } prog += len; memcpy(prog,&value,4); } prog += 4; } break; // case DECLARE: // break; // case REMOTE_GET: // { // } // break; // // case REMOTE_SET: // break; case FOR: p = prog; prog += 3; val1 = veval_exp(local); val2 = veval_exp(local); step = veval_exp(local); if(val2>=val1) { put_local_var(p,val1,local); prog += 2; /* interpret(); */ } else { memcpy(&lvar, prog, 2); lvar = mGetPointWord2(lvar); prog = p_buf + lvar - 2; } break; case NEXT: { memcpy(&lvar, prog, 2); lvar = mGetPointWord2(lvar); prog = p_buf + lvar - 2 + 4; p = prog; prog += 3; val1 = veval_exp(local); val2 = veval_exp(local); step = veval_exp(local); q = prog; prog = p; value=operand(NULL,local); /* veval_exp(local);*/ value += step; put_local_var(p,value,local); prog = q; if(value<=val2) { prog += 2; } else { memcpy(&lvar, prog, 2); lvar = mGetPointWord2(lvar); prog = p_buf + lvar - 2; } } break; case IF: then_else = 1; cond = veval_exp(local); if (cond) { prog++; // Test[20] = *prog; prog++; // Test[21] = *prog; } else { prog = (U8_T *)p_buf + mGetPointWord2(*((S16_T *)prog)) -2; if( *prog == 0x01 || *prog == 0xFE) /*TEST DACA EXISTA ELSE*/ then_else = 0; } break; case IFP: cond = veval_exp(local); if (cond) if (!*prog++) { *(prog-1) = 1; prog++; prog++; } else { prog = (U8_T *)p_buf + mGetPointWord2(*((S16_T *)prog)) -2; } else { *prog++ = 0; prog = (U8_T *)p_buf + mGetPointWord2(*((S16_T *)prog)) -2; } then_else = 1; if( *prog == 0x01 || *prog == 0xFE) /*TEST DACA EXISTA ELSE*/ then_else = 0; break; case IFM: cond = veval_exp(local); if (!cond) if (*prog++) { *(prog-1) = 0; prog++; prog++; } else { prog = (U8_T *)p_buf + mGetPointWord2(*((S16_T *)prog)) -2; } else { *prog++ = 1; prog = (U8_T *)p_buf + mGetPointWord2(*((S16_T *)prog)) -2; } then_else = 1; if( *prog == 0x01 || *prog == 0xFE) /*TEST DACA EXISTA ELSE*/ then_else = 0; break; case ELSE: /*prog++; prog = (U8_T *)p_buf + *((S16_T *)prog) -2;*/ prog++; prog = (U8_T *)p_buf + mGetPointWord2(*((S16_T *)prog)) -2; break; case WAIT: return_pointer = (S8_T *)prog-4; if (*prog==0xA1) { memcpy(&r,++prog,4); r = DoulbemGetPointWord2(r); prog += 4; } else { r = (U32_T)veval_exp(local); } memcpy(&value,prog,4); value = DoulbemGetPointWord2(value); value += miliseclast_cur; if (value/1000L >= r) { memset(prog,0,4); *((S16_T *)(p_buf + nbytes + 1))=0; // timeout = 0; } else { memcpy(prog,&value,4); *((S16_T *)(p_buf + nbytes + 1))=return_pointer-p_buf; return 1; } prog += 4; break; default : break; } } }