123

Dependencies:   mbed

Fork of LG by igor Apu

Revision:
161:efd949e8d536
Child:
167:bedc0a9d559a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DeviceUserProtocolEncoder.c	Sun May 15 19:12:12 2016 +0000
@@ -0,0 +1,137 @@
+#include "Device.h"
+
+extern Device device;
+extern HashParam hashParamTable[HASH_PARAM_COUNT];
+extern HashFunc  hashFuncTable[HASH_FUNC_COUNT];
+
+void InitUserProtocolEncoder(void) {
+  device.user.encoder.error = 0;
+  device.user.encoder.count = 0;
+  device.user.encoder.CRC = 0;
+}
+
+//Next to LineDecode(), PinDecode()
+void DeviceEncodeUserResponse(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: break;
+      case M0_GPH_W: EncodeStart(); EncodeAddress(); Encode8(M0_GPH_W >> 8); Encode8(0); EncodeCRC(); break;
+      case H_PARAM8_W:
+      case H_PARAM8_R:
+      case H_PARAM16_W:
+      case H_PARAM16_R:
+      case H_PARAM32_W:
+      case H_PARAM32_R:
+      case H_BYTES_W:
+      case H_BYTES_R:
+      case FLASH_READ_ALL:
+      case FLASH_WRITE_ALL:
+        EncodeStart(); EncodeAddress(); Encode16(device.user.response.code); EncodeMessage(); if (device.user.response.message == 0) EncodeParameters(); EncodeCRC();
+      break;
+      default: EncodeFail();
+    }
+  }
+}
+
+void Encode8(uint8_t param){
+  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
+}
+
+void Encode16(uint16_t param) {
+  Encode8((param >> 8) & 0xff);
+  Encode8(param & 0xff);
+}
+
+void EncodeStart(void) {
+  device.user.response.ready = 0;        //Disable transmission
+  device.user.response.buffer.count = 0; //Clear buffer
+  Encode8(0xdd);                         //Write response header code
+}
+
+void EncodeEnd(void) {
+  device.user.response.enabled = 0;      //Disable response overwrite
+  device.user.response.ready = 1;        //Enable transmission
+  device.user.response.buffer.position = 0; //Reset transmitter
+}
+
+void EncodeFail(void) {
+  device.user.response.buffer.count = 0; //Clear buffer
+  device.user.response.enabled = 0;      //Disable response overwrite
+}
+
+void EncodeAddress(void) {
+  Encode8(device.user.address);
+}
+
+void EncodeMessage(void) {
+  Encode16(device.user.response.message);
+}
+
+void EncodeParameters(void) {
+  for (uint8_t i = 0; i < device.user.response.parametersCount; i++){
+    uint8_t * b = (uint8_t *)device.user.response.parameters[i].ref;
+    for (uint8_t j = 0; j < device.user.response.parameters[i].size; j++){
+      Encode8(*b); b++;
+    }
+  }
+}
+
+void EncodeCRC(void) {
+  int16_t crc = 0;
+  for (int i = 2; i < device.user.response.buffer.count; i++) crc += device.user.response.buffer.data[i];
+  Encode16(crc);
+  EncodeEnd();
+}
+
+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;
+  Encode8(mode);
+}
+
+void EncodeSysRgR(void) {
+  uint16_t u16;
+  //TODO
+  
+  Encode16(u16);
+}
+
+void EncodeBINSDiff(void) {
+  //TODO
+}
+
+void EncodeValidBINS(void) {
+  //TODO
+}
\ No newline at end of file