Open DevShivmohan opened 1 year ago
/*
* ============================================================================
* Copyright (c) 2019 Lattice Innovation.
* Created : 9/7/19 12:23 PM
* Modified : 9/7/19 12:23 PM
* Author : Anuj Pathak
* ============================================================================
*/
package com.lattice.spectrum.ModeLibrary.Managers.ElementryManagers;
import com.lattice.spectrum.ComLibrary.ComLib;
import com.lattice.spectrum.ComLibrary.MsgHandler.RxListener;
import com.lattice.spectrum.ComLibrary.utility.sLog;
import com.lattice.spectrum.ComLibrary.utility.ufx;
import com.lattice.spectrum.ModeLibrary.Managers.run.ModeEvent;
import com.lattice.spectrum.ModeLibrary.Managers.run.ModeListener;
import com.lattice.spectrum.ModeLibrary.ModeProp.AuxProp;
import com.lattice.spectrum.ModeLibrary.ModeProp.ModeProp;
import com.lattice.spectrum.ModeLibrary.ModeProp.type.OperationMode;
import com.lattice.spectrum.ModeLibrary.ModeProp.type.TotalizerMode;
import org.lattice.spectrum_backend_final.dao.constants.AlarmConstants;
import org.lattice.spectrum_backend_final.dao.constants.ApiConstant;
import org.lattice.spectrum_backend_final.dao.manager.livedata.LiveDataManager;
import static com.lattice.spectrum.ComLibrary.StaticDefinitions.ScaleID.FEED_SCALE;
import static com.lattice.spectrum.ComLibrary.StaticDefinitions.ScaleID.PERMEATE_SCALE;
/**
* used in D and CFC mode to maintain feed wt
* detect feed to empty
*/
public class FeedWtManger {
/**
*
*/
private static FeedWtManger feedWtManger;
private double auxPumpFlowRate;
private boolean startFlag;
private long auxPumpInitCounter;
private boolean isAuxInitStarted;
public static FeedWtManger get() {
if (feedWtManger == null) {
feedWtManger = new FeedWtManger();
}
return feedWtManger;
}
/**
*
*/
private int auxId;
private AuxProp auxProp;
private double feedStartWt;
private ModeListener superCallback;
private ModeProp modeProp;
public void start(AuxProp prop, ModeListener superCallback, double feedStartWt, int auxID, TotalizerMode totalizerMode,ModeProp... modeProps) {
this.auxProp = prop;
this.superCallback = superCallback;
this.feedStartWt = feedStartWt;
this.auxId = auxID;
if(modeProps.length>0)
this.modeProp=modeProps[0];
else if(modeProp!=null)
modeProp.setStageId(9);
auxPumpInitCounter=0;
isAuxInitStarted=true;
if(totalizerMode == TotalizerMode.ENDPOINT){
feedWtKonduitListener.startRxListening();
}else {
feedWtListener.startRxListening();
}
sLog.d(this, "Improved log Start Endpoint type " + totalizerMode);
startFlag =false;
}
public void stop() {
feedWtListener.stopRxListening();
feedWtKonduitListener.stopRxListening();
ComLib.get().getAuxPump().setAuxPumpRPM(auxId, auxProp.getTypeID(), 0);
this.auxPumpInitCounter=0;
isAuxInitStarted=false;
sLog.d(this, " Stop" );
}
private final RxListener feedWtListener = new RxListener(ComLib.get().getScaleInfo()) {
private final double kp = 0.25;
private final double kd = 0.25;
private final double ki = 0.0125;
private double errConstant, lastErr;
private int feedEmptyCounter;
private double lastTotalScaleWt;
private boolean isFeedEmptyDetected;
@Override
public void reset() {
isFeedEmptyDetected=false;
errConstant = 0;
lastErr = 0;
feedEmptyCounter = 0;
lastTotalScaleWt = ComLib.get().getScaleInfo().scaleReading_gm(FEED_SCALE) + ComLib.get().getScaleInfo().scaleReading_gm(PERMEATE_SCALE);
}
@Override
public void OnReceive() {
double fw = ComLib.get().getScaleInfo().scaleReading_gm(FEED_SCALE);
if(fw<feedStartWt){
startFlag=true;
}
if(startFlag) {
double feedErr = (feedStartWt - fw);
double errRate = feedErr - lastErr;
lastErr = feedErr;
errConstant += feedErr;
if (fw >= feedStartWt)
errConstant = 0;
auxPumpFlowRate = (kp * feedErr + kd * errRate + ki * errConstant) * 60;
int auxPumpRPM = (int) ufx.boundInRange(auxPumpFlowRate * 100 / auxProp.getTubeFlowConversion(), 0, auxProp.getMaxRPM());
ComLib.get().getAuxPump().setAuxPumpRPM(auxId, auxProp.getTypeID(), auxPumpRPM);
if(isAuxInitStarted)
auxPumpInitCounter++;
if(auxPumpInitCounter>10){
isAuxInitStarted=false;
if(ComLib.get().getAuxPump().curAuxRPM(auxId)==0 && auxPumpRPM>0){
ComLib.get().getAuxPump().setAuxPumpRPM(auxId, auxProp.getTypeID(), 0);
isAuxInitStarted=true;
auxPumpInitCounter=0;
}
}
sLog.d(this, " feed Wt - " + feedStartWt+" ,aux RPM actual ="+ComLib.get().getAuxPump().curAuxRPM(auxId)+" , auxPumpRPM="+auxPumpRPM+" , isAuxInitStarted="+isAuxInitStarted+" ,auxPumpInitCounter="+auxPumpInitCounter+", auxConnected="+ComLib.get().getAuxPump().isAuxConnected(auxId)+", actualFeedScale="+ComLib.get().getScaleInfo().scaleReading_gm(FEED_SCALE));
sLog.d(this,"feedWeightOverrideOrNot="+LiveDataManager.getInstance().getFeedWeightOverrideOrNot());
double totalScaleWt = LiveDataManager.getInstance().getChangeAbleFeedWeight() + ComLib.get().getScaleInfo().scaleReading_gm(PERMEATE_SCALE);
sLog.d(FeedWtManger.this, auxPumpRPM + ">"+(0.5 * auxProp.getMaxRPM())
+ " & " + totalScaleWt + ">" + 1.12 * LiveDataManager.getInstance().getFeedWeightOverrideOrNot()
+ " & " + (totalScaleWt - lastTotalScaleWt) + "<" + (auxPumpRPM * auxProp.getTubeFlowConversion() / (400 * 60)));
if (LiveDataManager.getInstance().isVisited() && (auxPumpRPM > 0.5 * auxProp.getMaxRPM())
&& ((totalScaleWt) > 1.12 * LiveDataManager.getInstance().getFeedWeightOverrideOrNot())
&& ((totalScaleWt - lastTotalScaleWt) < auxPumpRPM * auxProp.getTubeFlowConversion() / (400 * 60))) {
feedEmptyCounter++;
sLog.d(FeedWtManger.this, "Feed to empty counter-"+feedEmptyCounter);
if (feedEmptyCounter > 9) {
sLog.d(FeedWtManger.this, "Feed to empty detected");
// in CFC mode stop
if(modeProp!=null && modeProp.getSubRunModeProp(0).getMode()==OperationMode.CF_MODE && modeProp.getStageId()==0){
stop();
superCallback.callback(ModeEvent.FEED_TO_EMPTY_DETECTED);
}else {
// except CFC mode
isFeedEmptyDetected = true;
ComLib.get().getPumpAlarmIndicatorHandler().send(2, AlarmConstants.FEED_TO_EMPTY_DETECTED);
superCallback.callback(ModeEvent.FEED_TO_EMPTY_DETECTED);
}
}
} else {
feedEmptyCounter = 0;
if (isFeedEmptyDetected) {
isFeedEmptyDetected = false;
ComLib.get().getPumpAlarmIndicatorHandler().send(1, ApiConstant.BLANK_QUOTE);
}
}
lastTotalScaleWt = totalScaleWt;
}
}
};
private final RxListener feedWtKonduitListener = new RxListener(ComLib.get().getKonduitInfo()) {
private final double kp = 0.25;
private final double kd = 0.25;
private final double ki = 0.0125;
private double errConstant, lastErr;
private int feedEmptyCounter;
private double lastTotalScaleWt;
private boolean isFeedEmptyDetected;
@Override
public void reset() {
isFeedEmptyDetected=false;
errConstant = 0;
lastErr = 0;
feedEmptyCounter = 0;
lastTotalScaleWt = ComLib.get().getScaleInfo().scaleReading_gm(FEED_SCALE) +FlowMeterManager.get().getVolume(0);
}
@Override
public void OnReceive() {
double fw = ComLib.get().getScaleInfo().scaleReading_gm(FEED_SCALE);
if(fw<feedStartWt){
startFlag=true;
}
if(startFlag) {
double feedErr = (feedStartWt - fw);
double errRate = feedErr - lastErr;
lastErr = feedErr;
errConstant += feedErr;
if (fw >= feedStartWt)
errConstant = 0;
auxPumpFlowRate = (kp * feedErr + kd * errRate + ki * errConstant) * 60;
int auxPumpRPM = (int) ufx.boundInRange(auxPumpFlowRate * 100 / auxProp.getTubeFlowConversion(), 0, auxProp.getMaxRPM());
ComLib.get().getAuxPump().setAuxPumpRPM(auxId, auxProp.getTypeID(), auxPumpRPM);
if(isAuxInitStarted)
auxPumpInitCounter++;
if(auxPumpInitCounter>10){
isAuxInitStarted=false;
if(ComLib.get().getAuxPump().curAuxRPM(auxId)==0 && auxPumpRPM>0){
ComLib.get().getAuxPump().setAuxPumpRPM(auxId, auxProp.getTypeID(), 0);
isAuxInitStarted=true;
auxPumpInitCounter=0;
}
}
sLog.d(this, " feed Wt - " + feedStartWt+" ,aux RPM actual ="+ComLib.get().getAuxPump().curAuxRPM(auxId)+" , auxPumpRPM="+auxPumpRPM+" , isAuxInitStarted="+isAuxInitStarted+" ,auxPumpInitCounter="+auxPumpInitCounter+", actualFeedScale="+ComLib.get().getScaleInfo().scaleReading_gm(FEED_SCALE));
sLog.d(this,"feedWeightOverrideOrNot="+LiveDataManager.getInstance().getFeedWeightOverrideOrNot());
double totalScaleWt = LiveDataManager.getInstance().getChangeAbleFeedWeight() + FlowMeterManager.get().getVolume(0);
sLog.d(FeedWtManger.this, auxPumpRPM + ">"+(0.5 * auxProp.getMaxRPM())
+ " & " + totalScaleWt + ">" + 1.12 * LiveDataManager.getInstance().getFeedWeightOverrideOrNot()
+ " & " + (totalScaleWt - lastTotalScaleWt) + "<" + (auxPumpRPM * auxProp.getTubeFlowConversion() / (400 * 60)));
if (LiveDataManager.getInstance().isVisited() && (auxPumpRPM > 0.5 * auxProp.getMaxRPM())
&& ((totalScaleWt) > 1.12 * LiveDataManager.getInstance().getFeedWeightOverrideOrNot())
&& ((totalScaleWt - lastTotalScaleWt) < auxPumpRPM * auxProp.getTubeFlowConversion() / (400 * 60))) {
feedEmptyCounter++;
if (feedEmptyCounter > 9) {
sLog.d(FeedWtManger.this, "Feed to empty detected");
// in CFC and CFCDC mode stop
if(modeProp!=null && modeProp.getSubRunModeProp(0).getMode()==OperationMode.CF_MODE && modeProp.getStageId()==0){
stop();
superCallback.callback(ModeEvent.FEED_TO_EMPTY_DETECTED);
}else {
// except CFC mode
isFeedEmptyDetected = true;
ComLib.get().getPumpAlarmIndicatorHandler().send(2, AlarmConstants.FEED_TO_EMPTY_DETECTED);
superCallback.callback(ModeEvent.FEED_TO_EMPTY_DETECTED);
}
}
} else {
feedEmptyCounter = 0;
if (isFeedEmptyDetected) {
isFeedEmptyDetected = false;
ComLib.get().getPumpAlarmIndicatorHandler().send(1, ApiConstant.BLANK_QUOTE);
}
}
lastTotalScaleWt = totalScaleWt;
}
}
};
public double getAuxPumpFlowRate() {
return auxPumpFlowRate;
}
}
public static String checkPalindrome(String string){
StringBuilder stringBuilder=new StringBuilder();
for(char ch:string.toCharArray())
if(Character.isAlphabetic(ch))
stringBuilder.append(ch);
return stringBuilder.toString().equalsIgnoreCase(stringBuilder.reverse().toString()) ? "Palindrome":"Not Palindrome";
}
Shivmohan important drive link -
Six semester doc - Link
Updated resume link - Shiv_resume
DSA learning and interview questions docs - Link
Irctc-tickets - Shiv personal docs