Exemple #1
0
static void statsdisplay (short idstat, long n) {
	
	bigstring bs;
	
	getstatsstring (idstat, bs);
	
	pushstring ((ptrstring) "\x03" " = ", bs);
	
	pushlong (n, bs);
	
	statsline (bs);
	} /*statsdisplay*/
Exemple #2
0
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
Exemple #4
0
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;
	 	}
		 
	}
}