123
Fork of LG by
Diff: DeviceUserEncoder.c
- Revision:
- 182:2bd8ec44998f
- Parent:
- 177:672ef279c8e0
- Child:
- 183:c7a9c309086c
diff -r 0b022246c43c -r 2bd8ec44998f DeviceUserEncoder.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DeviceUserEncoder.c Sun Jul 10 05:35:08 2016 +0000 @@ -0,0 +1,392 @@ +#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){ + 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(M0_GPH_W >> 8); Encode8(0); EncodeCRC(); break; + case H_PARAM8_W: + 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: + //Hi byte of ISACS output + param = 0; + break; + case 3: + //Lo byte of ISACS output + param = 0; + 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; + //Hi byte of PLCS output + case 8: + param16 = (uint16_t)device.controller.SSP.out[1]; + 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(countersGetRateAngle()); + //Encode output frequency + Encode16(var_F_ras()); + //Encode ISACS output + Encode16((uint16_t)device.controller.SSP.out[0]); + //Encode ISACS error + Encode16((int16_t)device.isacs.regulator.state.error); + //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((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(); +} + +//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(); +} \ No newline at end of file