123
Fork of LG by
Diff: DeviceUserProtocolEncoder.c
- 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