123

Dependencies:   mbed

Fork of LG by igor Apu

Revision:
183:c7a9c309086c
Parent:
177:672ef279c8e0
--- a/DevicePLCS.c	Sun Jul 10 05:35:08 2016 +0000
+++ b/DevicePLCS.c	Sun Jul 31 06:19:02 2016 +0000
@@ -4,6 +4,39 @@
 void InitPathLengthControlSystemDefaultSettings(void){
   device.plcs.feedback.settings.input = 1;
   device.plcs.feedback.settings.output = 0;
+  device.plcs.feedback.settings.transfer.points = 16;
+  device.plcs.feedback.settings.transfer.raw[0] = -0x20000; //-2.0
+  device.plcs.feedback.settings.transfer.normalized[0] = -0x10000; //-1.0
+  device.plcs.feedback.settings.transfer.raw[1] = -0x1bbbb; //-1.7333333333333334
+  device.plcs.feedback.settings.transfer.normalized[1] = -0xdddd; //-0.8666666666666667
+  device.plcs.feedback.settings.transfer.raw[2] = -0x17777; //-1.4666666666666668
+  device.plcs.feedback.settings.transfer.normalized[2] = -0xbbbb; //-0.7333333333333334
+  device.plcs.feedback.settings.transfer.raw[3] = -0x13333; //-1.2
+  device.plcs.feedback.settings.transfer.normalized[3] = -0x9999; //-0.6
+  device.plcs.feedback.settings.transfer.raw[4] = -0xeeee; //-0.9333333333333333
+  device.plcs.feedback.settings.transfer.normalized[4] = -0x7777; //-0.4666666666666667
+  device.plcs.feedback.settings.transfer.raw[5] = -0xaaaa; //-0.6666666666666667
+  device.plcs.feedback.settings.transfer.normalized[5] = -0x5555; //-0.33333333333333337
+  device.plcs.feedback.settings.transfer.raw[6] = -0x6666; //-0.3999999999999999
+  device.plcs.feedback.settings.transfer.normalized[6] = -0x3333; //-0.19999999999999996
+  device.plcs.feedback.settings.transfer.raw[7] = -0x2222; //-0.1333333333333333
+  device.plcs.feedback.settings.transfer.normalized[7] = -0x1111; //-0.06666666666666665
+  device.plcs.feedback.settings.transfer.raw[8] = 0x2222; //0.1333333333333333
+  device.plcs.feedback.settings.transfer.normalized[8] = 0x1111; //0.06666666666666665
+  device.plcs.feedback.settings.transfer.raw[9] = 0x6666; //0.3999999999999999
+  device.plcs.feedback.settings.transfer.normalized[9] = 0x3333; //0.19999999999999996
+  device.plcs.feedback.settings.transfer.raw[10] = 0xaaaa; //0.6666666666666665
+  device.plcs.feedback.settings.transfer.normalized[10] = 0x5555; //0.33333333333333326
+  device.plcs.feedback.settings.transfer.raw[11] = 0xeeee; //0.9333333333333331
+  device.plcs.feedback.settings.transfer.normalized[11] = 0x7777; //0.46666666666666656
+  device.plcs.feedback.settings.transfer.raw[12] = 0x13333; //1.2000000000000002
+  device.plcs.feedback.settings.transfer.normalized[12] = 0x9999; //0.6000000000000001
+  device.plcs.feedback.settings.transfer.raw[13] = 0x17777; //1.4666666666666668
+  device.plcs.feedback.settings.transfer.normalized[13] = 0xbbbb; //0.7333333333333334
+  device.plcs.feedback.settings.transfer.raw[14] = 0x1bbbb; //1.7333333333333334
+  device.plcs.feedback.settings.transfer.normalized[14] = 0xdddd; //0.8666666666666667
+  device.plcs.feedback.settings.transfer.raw[15] = 0x20000; //2.0
+  device.plcs.feedback.settings.transfer.normalized[15] = 0x10000; //1.0
   
   device.plcs.reference.settings.sequencer = 1;
   device.plcs.reference.settings.delta = 0;
@@ -45,106 +78,139 @@
   device.plcs.regulator.settings.transfer.error[15] = 0x8000; //0.5
   device.plcs.regulator.settings.transfer.correction[15] = -0x10000; //-1.0
 
-  device.plcs.reset.levels.upper = 0xc8000; //12.5V
-  device.plcs.reset.levels.lower = 0x18000; //1.5V
-  device.plcs.reset.up.points = 16;
-  device.plcs.reset.up.temperature[0] = -0x3c0000; //-60C
-  device.plcs.reset.up.voltage[0] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[0] = 0x30000; //3s
-  device.plcs.reset.up.temperature[1] = -0x320000; //-50C
-  device.plcs.reset.up.voltage[1] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[1] = 0x30000; //3s
-  device.plcs.reset.up.temperature[2] = -0x280000; //-40C
-  device.plcs.reset.up.voltage[2] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[2] = 0x30000; //3s
-  device.plcs.reset.up.temperature[3] = -0x1e0000; //-30C
-  device.plcs.reset.up.voltage[3] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[3] = 0x30000; //3s
-  device.plcs.reset.up.temperature[4] = -0x140000; //-20C
-  device.plcs.reset.up.voltage[4] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[4] = 0x30000; //3s
-  device.plcs.reset.up.temperature[5] = -0xa0000; //-10C
-  device.plcs.reset.up.voltage[5] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[5] = 0x30000; //3s
-  device.plcs.reset.up.temperature[6] = 0x0; //0C
-  device.plcs.reset.up.voltage[6] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[6] = 0x30000; //3s
-  device.plcs.reset.up.temperature[7] = 0xa0000; //10C
-  device.plcs.reset.up.voltage[7] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[7] = 0x30000; //3s
-  device.plcs.reset.up.temperature[8] = 0x140000; //20C
-  device.plcs.reset.up.voltage[8] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[8] = 0x30000; //3s
-  device.plcs.reset.up.temperature[9] = 0x1e0000; //30C
-  device.plcs.reset.up.voltage[9] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[9] = 0x30000; //3s
-  device.plcs.reset.up.temperature[10] = 0x280000; //40C
-  device.plcs.reset.up.voltage[10] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[10] = 0x30000; //3s
-  device.plcs.reset.up.temperature[11] = 0x320000; //50C
-  device.plcs.reset.up.voltage[11] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[11] = 0x30000; //3s
-  device.plcs.reset.up.temperature[12] = 0x3c0000; //60C
-  device.plcs.reset.up.voltage[12] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[12] = 0x30000; //3s
-  device.plcs.reset.up.temperature[13] = 0x460000; //70C
-  device.plcs.reset.up.voltage[13] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[13] = 0x30000; //3s
-  device.plcs.reset.up.temperature[14] = 0x500000; //80C
-  device.plcs.reset.up.voltage[14] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[14] = 0x30000; //3s
-  device.plcs.reset.up.temperature[15] = 0x5a0000; //90C
-  device.plcs.reset.up.voltage[15] = 0xc8000; //12.5V
-  device.plcs.reset.up.duration[15] = 0x30000; //3s
-  device.plcs.reset.down.points = 16;
-  device.plcs.reset.down.temperature[0] = -0x3c0000; //-60C
-  device.plcs.reset.down.voltage[0] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[0] = 0x30000; //3s
-  device.plcs.reset.down.temperature[1] = -0x320000; //-50C
-  device.plcs.reset.down.voltage[1] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[1] = 0x30000; //3s
-  device.plcs.reset.down.temperature[2] = -0x280000; //-40C
-  device.plcs.reset.down.voltage[2] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[2] = 0x30000; //3s
-  device.plcs.reset.down.temperature[3] = -0x1e0000; //-30C
-  device.plcs.reset.down.voltage[3] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[3] = 0x30000; //3s
-  device.plcs.reset.down.temperature[4] = -0x140000; //-20C
-  device.plcs.reset.down.voltage[4] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[4] = 0x30000; //3s
-  device.plcs.reset.down.temperature[5] = -0xa0000; //-10C
-  device.plcs.reset.down.voltage[5] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[5] = 0x30000; //3s
-  device.plcs.reset.down.temperature[6] = 0x0; //0C
-  device.plcs.reset.down.voltage[6] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[6] = 0x30000; //3s
-  device.plcs.reset.down.temperature[7] = 0xa0000; //10C
-  device.plcs.reset.down.voltage[7] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[7] = 0x30000; //3s
-  device.plcs.reset.down.temperature[8] = 0x140000; //20C
-  device.plcs.reset.down.voltage[8] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[8] = 0x30000; //3s
-  device.plcs.reset.down.temperature[9] = 0x1e0000; //30C
-  device.plcs.reset.down.voltage[9] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[9] = 0x30000; //3s
-  device.plcs.reset.down.temperature[10] = 0x280000; //40C
-  device.plcs.reset.down.voltage[10] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[10] = 0x30000; //3s
-  device.plcs.reset.down.temperature[11] = 0x320000; //50C
-  device.plcs.reset.down.voltage[11] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[11] = 0x30000; //3s
-  device.plcs.reset.down.temperature[12] = 0x3c0000; //60C
-  device.plcs.reset.down.voltage[12] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[12] = 0x30000; //3s
-  device.plcs.reset.down.temperature[13] = 0x460000; //70C
-  device.plcs.reset.down.voltage[13] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[13] = 0x30000; //3s
-  device.plcs.reset.down.temperature[14] = 0x500000; //80C
-  device.plcs.reset.down.voltage[14] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[14] = 0x30000; //3s
-  device.plcs.reset.down.temperature[15] = 0x5a0000; //90C
-  device.plcs.reset.down.voltage[15] = 0x18000; //1.5V
-  device.plcs.reset.down.duration[15] = 0x30000; //3s
+  //device.plcs.reset.levels.upper = 0xc8000; //12.5V
+  //device.plcs.reset.levels.lower = 0x18000; //1.5V
+  device.plcs.reset.up.settings.environment.points = 16;
+  device.plcs.reset.up.settings.environment.temperature[0]  = -0x3c0000; //-60C
+  device.plcs.reset.up.settings.environment.trigger[0]      =  0x18000;  //1.5V
+  device.plcs.reset.up.settings.environment.target[0]       =  0xc8000;  //12.5V
+  device.plcs.reset.up.settings.environment.duration[0]     =  0x30000;  //3s
+  device.plcs.reset.up.settings.environment.temperature[1]  = -0x320000; //-50C
+  device.plcs.reset.up.settings.environment.trigger[1]      =  0x18000;  //1.5V
+  device.plcs.reset.up.settings.environment.target[1]       =  0xc8000;  //12.5V
+  device.plcs.reset.up.settings.environment.duration[1]     =  0x30000;  //3s
+  device.plcs.reset.up.settings.environment.temperature[2]  = -0x280000; //-40C
+  device.plcs.reset.up.settings.environment.trigger[2]      =  0x18000;  //1.5V
+  device.plcs.reset.up.settings.environment.target[2]       =  0xc8000;  //12.5V
+  device.plcs.reset.up.settings.environment.duration[2]     =  0x30000;  //3s
+  device.plcs.reset.up.settings.environment.temperature[3]  = -0x1e0000; //-30C
+  device.plcs.reset.up.settings.environment.trigger[3]      =  0x18000;  //1.5V
+  device.plcs.reset.up.settings.environment.target[3]       =  0xc8000;  //12.5V
+  device.plcs.reset.up.settings.environment.duration[3]     =  0x30000;  //3s
+  device.plcs.reset.up.settings.environment.temperature[4]  = -0x140000; //-20C
+  device.plcs.reset.up.settings.environment.trigger[4]      =  0x18000;  //1.5V
+  device.plcs.reset.up.settings.environment.target[4]       =  0xc8000;  //12.5V
+  device.plcs.reset.up.settings.environment.duration[4]     =  0x30000;  //3s
+  device.plcs.reset.up.settings.environment.temperature[5]  = -0xa0000;  //-10C
+  device.plcs.reset.up.settings.environment.trigger[5]      =  0x18000;  //1.5V
+  device.plcs.reset.up.settings.environment.target[5]       =  0xc8000;  //12.5V
+  device.plcs.reset.up.settings.environment.duration[5]     =  0x30000;  //3s
+  device.plcs.reset.up.settings.environment.temperature[6]  =  0x0;      //0C
+  device.plcs.reset.up.settings.environment.trigger[6]      =  0x18000;  //1.5V
+  device.plcs.reset.up.settings.environment.target[6]       =  0xc8000;  //12.5V
+  device.plcs.reset.up.settings.environment.duration[6]     =  0x30000;  //3s
+  device.plcs.reset.up.settings.environment.temperature[7]  =  0xa0000;  //10C
+  device.plcs.reset.up.settings.environment.trigger[7]      =  0x18000;  //1.5V
+  device.plcs.reset.up.settings.environment.target[7]       =  0xc8000;  //12.5V
+  device.plcs.reset.up.settings.environment.duration[7]     =  0x30000;  //3s
+  device.plcs.reset.up.settings.environment.temperature[8]  =  0x140000; //20C
+  device.plcs.reset.up.settings.environment.trigger[8]      =  0x18000;  //1.5V
+  device.plcs.reset.up.settings.environment.target[8]       =  0xc8000;  //12.5V
+  device.plcs.reset.up.settings.environment.duration[8]     =  0x30000;  //3s
+  device.plcs.reset.up.settings.environment.temperature[9]  =  0x1e0000; //30C
+  device.plcs.reset.up.settings.environment.trigger[9]      =  0x18000;  //1.5V
+  device.plcs.reset.up.settings.environment.target[9]       =  0xc8000;  //12.5V
+  device.plcs.reset.up.settings.environment.duration[9]     =  0x30000;  //3s
+  device.plcs.reset.up.settings.environment.temperature[10] =  0x280000; //40C
+  device.plcs.reset.up.settings.environment.trigger[10]      =  0x18000; //1.5V
+  device.plcs.reset.up.settings.environment.target[10]       =  0xc8000; //12.5V
+  device.plcs.reset.up.settings.environment.duration[10]     =  0x30000; //3s
+  device.plcs.reset.up.settings.environment.temperature[11] =  0x320000; //50C
+  device.plcs.reset.up.settings.environment.trigger[11]      =  0x18000; //1.5V
+  device.plcs.reset.up.settings.environment.target[11]       =  0xc8000; //12.5V
+  device.plcs.reset.up.settings.environment.duration[11]     =  0x30000; //3s
+  device.plcs.reset.up.settings.environment.temperature[12] =  0x3c0000; //60C
+  device.plcs.reset.up.settings.environment.trigger[12]      =  0x18000; //1.5V
+  device.plcs.reset.up.settings.environment.target[12]       =  0xc8000; //12.5V
+  device.plcs.reset.up.settings.environment.duration[12]     =  0x30000; //3s
+  device.plcs.reset.up.settings.environment.temperature[13] =  0x460000; //70C
+  device.plcs.reset.up.settings.environment.trigger[13]      =  0x18000; //1.5V
+  device.plcs.reset.up.settings.environment.target[13]       =  0xc8000; //12.5V
+  device.plcs.reset.up.settings.environment.duration[13]     =  0x30000; //3s
+  device.plcs.reset.up.settings.environment.temperature[14] =  0x500000; //80C
+  device.plcs.reset.up.settings.environment.trigger[14]      =  0x18000; //1.5V
+  device.plcs.reset.up.settings.environment.target[14]       =  0xc8000; //12.5V
+  device.plcs.reset.up.settings.environment.duration[14]     =  0x30000; //3s
+  device.plcs.reset.up.settings.environment.temperature[15] =  0x5a0000; //90C
+  device.plcs.reset.up.settings.environment.trigger[15]      =  0x18000; //1.5V
+  device.plcs.reset.up.settings.environment.target[15]       =  0xc8000; //12.5V
+  device.plcs.reset.up.settings.environment.duration[15]     =  0x30000; //3s
+  
+  device.plcs.reset.down.settings.environment.points = 16;
+  device.plcs.reset.down.settings.environment.temperature[0]  = -0x3c0000; //-60C
+  device.plcs.reset.down.settings.environment.trigger[0]      =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[0]       =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[0]     =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[1]  = -0x320000; //-50C
+  device.plcs.reset.down.settings.environment.trigger[1]      =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[1]       =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[1]     =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[2]  = -0x280000; //-40C
+  device.plcs.reset.down.settings.environment.trigger[2]      =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[2]       =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[2]     =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[3]  = -0x1e0000; //-30C
+  device.plcs.reset.down.settings.environment.trigger[3]      =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[3]       =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[3]     =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[4]  = -0x140000; //-20C
+  device.plcs.reset.down.settings.environment.trigger[4]      =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[4]       =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[4]     =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[5]  = -0xa0000;  //-10C
+  device.plcs.reset.down.settings.environment.trigger[5]      =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[5]       =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[5]     =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[6]  =  0x0;      //0C
+  device.plcs.reset.down.settings.environment.trigger[6]      =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[6]       =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[6]     =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[7]  =  0xa0000;  //10C
+  device.plcs.reset.down.settings.environment.trigger[7]      =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[7]       =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[7]     =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[8]  =  0x140000; //20C
+  device.plcs.reset.down.settings.environment.trigger[8]      =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[8]       =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[8]     =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[9]  =  0x1e0000; //30C
+  device.plcs.reset.down.settings.environment.trigger[9]      =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[9]       =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[9]     =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[10] =  0x280000; //40C
+  device.plcs.reset.down.settings.environment.trigger[10]     =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[10]      =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[10]    =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[11] =  0x320000; //50C
+  device.plcs.reset.down.settings.environment.trigger[11]     =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[11]      =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[11]    =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[12] =  0x3c0000; //60C
+  device.plcs.reset.down.settings.environment.trigger[12]     =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[12]      =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[12]    =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[13] =  0x460000; //70C
+  device.plcs.reset.down.settings.environment.trigger[13]     =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[13]      =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[13]    =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[14] =  0x500000; //80C
+  device.plcs.reset.down.settings.environment.trigger[14]     =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[14]      =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[14]    =  0x30000;  //3s
+  device.plcs.reset.down.settings.environment.temperature[15] =  0x5a0000; //90C
+  device.plcs.reset.down.settings.environment.trigger[15]     =  0xc8000;  //12.5V
+  device.plcs.reset.down.settings.environment.target[15]      =  0x18000;  //1.5V
+  device.plcs.reset.down.settings.environment.duration[15]    =  0x30000;  //3s
   
   device.plcs.output.settings.sequencer = 1;
 }
