Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of LG by
DeviceUserEncoder.c
- Committer:
- Diletant
- Date:
- 2016-07-31
- Revision:
- 186:c7a9c309086c
- Parent:
- 184:2bd8ec44998f
File content as of revision 186:c7a9c309086c:
#include "Device.h"
extern Device device;
extern HashParam hashParamTable[HASH_PARAM_COUNT];
extern HashFunc  hashFuncTable[HASH_FUNC_COUNT];
void InitUserEncoderDefaultSettings(void) {
}
void InitUserEncoderState(void) {
  device.user.encoder.error = 0;
  device.user.encoder.count = 0;
  device.user.encoder.CRC = 0;
}
void DeviceStartUserEncoder(void) {
}
//Next to LineDecode(), PinDecode()
void userEncodeResponse(void) {
  if (device.user.response.enabled) {
    if (device.user.response.type == RESPONSE_PERIODIC) {
      if (device.user.response.triggered)
        device.user.response.triggered = 0; //Clear trigger event. Here ok - encode response in one pass
      else
        return;
    }
    switch(device.user.response.code){ //TODO: switch(device.user.response.code & 0xff00) { case group: switch (device.user.response.code & 0x00ff) { case cmd: ...}...}
      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_PARAM_R: EncodeMParamR(); break;
      case M0_PARAM_W: EncodeMParamW(); 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(0xe6); 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) {
  #ifdef DEBUG_ENCODER_OUTPUT
  static char h[16] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66};//0123456789abcdef;
  device.service.buffer[0] = 0x45; //E
  uint8_t c;
  for (uint8_t i = 0; i < device.user.response.buffer.count; i++) {
    c = device.user.response.buffer.data[i];
    device.service.buffer[i * 3 + 1] = 0x20;
    device.service.buffer[i * 3 + 2] = h[c >> 4];
    device.service.buffer[i * 3 + 3] = h[c & 0x0f];
  }
  device.service.buffer[device.user.response.buffer.count * 3 + 1] = 13;
  device.service.buffer[device.user.response.buffer.count * 3 + 2] = 10;
  device.service.buffer[device.user.response.buffer.count * 3 + 3] = 0;
  WriteConcole(); //Development message
  #endif
  
  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);
}
//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);
}
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();
}
//Deprecated
void EncodeDeviceMode(void) {
  EncodeStart();
  EncodeAddress();
  Encode8(var_Device_Mode());
  Encode8(var_SRgR());
  EncodeCRC();
}
//Deprecated
void EncodeDeltaPS(void) {
  static uint16_t param16;
  EncodeStart();
  EncodeAddress();
  //Encode angle counts
  Encode16(var_PSdiff());
  //Prepare parameter
  uint8_t param;
  switch (device.user.response.packet) {
    case 0:
      //Dither output frequency
      param16 = var_F_ras();
      //High byte of output frequency
      param = (uint8_t)(param16 >> 8);
      break;
    case 1:
      //Lo byte of output frequency
      param = (uint8_t)param16;
      break;
    case 2:
      //ISACS output
      param16 = var_HF_reg();
      //Hi byte of ISACS output
      param = (uint8_t)(param16 >> 8);
      break;
    case 3:
      //Lo byte of ISACS output
      param = (uint8_t)param16;
    break;
    case 4:
      //T_Vibro Dither drive period
      param16 = var_T_Vibro();
      //Hi byte of dither oscillation frequency divider
      param = (uint8_t)(param16 >> 8);
      break;
    case 5:
      //Lo byte of dither oscillation frequency divider
      param = (uint8_t)param16;
      break;
    case 6:
      //L_Vibro Dither pulse width
      param16 = var_L_Vibro();
      //Hi byte of dither pulse width
      param = (uint8_t)(param16 >> 8);
      break;
    case 7:
      //Lo byte of dither pulse width
      param = (uint8_t)param16;
      break;
    case 8:
      //PLCS output
      param16 = var_WP_reg();
      //Hi byte of PLCS output
      param = (uint8_t)(param16 >> 8);
      break;
    //Lo byte of PLCS output
    case 9:
      param = (uint8_t)(param16 & 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;
    case 14:
      param16 = (uint16_t)device.ccs.current[0].state.raw;
      //Hi byte of CCS current[0]
      param = (uint8_t)(param16 >> 8);
      break;
    case 15:
      //Lo byte of CCS current[0]
      param = (uint8_t)(param16 & 0xff);
    break;
    case 16:
      param16 = (uint16_t)device.ccs.current[1].state.raw;
      //Hi byte of CCS current[1]
      param = (uint8_t)(param16 >> 8);
      break;
    case 17:
      param = (uint8_t)(param16 & 0xff);
      //Lo byte of CCS current[1]
      break;
    case 18:
      param16 = (uint16_t)device.tss.gradient.state.raw;
      //Hi byte of TSS gradient
      param = (uint8_t)(param16 >> 8);
      break;
    case 19:
      //Lo byte of TSS gradient
      param = (uint8_t)(param16 & 0xff);
      break;
    case 20:
      param16 = (uint16_t)device.tss.temperature.state.raw;
      //Hi byte of TSS temperature
      param = (uint8_t)(param16 >> 8);
      break;
    case 21:
      //Lo byte of TSS temperature
      param = (uint8_t)(param16 & 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 EncodeDeltaBINS(void) {
  EncodeStart();
  EncodeAddress();
  Encode16(0); Encode16(0); //TODO: BINSDiff_32
  Encode8(0); //Data ok
  EncodeCRC();
}
void EncodeDeltaSF(void) {
//TODO
}
//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();
}
//Deprecated
void EncodeMCntR(void) {
  EncodeStart();
  EncodeAddress();
  Encode16((int16_t)device.counters.meander.state.a);
  Encode16((int16_t)device.counters.meander.state.b);
  EncodeCRC();
}
//Deprecated
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
  Encode16(var_Cnt_Dif());
  //Encode output frequency
  Encode16(var_F_ras());
  //Encode ISACS output
  Encode16(var_HF_reg());
  //Encode ISACS error
  Encode16(var_HF_dif());
  //Encode dither divider
  Encode16(var_T_Vibro());
  //Encode dither phase detector output
  Encode16(var_T_VB_pll());
  //Encode dither pulse width
  Encode16(var_L_Vibro());
  //Encode unused
  Encode16(0);
  //Encode PLCS output
  Encode16(var_WP_reg());
  //Encode PLCS error
  Encode16(var_WP_pll());
  //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();
}
//Deprecated
void EncodeMCtlBM(void) {
  EncodeStart();
  EncodeAddress();
  Encode16(device.user.response.code); //TODO: Embed error code
  Encode16(device.counters.rate.state.source);
  EncodeCRC();
}
//Deprecated
void EncodeMParamR(void) {
  EncodeStart();
  EncodeAddress();
  EncodeMessage();
  EncodeCRC();
}
//Deprecated
void EncodeMParamW(void) {
  EncodeStart();
  EncodeAddress();
  Encode8(device.user.response.code >> 8);
  Encode8(0); //TODO: Encode error code
  EncodeCRC();
}
            
    