/**************************************************************************
	Description: Ôóíêöèè äëÿ ïðè¸ìà è âûäà÷è ïàðàìåòðîâ.

	Àâòîð: Óëèòîâñêèé Ä.È.
	Äàòà ïîñëåäíåãî îáíîâëåíèÿ: 2021.11.08
**************************************************************************/


#include "def.h"
#include "param.h"


#pragma CODE_SECTION(input_param, "ramfuncs");
#pragma CODE_SECTION(output_param, "ramfuncs");


extern short test_param(void);
extern void process_sgm_parameters(void);


// Èçìåíÿåò çíà÷åíèå ïàðàìåòðà
void input_param(unsigned short num, unsigned short val) {
	switch ( num ) {
	case 180://rf.PsiZ, %*10 îò PSI_BAZ
		if ( (val <= 2000) && (val != param[num]) ) {
			param[num] = val;
			rf.PsiZ = (float)val*0.001;//%*10 -> o.e.
			eprom.writeRequestNumber += 1;
		}
		break;
	case 200://offset.Ia1, åä. ÀÖÏ
		if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) {
			offset.Ia1 = param[num] = val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 201://offset.Ib1, åä. ÀÖÏ
		if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) {
			offset.Ib1 = param[num] = val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 202://offset.Ic1, åä. ÀÖÏ
		if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) {
			offset.Ic1 = param[num] = val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 203://offset.Udc1, åä. ÀÖÏ
		if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) {
			offset.Udc1 = param[num] = val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 206://offset.Ia2, åä. ÀÖÏ
		if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) {
			offset.Ia2 = param[num] = val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 207://offset.Ib2, åä. ÀÖÏ
		if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) {
			offset.Ib2 = param[num] = val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 208://offset.Ic2, åä. ÀÖÏ
		if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) {
			offset.Ic2 = param[num] = val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 209://offset.Udc2, åä. ÀÖÏ
		if ( (val >= 1748) && (val <= 4096) && (val != param[num]) ) {
			offset.Udc2 = param[num] = val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 210://cc.Kp, %
		if ( (val <= 5000) && (val != param[num]) ) {
			param[num] = val;
			cc.Kp = (float)val*cc.KpOrig;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 211://cc.Ki, %
		if ( (val <= 5000) && (val != param[num]) ) {
			param[num] = val;
			cc.Ki = (float)val*cc.KiOrig;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 212://cf.Kp, %
		if ( (val <= 5000) && (val != param[num]) ) {
			param[num] = val;
			cf.Kp = (float)val*cf.KpOrig;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 213://cf.Ki, %
		if ( (val <= 5000) && (val != param[num]) ) {
			param[num] = val;
			cf.Ki = (float)val*cf.KiOrig;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 214://csp.Kp, %
		if ( (val <= 5000) && (val != param[num]) ) {
			param[num] = val;
			csp.Kp = (float)val*csp.KpOrig;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 215://csp.Ki, %
		if ( (val <= 5000) && (val != param[num]) ) {
			param[num] = val;
			csp.Ki = (float)val*csp.KiOrig;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 220://protect.IacMax, % îò IAC_SENS_MAX
		if ( (val <= 99) && (val != param[num]) ) {
			param[num] = val;
			protect.IacMax = (short)(2047.*(float)val*0.01);//% -> åä. ÀÖÏ
			protect.IacMin = -protect.IacMax;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 221://protect.UdcMax, % îò U_NOM
		if ( (val <= 136) && (val != param[num]) ) {
			param[num] = val;
			protect.UdcMax = (float)val*0.01;//% -> o.e.
			eprom.writeRequestNumber += 1;
		}
		break;
	case 222://IzLim, % îò I_BAZ
		if ( (val <= 200) && (val != param[num]) ) {
			param[num] = val;
			IzLim = (float)val*0.01;//% -> o.e.
			eprom.writeRequestNumber += 1;
		}
		break;
	case 223://cf.IdLim, % îò I_BAZ
		if ( (val <= 200) && (val != param[num]) ) {
			param[num] = val;
			cf.IdLim = (float)val*0.01;//% -> o.e.
			cf.IdLimNeg = cf.IdLim*(-0.4);
			eprom.writeRequestNumber += 1;
		}
		break;
	case 224://csp.IqLim, % îò I_BAZ
		if ( (val <= 200) && (val != param[num]) ) {
			param[num] = val;
			csp.IqLim = (float)val*0.01;//% -> o.e.
			csp.IqLimNeg = -csp.IqLim;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 225://protect.UdcMin, % îò U_NOM
		if ( (val <= 110) && (val != param[num]) ) {
			param[num] = val;
			protect.UdcMin = (float)val*0.01;//% -> o.e.
			eprom.writeRequestNumber += 1;
		}
		break;
	case 226://protect.WmMax, % îò N_NOM
		if ( (val <= 200) && (val != param[num]) ) {
			param[num] = val;
			protect.WmMax = (float)val*0.01;//% -> o.e.
			eprom.writeRequestNumber += 1;
		}
		break;
	case 228://rf.WmNomPsi, % îò N_NOM
		if ( (val <= 200) && (val != param[num]) ) {
			param[num] = val;
			rf.WmNomPsi = (float)val*0.01;//% -> o.e.
			eprom.writeRequestNumber += 1;
		}
		break;
	case 229://rf.YlimPsi, % îò Y_LIM
		if ( (val <= 101) && (val != param[num]) ) {
			param[num] = val;
			rf.YlimPsi = (float)val*0.01*Y_LIM;//% -> åä. ñ÷¸ò÷èêà òàéìåðà
			eprom.writeRequestNumber += 1;
		}
		break;
	case 231://protect.TudcMin, ìñ
		if ( (val >= 1) && (val <= 8500) && (val != param[num]) ) {
			param[num] = val;
			protect.TudcMin = (unsigned short)((float)val*0.001/TY);
			eprom.writeRequestNumber += 1;
		}
		break;
	case 233://protect.TwmMax, ìñ
		if ( (val >= 1) && (val <= 8500) && (val != param[num]) ) {
			param[num] = val;
			protect.TwmMax = (unsigned short)((float)val*0.001/TY);
			eprom.writeRequestNumber += 1;
		}
		break;
	case 244://rs.WlimIncr, ìñ
		if ( (val >= 1) && (val != param[num]) ) {
			param[num] = val;
			// èçì. íà 1.0 çà ñòîëüêî-òî ìñ
			rs.WlimIncr = 1.0*TY*DECIM_PSI_WM_PM/((float)val*0.001);
			eprom.writeRequestNumber += 1;
		}
		break;
	case 245://csp.IlimIncr, ìñ
		if ( (val >= 1) && (val != param[num]) ) {
			param[num] = val;
			// èçì. íà I_BAZ çà ñòîëüêî-òî ìñ
			csp.IlimIncr = 1.0*TY*DECIM_PSI_WM_PM/((float)val*0.001);
			eprom.writeRequestNumber += 1;
		}
		break;
	case 248://rp.PlimIncr, ìñ
		if ( (val >= 1) && (val != param[num]) ) {
			param[num] = val;
			// èçì. íà 1.0 çà ñòîëüêî-òî ìñ
			rp.PlimIncr = 1.0*TY*DECIM_PSI_WM_PM/((float)val*0.001);
			eprom.writeRequestNumber += 1;
		}
		break;
	case 269://KmeCorr, %*100
		if ( (val >= 5000) && (val <= 20000) && (val != param[num]) ) {
			param[num] = val;
			KmeCorr = (float)val*0.0001;//%*100 -> o.e.
			eprom.writeRequestNumber += 1;
		}
		break;
	case 285://Kudc, ìñ*10
		if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) {
			param[num] = val;
			Kudc = (TY*10000.)/(float)val;
			if ( Kudc > 1.0 )
				Kudc = 1.0;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 286://Kwm, ìñ*10
		if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) {
			param[num] = val;
			Kwm = (TY*10000.)/(float)val;
			if ( Kwm > 1.0 )
				Kwm = 1.0;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 288://rs.Kwmz, ìñ
		if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) {
			param[num] = val;
			rs.Kwmz = (TY*DECIM_PSI_WM_PM*1000.)/(float)val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 289://rf.Kpsiz, ìñ
		if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) {
			param[num] = val;
			rf.Kpsiz = (TY*DECIM_PSI_WM_PM*1000.)/(float)val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 290://Kme, ìñ
		if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) {
			param[num] = val;
			Kme = (TY*1000.)/(float)val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 292://rp.Kpmz, ìñ
		if ( (val >= 1) && (val <= 20000) && (val != param[num]) ) {
			param[num] = val;
			rp.Kpmz = (TY*DECIM_PSI_WM_PM*1000.)/(float)val;
			eprom.writeRequestNumber += 1;
		}
		break;
	case 303://sgmPar.Rs, ìêÎì
		if ( val != param[num] ) {
			param[num] = val;
			sgmPar.Rs = (float)val*1e-6;//ìêÎì -> Îì
			eprom.writeRequestNumber += 1;
		}
		break;
	case 304://sgmPar.Lls, ìêÃí*10
		if ( val != param[num] ) {
			param[num] = val;
			sgmPar.Lls = (float)val*1e-7;//ìêÃí*10 -> Ãí
			process_sgm_parameters();
			eprom.writeRequestNumber += 1;
		}
		break;
	case 305://sgmPar.Rr, ìêÎì
		if ( val != param[num] ) {
			param[num] = val;
			sgmPar.Rr = (float)val*1e-6;//ìêÎì -> Îì
			process_sgm_parameters();
			eprom.writeRequestNumber += 1;
		}
		break;
	case 306://sgmPar.Llr, ìêÃí*10
		if ( val != param[num] ) {
			param[num] = val;
			sgmPar.Llr = (float)val*1e-7;//ìêÃí*10 -> Ãí
			process_sgm_parameters();
			eprom.writeRequestNumber += 1;
		}
		break;
	case 307://sgmPar.Lm, ìêÃí
		if ( val != param[num] ) {
			param[num] = val;
			sgmPar.Lm = (float)val*1e-6;//ìêÃí -> Ãí
			process_sgm_parameters();
			eprom.writeRequestNumber += 1;
		}
		break;
	default:
		if ( num < PAR_NUMBER ) {
			param[num] = val;
		}
		break;
	} //switch ( num )
} //void input_param(unsigned short num, unsigned short val)



// Âûäà¸ò çíà÷åíèå ïàðàìåòðà
unsigned short output_param(unsigned short num) {
	static unsigned short output;

	switch ( num ) {
	case 1: //udc1, o.e. -> o.e.*CONTROLLER_GAIN
		if ( state == STATE_SHUTDOWN ) {
			output = (unsigned short)(emerg.udc1*CONTROLLER_GAIN);
		}
		else {
			output = (unsigned short)(out.udc1*CONTROLLER_GAIN);
		}
		break;
	case 2: //udc2, o.e. -> o.e.*CONTROLLER_GAIN
		if ( state == STATE_SHUTDOWN ) {
			output = (unsigned short)(emerg.udc2*CONTROLLER_GAIN);
		}
		else {
			output = (unsigned short)(out.udc2*CONTROLLER_GAIN);
		}
		break;
	case 5: //iac1, o.e. -> o.e.*CONTROLLER_GAIN
		if ( state == STATE_SHUTDOWN ) {
			output = (unsigned short)(emerg.iac1*CONTROLLER_GAIN);
		}
		else {
			output = (unsigned short)(out.iac1*CONTROLLER_GAIN);
		}
		break;
	case 6: //iac2, o.e. -> o.e.*CONTROLLER_GAIN
		if ( state == STATE_SHUTDOWN ) {
			output = (unsigned short)(emerg.iac2*CONTROLLER_GAIN);
		}
		else {
			output = (unsigned short)(out.iac2*CONTROLLER_GAIN);
		}
		break;
	case 7: //me, o.e. -> (o.e. + CONTROLLER_BIAS)*CONTROLLER_GAIN
		if ( state == STATE_SHUTDOWN ) {
			if ( emerg.me > CONTROLLER_BIAS )
				output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else if ( emerg.me > -CONTROLLER_BIAS )
				output = (unsigned short)((emerg.me + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else
				output = 0;
		}
		else {
			if ( out.me > CONTROLLER_BIAS )
				output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else if ( out.me > -CONTROLLER_BIAS )
				output = (unsigned short)((out.me + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else
				output = 0;
		}
		break;
	case 8: //nm, o.e. -> (o.e. + CONTROLLER_BIAS)*CONTROLLER_GAIN
		if ( state == STATE_SHUTDOWN ) {
			if ( emerg.wm > CONTROLLER_BIAS )
				output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else if ( emerg.wm > -CONTROLLER_BIAS )
				output = (unsigned short)((emerg.wm + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else
				output = 0;
		}
		else {
			if ( out.wm > CONTROLLER_BIAS )
				output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else if ( out.wm > -CONTROLLER_BIAS )
				output = (unsigned short)((out.wm + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else
				output = 0;
		}
		break;
	case 9: //pm, o.e. -> (o.e. + CONTROLLER_BIAS)*CONTROLLER_GAIN
		if ( state == STATE_SHUTDOWN ) {
			if ( emerg.pm > CONTROLLER_BIAS )
				output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else if ( emerg.pm > -CONTROLLER_BIAS )
				output = (unsigned short)((emerg.pm + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else
				output = 0;
		}
		else {
			if ( out.pm > CONTROLLER_BIAS )
				output = (unsigned short)((CONTROLLER_BIAS + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else if ( out.pm > -CONTROLLER_BIAS )
				output = (unsigned short)((out.pm + CONTROLLER_BIAS)*CONTROLLER_GAIN);
			else
				output = 0;
		}
		break;
	case 10: //compound
		output = faultNo + (inuWork<<7);
		break;
	default:
		output = param[num];
		break;
	} //switch ( num )
	return output;
} //unsigned short output_param(unsigned short num)