@@ -214,7 +280,7 @@
   }
 }
 
-uint32_t plcsFeedback(int32_t voltage) {
+int32_t plcsFeedback(int32_t voltage) {
   int32_t v1, v2;
   for (uint8_t i = 1; i < device.plcs.feedback.settings.transfer.points; i++) {
     v1 = device.plcs.feedback.settings.transfer.raw[i - 1];
@@ -232,7 +298,7 @@
   return device.plcs.feedback.settings.transfer.normalized[device.plcs.feedback.settings.transfer.points - 1];
 }
 
-uint32_t plcsBias(int32_t raw) {
+int32_t plcsBias(int32_t raw) {
   int32_t r1, r2;
   for (uint8_t i = 1; i < device.plcs.bias.settings.transfer.points; i++) {
     r1 = device.plcs.bias.settings.transfer.raw[i - 1];
@@ -250,7 +316,7 @@
   return device.plcs.bias.settings.transfer.normalized[device.plcs.bias.settings.transfer.points - 1];
 }
 
-uint32_t plcsCorrection(int32_t error) {
+int32_t plcsCorrection(int32_t error) {
   int32_t e1, e2;
   for (uint8_t i = 1; i < device.plcs.regulator.settings.transfer.points; i++) {
     e1 = device.plcs.regulator.settings.transfer.error[i - 1];
@@ -280,7 +346,7 @@
     if (voltage < v2) {
       int32_t c1 = device.plcs.output.settings.transfer.code[i - 1];
       int32_t c2 = device.plcs.output.settings.transfer.code[i];
-      return plcsInterpolate(voltage, v1, v2, c1, c2);
+      return plcsInterpolate(voltage, v1, v2, c1, c2); //TODO: signed/unsigned
     }
   }
   return device.plcs.output.settings.transfer.code[device.plcs.output.settings.transfer.points - 1];
@@ -341,64 +407,137 @@
   }
 }
 
-void plcsUp(void) {
+void plcsPreprocessJumpUp(void) {
+  int32_t t1, t2;
+  for (uint8_t i = 1; i < device.plcs.reset.up.settings.environment.points; i++) {
+    t1 = device.plcs.reset.up.settings.environment.temperature[i - 1];
+    if (device.tss.temperature.state.celsius < t1) {
+      device.plcs.reset.up.state.trigger = device.plcs.reset.up.settings.environment.trigger[i - 1];
+      device.plcs.reset.up.state.target = device.plcs.reset.up.settings.environment.target[i - 1];
+      device.plcs.reset.up.state.duration = device.plcs.reset.up.settings.environment.duration[i - 1];
+      return;
+    }
+
+    t2 = device.plcs.reset.up.settings.environment.temperature[i];
+    if (device.tss.temperature.state.celsius < t2) {
+      int32_t v1 = device.plcs.reset.up.settings.environment.trigger[i - 1];
+      int32_t v2 = device.plcs.reset.up.settings.environment.trigger[i];
+      device.plcs.reset.up.state.trigger = plcsInterpolate(device.tss.temperature.state.celsius, t1, t2, v1, v2);
+      v1 = device.plcs.reset.up.settings.environment.target[i - 1];
+      v2 = device.plcs.reset.up.settings.environment.target[i];
+      device.plcs.reset.up.state.target = plcsInterpolate(device.tss.temperature.state.celsius, t1, t2, v1, v2);
+      int32_t d1 = device.plcs.reset.up.settings.environment.duration[i - 1];
+      int32_t d2 = device.plcs.reset.up.settings.environment.duration[i];
+      device.plcs.reset.up.state.duration = plcsInterpolate(device.tss.temperature.state.celsius, t1, t2, d1, d2);
+      return;
+    }
+  }
+  device.plcs.reset.up.state.trigger = device.plcs.reset.up.settings.environment.trigger[device.plcs.reset.up.settings.environment.points - 1];
+  device.plcs.reset.up.state.target = device.plcs.reset.up.settings.environment.target[device.plcs.reset.up.settings.environment.points - 1];
+  device.plcs.reset.up.state.duration = device.plcs.reset.up.settings.environment.duration[device.plcs.reset.up.settings.environment.points - 1];
+}
+
+void plcsPreprocessJumpDown(void) {
+  int32_t t1, t2;
+  for (uint8_t i = 1; i < device.plcs.reset.down.settings.environment.points; i++) {
+    t1 = device.plcs.reset.down.settings.environment.temperature[i - 1];
+    if (device.tss.temperature.state.celsius < t1) {
+      device.plcs.reset.down.state.trigger = device.plcs.reset.down.settings.environment.trigger[i - 1];
+      device.plcs.reset.down.state.target = device.plcs.reset.down.settings.environment.target[i - 1];
+      device.plcs.reset.down.state.duration = device.plcs.reset.down.settings.environment.duration[i - 1];
+      return;
+    }
+
+    t2 = device.plcs.reset.down.settings.environment.temperature[i];
+    if (device.tss.temperature.state.celsius < t2) {
+      int32_t v1 = device.plcs.reset.down.settings.environment.trigger[i - 1];
+      int32_t v2 = device.plcs.reset.down.settings.environment.trigger[i];
+      device.plcs.reset.down.state.trigger = plcsInterpolate(device.tss.temperature.state.celsius, t1, t2, v1, v2);
+      v1 = device.plcs.reset.down.settings.environment.target[i - 1];
+      v2 = device.plcs.reset.down.settings.environment.target[i];
+      device.plcs.reset.down.state.target = plcsInterpolate(device.tss.temperature.state.celsius, t1, t2, v1, v2);
+      int32_t d1 = device.plcs.reset.down.settings.environment.duration[i - 1];
+      int32_t d2 = device.plcs.reset.down.settings.environment.duration[i];
+      device.plcs.reset.down.state.duration = plcsInterpolate(device.tss.temperature.state.celsius, t1, t2, d1, d2);
+      return;
+    }
+  }
+  device.plcs.reset.down.state.trigger = device.plcs.reset.down.settings.environment.trigger[device.plcs.reset.down.settings.environment.points - 1];
+  device.plcs.reset.down.state.target = device.plcs.reset.down.settings.environment.target[device.plcs.reset.down.settings.environment.points - 1];
+  device.plcs.reset.down.state.duration = device.plcs.reset.down.settings.environment.duration[device.plcs.reset.down.settings.environment.points - 1];
+}
+
+//Delete this!!!
+/*void plcsUp(void) {
   int32_t t1, t2;
   for (uint8_t i = 1; i < device.plcs.reset.up.points; i++) {
     t1 = device.plcs.reset.up.temperature[i - 1];
     if (device.tss.temperature.state.celsius < t1) {
-      device.plcs.reset.state.voltage = device.plcs.reset.up.voltage[i - 1];
-      device.plcs.reset.state.countdown = device.plcs.reset.up.duration[i - 1];
+      device.plcs.reset.state.voltage = device.plcs.reset.up.settings.environment.voltage[i - 1];    //Delete this!!!
+      device.plcs.reset.state.countdown = device.plcs.reset.up.settings.environment.duration[i - 1];
     }
 
     t2 = device.plcs.reset.up.temperature[i];
     if (device.tss.temperature.state.celsius < t2) {
-      int32_t v1 = device.plcs.reset.up.voltage[i - 1];
-      int32_t v2 = device.plcs.reset.up.voltage[i];
+      int32_t v1 = device.plcs.reset.up.settings.environment.voltage[i - 1];
+      int32_t v2 = device.plcs.reset.up.settings.environment.voltage[i];
       device.plcs.reset.state.voltage = plcsInterpolate(device.tss.temperature.state.celsius, t1, t2, v1, v2);
-      int32_t d1 = device.plcs.reset.up.duration[i - 1];
-      int32_t d2 = device.plcs.reset.up.duration[i];
+      int32_t d1 = device.plcs.reset.up.settings.environment.duration[i - 1];
+      int32_t d2 = device.plcs.reset.up.settings.environment.duration[i];
       device.plcs.reset.state.countdown = plcsInterpolate(device.tss.temperature.state.celsius, t1, t2, d1, d2);
     }
   }
-  device.plcs.output.state.voltage = device.plcs.reset.up.voltage[device.plcs.reset.up.points - 1];
-  device.plcs.reset.state.countdown = device.plcs.reset.up.duration[device.plcs.reset.up.points - 1];
-}
+  device.plcs.output.state.voltage = device.plcs.reset.up.settings.environment.voltage[device.plcs.reset.up.settings.environment.points - 1];
+  device.plcs.reset.state.countdown = device.plcs.reset.up.settings.environment.duration[device.plcs.reset.up.settings.environment.points - 1];
+}*/
 
-void plcsDown(void) {
+//Delete this!!!
+/*void plcsDown(void) {
   int32_t t1, t2;
   for (uint8_t i = 1; i < device.plcs.reset.down.points; i++) {
     t1 = device.plcs.reset.down.temperature[i - 1];
     if (device.tss.temperature.state.celsius < t1) {
-      device.plcs.reset.state.voltage = device.plcs.reset.down.voltage[i - 1];
-      device.plcs.reset.state.countdown = device.plcs.reset.down.duration[i - 1];
+      device.plcs.reset.state.voltage = device.plcs.reset.down.settings.environment.voltage[i - 1];
+      device.plcs.reset.state.countdown = device.plcs.reset.down.settings.environment.duration[i - 1];
     }
 
-    t2 = device.plcs.reset.down.temperature[i];
+    t2 = device.plcs.reset.down.settings.environment.temperature[i];
     if (device.tss.temperature.state.celsius < t2) {
-      int32_t v1 = device.plcs.reset.down.voltage[i - 1];
-      int32_t v2 = device.plcs.reset.down.voltage[i];
+      int32_t v1 = device.plcs.reset.down.settings.environment.voltage[i - 1];
+      int32_t v2 = device.plcs.reset.down.settings.environment.voltage[i];
       device.plcs.reset.state.voltage = plcsInterpolate(device.tss.temperature.state.celsius, t1, t2, v1, v2);
-      int32_t d1 = device.plcs.reset.down.duration[i - 1];
-      int32_t d2 = device.plcs.reset.down.duration[i];
+      int32_t d1 = device.plcs.reset.down.settings.environment.duration[i - 1];
+      int32_t d2 = device.plcs.reset.down.settings.environment.duration[i];
       device.plcs.reset.state.countdown = plcsInterpolate(device.tss.temperature.state.celsius, t1, t2, d1, d2);
     }
   }
-  device.plcs.reset.state.voltage = device.plcs.reset.down.voltage[device.plcs.reset.down.points - 1];
-  device.plcs.reset.state.countdown = device.plcs.reset.down.duration[device.plcs.reset.down.points - 1];
-}
+  device.plcs.reset.state.voltage = device.plcs.reset.down.settings.environment.voltage[device.plcs.reset.down.settings.environment.points - 1];
+  device.plcs.reset.state.countdown = device.plcs.reset.down.settings.environment.duration[device.plcs.reset.down.settings.environment.points - 1];
+}*/
 
 void plcsReset(void) {
   if (device.plcs.reset.state.countdown > 0){
+    //Process jump
     int32_t period = 0x00000005; //5/65536sec = 75 mks
     //TODO: Set processing period from measurement cycle
     
     device.plcs.reset.state.countdown -= period;
     if (device.plcs.reset.state.countdown < 0) device.plcs.reset.state.countdown = 0;
   } else {
-    if (device.plcs.output.state.voltage > device.plcs.reset.levels.upper) {
-      plcsDown();
-    } else if (device.plcs.output.state.voltage < device.plcs.reset.levels.lower) {
-      plcsUp();
+    //Update jump parameters
+    plcsPreprocessJumpDown();
+    plcsPreprocessJumpUp();
+    //Detect reset condition
+    if (device.plcs.output.state.voltage > device.plcs.reset.up.state.trigger) {
+      //Process reset down
+      //plcsDown();
+      device.plcs.reset.state.countdown = device.plcs.reset.down.state.duration;
+      device.plcs.output.state.voltage = device.plcs.reset.down.state.target;
+    } else if (device.plcs.output.state.voltage < device.plcs.reset.down.state.trigger) {
+      //Process reset up
+      //plcsUp();
+      device.plcs.reset.state.countdown = device.plcs.reset.up.state.duration;
+      device.plcs.output.state.voltage = device.plcs.reset.down.state.target;
     };
   }
 }
@@ -452,4 +591,146 @@
   plcsReset();
   //Process output
   plcsOutput();
+}
+
+int16_t var_WP_reg(void) {
+  //Value:           PLCS output voltage - V - -13.2V...10.7V
+  //Internal format: device.plcs.output.state.voltage - [V] in 16.16 format
+  //Output format:   -8192 * (V + 1.3) / 3 - dimensionless units in 16.0 format
+  
+  //Voltage:         V + 1.3 = (device.plcs.output.state.voltage + 0x00014ccd) / 65536
+  //Output:          -8192 * (V + 1.3) / 3 = -(device.plcs.output.state.voltage + 0x00014ccd) / 24
+  
+  int32_t V = -(device.plcs.output.state.voltage + 0x00014ccd) / 24;
+  if (V > 32767) V = 32767;
+  if (V < -32768) V = -32768;
+  
+  return (int16_t)V;
+}
+
+int16_t var_WP_pll(void) {
+  //Value:           PLCS error - err
+  //Internal format: device.plcs.regulator.state.error - -1...1 in 16.16 format
+  //Output format:   sum(err, 1 sec) - dimensionless units in 16.0 format
+  
+  //Now: Multiply 512 instead of sum for 1 sec and right shift 16 to transform in format 16.0 (shift 16 - 9 = 7)
+  //Signed right shift implementation-defined!!! Required to replace right shift 7 to division on 128 for implementation independence?
+  int32_t err = device.plcs.regulator.state.error / 128;
+  //TODO: make summation for 1 sec as in DSP-based program and tranform 16.0
+  
+  return (int16_t)err;
+}
+
+uint16_t param_WP_ref(void) {
+  //Value:           PLCS regulator input signal reference voltage - V
+  //Internal format: device.plcs.regulator.state.reference - [V] in 16.16 format
+  //Output format:   (V / v) * 15000 - dimensionless units in 16.0 format
+  //TODO:            v = ??? Now v = 2.0
+  
+  //Voltage:         V = device.isacs.regulator.state.reference / 65536
+  //Output:          V = device.isacs.regulator.state.reference * 1875 / 16384
+  
+  //TODO: state/settings
+  
+  int32_t V = device.plcs.regulator.state.reference * 1875 / 16384;
+  if (V > 32767) V = 32767;
+  if (V < 0) V = 0;
+  
+  return (uint16_t)V;
+}
+
+//WP_scl s16 PLCS gain factor (1.15) 5..20
+uint16_t param_WP_scl(void) {
+  //Value:           PLCS output regulator scale - S - -13.2V...10.7V
+  //Internal format: device.plcs.regulator.state.scale - dimensionless units in 16.16 format
+  //Output format:   S / 65536 - dimensionless units in 16.0 format
+  
+  int32_t scl = device.plcs.regulator.state.scale / 65536;
+  if (scl > 32767) scl = 32767;
+  if (scl < 0) scl = 0;
+  
+  return (uint16_t)scl;
+}
+
+//WP_mdy s16 PLCS reset delay in 10kHz cycles
+uint16_t param_WP_mdy(void) {
+  //Value:           PLCS reset delay - D [s]
+  //Internal format: device.plcs.reset.up/down.state.duration - [s] in 16.16 format
+  //Output format:   (D / 65536) * 10000 - dimensionless units in 16.0 format
+  
+  //Delay:           D = device.plcs.reset.up/down.state.duration / 65536
+  //Output:          mdy = device.plcs.reset.up/down.state.duration * 625 / 4096
+  
+  //TODO:            up/down???
+  //Now:             average for up and down
+  
+  int32_t mdy = (device.plcs.reset.up.state.duration + device.plcs.reset.down.state.duration) * 625 / 8192;
+  if (mdy > 32767) mdy = 32767;
+  if (mdy < 0) mdy = 0;
+  
+  return (uint16_t)mdy;
+}
+
+//WP_rup dac ttf:PLCS maximum DAC code in heater channel; value:minimal voltage on the heater; value=(ttf>>4)/2048*(-12)-1.3; Range -13.2V...10.7V
+uint16_t param_WP_rup(void) {
+  //Value:           PLCS reset up trigger voltage - T [V]
+  //Internal format: device.plcs.reset.up.state.trigger - [V] in 16.16 format
+  //Output format:   -8192 * (T + 1.3) / 3 - dimensionless units in 16.0 format
+  
+  //Voltage:         T + 1.3 = (device.plcs.reset.up.state.trigger + 0x00014ccd) / 65536
+  //Output:          -8192 * (V + 1.3) / 3 = -(device.plcs.reset.up.state.trigger + 0x00014ccd) / 24
+  
+  int32_t rup = -(device.plcs.reset.up.state.trigger + 0x00014ccd) / 24;
+  if (rup > 32767) rup = 32767;
+  if (rup < -32768) rup = -32768;
+  
+  return (int16_t)rup;
+}
+
+//WP_rdw dac ttf:PLCS minimum DAC code in heater channel; value:maximal voltage on the heater; value=(ttf>>4)/2048*(-12)-1.3; Range -13.2V...10.7V
+uint16_t param_WP_rdw(void) {
+  //Value:           PLCS reset down trigger voltage - T [V]
+  //Internal format: device.plcs.reset.down.state.trigger - [V] in 16.16 format
+  //Output format:   -8192 * (T + 1.3) / 3 - dimensionless units in 16.0 format
+  
+  //Voltage:         T + 1.3 = (device.plcs.reset.down.state.trigger + 0x00014ccd) / 65536
+  //Output:          -8192 * (V + 1.3) / 3 = -(device.plcs.reset.down.state.trigger + 0x00014ccd) / 24
+  
+  int32_t rdw = -(device.plcs.reset.down.state.trigger + 0x00014ccd) / 24;
+  if (rdw > 32767) rdw = 32767;
+  if (rdw < -32768) rdw = -32768;
+  
+  return (int16_t)rdw;
+}
+
+//WP_reset dac ttf:PLCS DAC code after reset at heating; value:heater voltage after reset at heating; value=(ttf>>4)/2048*(-12)-1.3; Range -13.2V...10.7V
+uint16_t param_WP_reset(void) {
+  //Value:           PLCS reset up target voltage - T [V]
+  //Internal format: device.plcs.reset.up.state.target - [V] in 16.16 format
+  //Output format:   -8192 * (T + 1.3) / 3 - dimensionless units in 16.0 format
+  
+  //Voltage:         T + 1.3 = (device.plcs.reset.up.state.target + 0x00014ccd) / 65536
+  //Output:          -8192 * (V + 1.3) / 3 = -(device.plcs.reset.up.state.target + 0x00014ccd) / 24
+  
+  int32_t reset = -(device.plcs.reset.up.state.target + 0x00014ccd) / 24;
+  if (reset > 32767) reset = 32767;
+  if (reset < -32768) reset = -32768;
+  
+  return (int16_t)reset;
+}
+
+//WP_reset2 dac ttf:PLCS DAC code after reset at cooling; value:heater voltage after reset at cooling; value=(ttf>>4)/2048*(-12)-1.3
+uint16_t param_WP_reset2(void) {
+  //Value:           PLCS reset down target voltage - T [V]
+  //Internal format: device.plcs.reset.down.state.target - [V] in 16.16 format
+  //Output format:   -8192 * (T + 1.3) / 3 - dimensionless units in 16.0 format
+  
+  //Voltage:         T + 1.3 = (device.plcs.reset.down.state.target + 0x00014ccd) / 65536
+  //Output:          -8192 * (V + 1.3) / 3 = -(device.plcs.reset.down.state.target + 0x00014ccd) / 24
+  
+  int32_t reset2 = -(device.plcs.reset.down.state.target + 0x00014ccd) / 24;
+  if (reset2 > 32767) reset2 = 32767;
+  if (reset2 < -32768) reset2 = -32768;
+  
+  return (int16_t)reset2;
 }
\ No newline at end of file