123
Fork of LG by
DeviceUserEncoder.c
- Committer:
- Kovalev_D
- Date:
- 2016-10-19
- Revision:
- 197:7a05523bf588
- Parent:
- 183:c7a9c309086c
File content as of revision 197:7a05523bf588:
#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(); }