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