int GetValFromAsync(int pin){
	if(GetChannelMode(pin)== IS_SERVO){
		return GetServoPos(pin);
	}else{
		return getDataTableCurrentValue(pin);
	}
}
int GetDigitalValFromAsync(uint8_t pin){
	initAdvancedAsync();
	if(GetChannelMode(pin)==IS_DI || GetChannelMode(pin)==IS_COUNTER_INPUT_HOME || GetChannelMode(pin)==IS_COUNTER_OUTPUT_HOME ){
		return getDataTableCurrentValue(pin);
	}
	if(GetChannelMode(pin)== IS_SERVO){
		return GetServoPos(pin);
	}
	return 1;
}
示例#3
0
uint8_t getInterpolatedPin(uint8_t pin){
	if(GetChannelMode(pin)!=IS_SERVO){
		return 0;
	}
	//char cSREG;
	//cSREG = SREG;
	/* store SREG value */
	/*
	disable interrupts during timed sequence */
	//StartCritical();
	float ip = interpolate(&velocity[pin],getMs());
	//SREG = cSREG;
	boolean error = false;
	if(ip>(255- SERVO_BOUND)){
		println_W("Upper=");
		error = true;
	}
	if(ip<SERVO_BOUND){
		println_W("Lower=");
		error = true;
	}
	int dataTableSet = (getDataTableCurrentValue(pin)&0x000000ff);
	int interpolatorSet = ((int32_t)velocity[pin].set);
	float time = (float)((getDataTableCurrentValue(pin)>>16)&0x0000ffff);

	if(dataTableSet!=interpolatorSet){
//		println_W("Setpoint=");
//				error = true;
		SetServoPosDataTable( pin, dataTableSet,time);
	}
	if(error){
//		p_fl_W(ip);print_W(" on chan=");p_int_W(pin);print_W(" target=");p_int_W(interpolatorSet);
//		print_W(" Data Table=");p_int_W(dataTableSet);
//		println_W("set=      \t");p_fl_W(velocity[pin].set);
//		println_W("start=    \t");p_fl_W(velocity[pin].start);
//		println_W("setTime=  \t");p_fl_W(velocity[pin].setTime);
//		println_W("startTime=\t");p_fl_W(velocity[pin].startTime);
		ip=velocity[pin].set;
		SetServoPosDataTable(pin, dataTableSet,time);
	}
	int tmp = (int)ip;

	return tmp;
}
boolean pushAsyncReady( uint8_t pin){
	if(!IsAsync(pin)){
		//println_I("No asyinc on pin ");p_int_I(pin);print_I(" Mode 0x");prHEX8(GetChannelMode(pin),INFO_PRINT);
		return false; 
	}

	int32_t last;
	int32_t aval;
	int32_t db;
	//int i=pin;
	//EndCritical();

//	println_I("Checking timer \nMsTime: ");p_fl_I(tRef->MsTime);
//	print_I(" \nSetpoint: ");p_fl_I(tRef->setPoint);
//	print_I(" \nCurrentTime: ");p_fl_I(getMs());
	float timeout = RunEvery(getPinsScheduler( pin));
//	print_I(" \nTimeout: ");p_fl_I(timeout);
	if(GetChannelMode(pin)== IS_SERVO){
		aval = GetServoPos(pin);
	}else{
		aval = getDataTableCurrentValue(pin);
	}

	if(timeout !=0){
//		println_I("Time to do something");
		switch(getBcsIoDataTable(pin)->PIN.asyncDataType){
		case AUTOSAMP:
//			println_I("Auto samp ");p_int_I(pin);
			getBcsIoDataTable(pin)->PIN.asyncDataPreviousVal = aval;

			return true; 
		case NOTEQUAL:
			//
			if(aval != getBcsIoDataTable(pin)->PIN.asyncDataPreviousVal){
				//println_I("not equ ");p_int_I(pin);
				//print_I("\t");
				//p_int_I(getBcsIoDataTable(pin)->PIN.asyncDataPreviousVal);
				//print_I("\t");
				//p_int_I(getBcsIoDataTable(pin)->PIN.currentValue);
				getBcsIoDataTable(pin)->PIN.asyncDataPreviousVal = aval;
				return true; 
			}
			break;
		case DEADBAND:
			last = getBcsIoDataTable(pin)->PIN.asyncDataPreviousVal;
			db = getBcsIoDataTable(pin)->PIN.asyncDatadeadBandval;

			if(!bound(last,aval,db,db)){
				//println_I("deadband");p_int_I(pin);
				getBcsIoDataTable(pin)->PIN.asyncDataPreviousVal=aval;
				return true; 
			}
			break;
		case THRESHHOLD:
			//println_I("treshhold");p_int_I(pin);
			last = getBcsIoDataTable(pin)->PIN.asyncDataPreviousVal;
			db = getBcsIoDataTable(pin)->PIN.asyncDatathreshholdval;

			if(getBcsIoDataTable(pin)->PIN.asyncDatathreshholdedge == ASYN_RISING || getBcsIoDataTable(pin)->PIN.asyncDatathreshholdedge == ASYN_BOTH){
				if(last<= db && aval>db){
					getBcsIoDataTable(pin)->PIN.asyncDataPreviousVal = aval;
					return true; 
				}
			}
			if(getBcsIoDataTable(pin)->PIN.asyncDatathreshholdedge == ASYN_FALLING|| getBcsIoDataTable(pin)->PIN.asyncDatathreshholdedge == ASYN_BOTH){
				if(last> db && aval<=db){
					getBcsIoDataTable(pin)->PIN.asyncDataPreviousVal = aval;
					return true; 
				}
			}
			break;
		default:
			println_E("\nNo type defined!! chan: ");p_int_E(pin);
			print_E(" mode: ");printMode(pin,GetChannelMode(pin),ERROR_PRINT);
			print_E(" type: ");printAsyncType(pin,ERROR_PRINT);
			startAdvancedAsyncDefault(pin);
			break;
		}
	}else{
//		println_I("Nothing to do, returning");
	}
	return false; 
}