123

Dependencies:   mbed

Fork of LG by igor Apu

Revision:
177:672ef279c8e0
Parent:
174:0f86eedd511c
--- a/DeviceUserProtocolEncoder.c	Thu Jun 30 09:04:22 2016 +0000
+++ b/DeviceUserProtocolEncoder.c	Sun Jul 03 13:40:48 2016 +0000
@@ -17,26 +17,22 @@
 }
 
 //Next to LineDecode(), PinDecode()
-void DeviceEncodeUserResponse(void) {
+void userEncodeResponse(void) {
   if (device.user.response.enabled) {
     if ((device.user.response.type == RESPONSE_PERIODIC) && (!device.user.response.triggered)) return;
 
     switch(device.user.response.code){
-      case DEV_MODE:
-        EncodeStart(); EncodeAddress(); EncodeDeviceMode(); EncodeSysRgR(); EncodeCRC();
-      break;
-      case DELTA_BINS:
-        EncodeStart(); EncodeAddress(); EncodeBINSDiff(); EncodeValidBINS(); EncodeCRC();
-      break;
-      //case DELTA_PS: break;
-      //case DELTA_SF: break;
-      //case DEV_MODE: break;
-      //case BIT_MODE: break;
-      //case RATE: break;
-      //case D_PERIOD_W: break;
-      case MAINTENANCE: EncodeStart(); EncodeAddress(); Encode8(0); Encode8(0); EncodeMessage(); EncodeCRC(); break;
-      //case M0_BASIC: break;
-      case M0_RATE: EncodeMRate(); break;
+      case DEV_MODE: EncodeDeviceMode(); break;
+      case DELTA_BINS: EncodeDeltaBINS(); break;
+      case DELTA_PS: EncodeDeltaPS(); break;
+      case DELTA_SF: EncodeDeltaSF(); break;
+      case BIT_MODE: EncodeDeviceMode(); break; //Same response as DEV_MODE
+      case MAINTENANCE: EncodeMainMode(); break;
+      case M0_RATE_1: EncodeMRate(); break;
+      case M0_CTL_R: EncodeMCtlR(); break;
+      case M0_CTL_A_M: EncodeMCtlAM(); break;
+      case M0_CTL_B_M: EncodeMCtlBM(); break;
+      case M0_CNT_R: EncodeMCntR(); break;
       case M0_GPH_W: EncodeStart(); EncodeAddress(); Encode8(M0_GPH_W >> 8); Encode8(0); EncodeCRC(); break;
       case H_PARAM8_W:
       case H_PARAM8_R:
@@ -59,7 +55,7 @@
   device.user.response.buffer.data[device.user.response.buffer.count] = param;
   device.user.response.buffer.count += 1;
   
-  sprintf(device.service.buffer,"  %2x\r\n", param); WriteConcole(); //Development message
+  //sprintf(device.service.buffer,"- %2x\r\n", param); WriteConcole(); //Development message
 }
 
 void Encode16(uint16_t param) {
@@ -88,6 +84,12 @@
   Encode8(device.user.address);
 }
 
+//TODO: EncodePacket(uint16_t length) - auto reset packet index
+void EncodePacket(void) {
+  Encode8(device.user.response.packet);
+  device.user.response.packet++;
+}
+
 void EncodeMessage(void) {
   Encode16(device.user.response.message);
 }
@@ -109,46 +111,252 @@
 }
 
 void EncodeDeviceMode(void) {
-  uint8_t mode;
-  if (device.latch.mode == DeviceLatch10kHz)
-    mode = 1;
-  else if (device.latch.mode == DeviceLatchMeander)
-    mode = 2;
-  else if ((device.latch.mode == DeviceLatchRS422) && (device.latch.format == DeviceLatchFormatDeltaPS))
-    mode = 3;
-  else if ((device.latch.mode == DeviceLatchPin) && (device.latch.format == DeviceLatchFormatDeltaPS))
-    mode = 4;
-  else if ((device.latch.mode == DeviceLatchRS422) && (device.latch.format == DeviceLatchFormatDeltaBINS))
-    mode = 5;
-  else if ((device.latch.mode == DeviceLatchPin) && (device.latch.format == DeviceLatchFormatDeltaBINS))
-    mode = 6;
-  else
-    mode = 0;
+  EncodeStart();
+  EncodeAddress();
+  EncodeDeviceMode();
+  
+  uint8_t mode = 0;
+  if (device.counters.latch.state.enabled) {
+    //External latch mode
+    if ((device.counters.latch.state.signal == 0) && (device.counters.latch.state.format == 0))
+      //DM_EXT_LATCH_DELTA_PS_LINE
+      mode = 3;
+    else if ((device.counters.latch.state.signal == 1) && (device.counters.latch.state.format == 0))
+      //DM_EXT_LATCH_DELTA_PS_PULSE
+      mode = 4;
+    else if ((device.counters.latch.state.signal == 0) && (device.counters.latch.state.format == 1))
+      //DM_EXT_LATCH_DELTA_BINS_LINE
+      mode = 5;
+    else if ((device.counters.latch.state.signal == 1) && (device.counters.latch.state.format == 1))
+      //DM_EXT_LATCH_DELTA_BINS_PULSE
+      mode = 6;
+  } else {
+    //Internal latch mode
+    if (device.counters.rate.state.source == 0) {
+      //DM_INT_SIGN_MEANDER_LATCH
+      mode = 2;
+    } else {
+      //DM_INT_10KHZ_LATCH
+      mode = 1;
+    }
+  }
   Encode8(mode);
+  
+  //Encode SysRgR
+  //    Unused 3 bits: => xxxxx000
+  //    Hardware: transmitter rate = receiver rate => xxxx1000
+  //    Sending response, so transmitter enabled, no case => 1xxx1000
+  //    Request received, so receiver enabled, no case => 11xx1000
+  switch (device.user.response.rate) {
+    case  38400: Encode8(0xc8); break; //11001000
+    case 115200: Encode8(0xd8); break; //11011000
+    case 460800: Encode8(0xe8); break; //11101000
+    case 921600: Encode8(0xf8); break; //11111000
+  }
+  
+  EncodeCRC();
 }
 
-void EncodeSysRgR(void) {
-  uint16_t u16;
-  //TODO
+void EncodeDeltaPS(void) {
+  //TODO: RESPONSE_DELAYED/RESPONSE_PERIODIC
   
-  Encode16(u16);
+  EncodeStart();
+  EncodeAddress();
+  //Encode angle counts
+  Encode16(0);//TODO: PSdiff
+  //Prepare parameter
+  uint8_t param;
+  switch (device.user.response.packet) {
+    //High byte of output frequency
+    case 0: break;
+    //Lo byte of output frequency
+    case 1: break;
+    //Hi byte of ISACS output
+    case 2: break;
+    //Lo byte of ISACS output
+    case 3: break;
+    //Hi byte of dither period
+    case 4: break;
+    //Lo byte of dither period
+    case 5: break;
+    //Hi byte of dither pulse width
+    case 6: break;
+    //Hi byte of dither pulse width
+    case 7: break;
+    //Hi byte of PLCS output
+    case 8: param = ((uint16_t)device.controller.SSP.out[1]) >> 8; break;
+    //Lo byte of PLCS output
+    case 9: param = (((uint16_t)device.controller.SSP.out[1])) & 0xff; break;
+    //Unused 
+    case 10: param = 0; break;
+    //Unused 
+    case 11: param = 0; break;
+    //Unused 
+    case 12: param = 0; break;
+    //Unused 
+    case 13: param = 0; break;
+    //Hi byte of CCS current[0]
+    case 14: param = ((uint16_t)device.ccs.current[0].state.raw) >> 8; break;
+    //Lo byte of CCS current[0]
+    case 15: param = (((uint16_t)device.ccs.current[0].state.raw)) & 0xff; break;
+    //Hi byte of CCS current[1]
+    case 16: param = ((uint16_t)device.ccs.current[1].state.raw) >> 8; break;
+    //Lo byte of CCS current[1]
+    case 17: param = (((uint16_t)device.ccs.current[1].state.raw)) & 0xff; break;
+    //Hi byte of TSS gradient
+    case 18: param = ((uint16_t)device.tss.gradient.state.raw) >> 8; break;
+    //Lo byte of TSS gradient
+    case 19: param = (((uint16_t)device.tss.gradient.state.raw)) & 0xff; break;
+    //Hi byte of TSS temperature
+    case 20: param = ((uint16_t)device.tss.temperature.state.raw) >> 8; break;
+    //Lo byte of TSS temperature
+    case 21: param = (((uint16_t)device.tss.temperature.state.raw)) & 0xff; break;
+  }
+  //Encode packet index
+  EncodePacket();
+  //Reset packet index
+  if (device.user.response.packet > 21) device.user.response.packet = 0;
+  //Encode parameter
+  Encode8(param);
+  //Finish encoding
+  EncodeCRC();
 }
 
-void EncodeBINSDiff(void) {
-  //TODO
+void EncodeDeltaBINS(void) {
+  EncodeStart();
+  EncodeAddress();
+  Encode16(0); Encode16(0); //TODO: BINSDiff_32
+  Encode8(0); //Data ok
+  EncodeCRC();
+}
+
+void EncodeDeltaSF(void) {
+//TODO
 }
 
-void EncodeValidBINS(void) {
-  //TODO
+//Deprecated
+//Usage: Ask_Gld "Maintenance" button
+//Usage: Ask_Gld "x" button
+void EncodeMainMode(void) {
+  EncodeStart();
+  EncodeAddress();
+  Encode8(0);      //Version - 0: use extended command to get version
+  Encode8(0);      //Serial number - 0: use extended command to get serial number
+  EncodeMessage();
+  EncodeCRC();
+}
+
+void EncodeMCntR(void) {
+  EncodeStart();
+  EncodeAddress();
+  Encode16((int16_t)device.counters.meander.state.a);
+  Encode16((int16_t)device.counters.meander.state.b);
+  EncodeCRC();
 }
 
 void EncodeMRate(void) {
   EncodeStart();
   EncodeAddress();
+  //Encode positive meander latched counter data
   Encode16((int16_t)device.counters.meander.state.a);
+  //Encode negative meander latched counter data
   Encode16((int16_t)device.counters.meander.state.b);
-  
+  //Encode accumulated meander latched counters difference
+  uint32_t angle = device.counters.meander.state.angle[0] + device.counters.meander.state.angle[1] >> 1;
+  device.counters.meander.state.angle[0] = 0;
+  //device.counters.meander.state.angle[1] -= device.counters.meander.state.angle[1] >> 1;//?
+  Encode16((int16_t)angle);
+  //Encode output frequency
+  Encode16((uint16_t)(device.counters.dither.state.amplitude >> 1));
+  //Encode ISACS output
+  Encode16((uint16_t)device.controller.SSP.out[0]);
+  //Encode ISACS error
+  Encode16((int16_t)device.isacs.regulator.state.error);
+  //Encode dither period
+  Encode16((uint16_t)((7680000*16/(device.dither.frequency.state.frequency>>12))));
+  //Encode dither phase detector output
+  Encode16((int16_t)(device.dither.detector.state.phase));
+  //Encode dither pulse width
+  Encode16((int16_t)(((7680000 * 2 * device.dither.pulse.state.width >> 8) >> 8) * 8/(device.dither.frequency.state.frequency>>12)));
+  //Encode unused
+  Encode16(0);
+  //Encode PLCS output
+  Encode16((uint16_t)device.controller.SSP.out[1]);
+  //Encode PLCS error
+  Encode16((int16_t)device.plcs.regulator.state.error);
+  //Encode unused
+  Encode16(0); //T0
+  //Encode unused
+  Encode16(0); //T1
+  //Encode CCS data
+  Encode16((int16_t)device.ccs.current[0].state.raw); //T2
+  Encode16((int16_t)device.ccs.current[1].state.raw); //T3
+  //Encode TSS data
+  Encode16((int16_t)device.tss.gradient.state.raw);    //T4
+  Encode16((int16_t)device.tss.temperature.state.raw); //T5
+  //Encode unused
+  Encode16(0);
+  //Encode unused
+  Encode16(0);
+  //Finish encoding
+  EncodeCRC();
+}
+
+//Deprecated
+void EncodeMCtlR(void) {
+  EncodeStart();
+  EncodeAddress();
+  Encode8(device.user.response.code >> 8);
+  if (device.user.response.code & 0x10 == 0){
+    Encode8(0);      //Encode error status and RgConA attribute (clear register RgConB bit)
+    //Prepare RgConA
+    uint16_t param = 0;
+    if (device.dither.frequency.state.enabled) param |= 1 << 6;
+    if (device.dither.amplitude.state.enabled) param |= 1 << 5;
+    if (device.sequencer.sampler.state.enabled) param |= 1 << 4;
+    if (device.plcs.regulator.state.enabled) param |= 1 << 3;
+    if (device.isacs.regulator.state.enabled) param |= 1 << 1;
+    Encode16(param); //Encode RgConA
+  } else {
+    Encode8(0x10);   //Encode error status and RgConB attribute (set register RgConB bit)
+    Encode16(device.counters.rate.state.source); //Encode RgConB
+  }
+  //Finish encoding
+  EncodeCRC();
+}
+
+//Deprecated
+void EncodeMCtlAM(void) {
+  EncodeStart();
+  EncodeAddress();
+  Encode8(device.user.response.code >> 8);
   //TODO:
-        
+  Encode8(0x10); Encode8(0);Encode8(0); //Encode RgConA content
+  //Finish encoding
+  EncodeCRC();
+}
+
+//Usage: Ask_Gld "Maintenance" button
+void EncodeMCtlBM(void) {
+  EncodeStart();
+  EncodeAddress();
+  Encode8(device.user.response.code >> 8);
+  //TODO:
+  Encode8(0); Encode8(0);Encode8(0); //Encode RgConB content
+  //Finish encoding
+  EncodeCRC();
+}
+
+void EncodeMParamR(void) {
+  EncodeStart();
+  EncodeAddress();
+  EncodeMessage();
+  EncodeCRC();
+}
+
+void EncodeMParamW(void) {
+  EncodeStart();
+  EncodeAddress();
+  EncodeMessage();
   EncodeCRC();
 }
\ No newline at end of file