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; }
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; }