123
Fork of LG by
DeviceUserProtocolEncoder.c@161:efd949e8d536, 2016-05-15 (annotated)
- Committer:
- Diletant
- Date:
- Sun May 15 19:12:12 2016 +0000
- Revision:
- 161:efd949e8d536
- Child:
- 167:bedc0a9d559a
Device & ... update. Not final!!!
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Diletant | 161:efd949e8d536 | 1 | #include "Device.h" |
Diletant | 161:efd949e8d536 | 2 | |
Diletant | 161:efd949e8d536 | 3 | extern Device device; |
Diletant | 161:efd949e8d536 | 4 | extern HashParam hashParamTable[HASH_PARAM_COUNT]; |
Diletant | 161:efd949e8d536 | 5 | extern HashFunc hashFuncTable[HASH_FUNC_COUNT]; |
Diletant | 161:efd949e8d536 | 6 | |
Diletant | 161:efd949e8d536 | 7 | void InitUserProtocolEncoder(void) { |
Diletant | 161:efd949e8d536 | 8 | device.user.encoder.error = 0; |
Diletant | 161:efd949e8d536 | 9 | device.user.encoder.count = 0; |
Diletant | 161:efd949e8d536 | 10 | device.user.encoder.CRC = 0; |
Diletant | 161:efd949e8d536 | 11 | } |
Diletant | 161:efd949e8d536 | 12 | |
Diletant | 161:efd949e8d536 | 13 | //Next to LineDecode(), PinDecode() |
Diletant | 161:efd949e8d536 | 14 | void DeviceEncodeUserResponse(void) { |
Diletant | 161:efd949e8d536 | 15 | if (device.user.response.enabled) { |
Diletant | 161:efd949e8d536 | 16 | if ((device.user.response.type == RESPONSE_PERIODIC) && (!device.user.response.triggered)) return; |
Diletant | 161:efd949e8d536 | 17 | |
Diletant | 161:efd949e8d536 | 18 | switch(device.user.response.code){ |
Diletant | 161:efd949e8d536 | 19 | case DEV_MODE: |
Diletant | 161:efd949e8d536 | 20 | EncodeStart(); EncodeAddress(); EncodeDeviceMode(); EncodeSysRgR(); EncodeCRC(); |
Diletant | 161:efd949e8d536 | 21 | break; |
Diletant | 161:efd949e8d536 | 22 | case DELTA_BINS: |
Diletant | 161:efd949e8d536 | 23 | EncodeStart(); EncodeAddress(); EncodeBINSDiff(); EncodeValidBINS(); EncodeCRC(); |
Diletant | 161:efd949e8d536 | 24 | break; |
Diletant | 161:efd949e8d536 | 25 | //case DELTA_PS: break; |
Diletant | 161:efd949e8d536 | 26 | //case DELTA_SF: break; |
Diletant | 161:efd949e8d536 | 27 | //case DEV_MODE: break; |
Diletant | 161:efd949e8d536 | 28 | //case BIT_MODE: break; |
Diletant | 161:efd949e8d536 | 29 | //case RATE: break; |
Diletant | 161:efd949e8d536 | 30 | //case D_PERIOD_W: break; |
Diletant | 161:efd949e8d536 | 31 | case MAINTENANCE: EncodeStart(); EncodeAddress(); Encode8(0); Encode8(0); EncodeMessage(); EncodeCRC(); break; |
Diletant | 161:efd949e8d536 | 32 | //case M0_BASIC: break; |
Diletant | 161:efd949e8d536 | 33 | //case M0_RATE: break; |
Diletant | 161:efd949e8d536 | 34 | case M0_GPH_W: EncodeStart(); EncodeAddress(); Encode8(M0_GPH_W >> 8); Encode8(0); EncodeCRC(); break; |
Diletant | 161:efd949e8d536 | 35 | case H_PARAM8_W: |
Diletant | 161:efd949e8d536 | 36 | case H_PARAM8_R: |
Diletant | 161:efd949e8d536 | 37 | case H_PARAM16_W: |
Diletant | 161:efd949e8d536 | 38 | case H_PARAM16_R: |
Diletant | 161:efd949e8d536 | 39 | case H_PARAM32_W: |
Diletant | 161:efd949e8d536 | 40 | case H_PARAM32_R: |
Diletant | 161:efd949e8d536 | 41 | case H_BYTES_W: |
Diletant | 161:efd949e8d536 | 42 | case H_BYTES_R: |
Diletant | 161:efd949e8d536 | 43 | case FLASH_READ_ALL: |
Diletant | 161:efd949e8d536 | 44 | case FLASH_WRITE_ALL: |
Diletant | 161:efd949e8d536 | 45 | EncodeStart(); EncodeAddress(); Encode16(device.user.response.code); EncodeMessage(); if (device.user.response.message == 0) EncodeParameters(); EncodeCRC(); |
Diletant | 161:efd949e8d536 | 46 | break; |
Diletant | 161:efd949e8d536 | 47 | default: EncodeFail(); |
Diletant | 161:efd949e8d536 | 48 | } |
Diletant | 161:efd949e8d536 | 49 | } |
Diletant | 161:efd949e8d536 | 50 | } |
Diletant | 161:efd949e8d536 | 51 | |
Diletant | 161:efd949e8d536 | 52 | void Encode8(uint8_t param){ |
Diletant | 161:efd949e8d536 | 53 | device.user.response.buffer.data[device.user.response.buffer.count] = param; |
Diletant | 161:efd949e8d536 | 54 | device.user.response.buffer.count += 1; |
Diletant | 161:efd949e8d536 | 55 | |
Diletant | 161:efd949e8d536 | 56 | sprintf(device.service.buffer," %2x\r\n", param); WriteConcole(); //Development message |
Diletant | 161:efd949e8d536 | 57 | } |
Diletant | 161:efd949e8d536 | 58 | |
Diletant | 161:efd949e8d536 | 59 | void Encode16(uint16_t param) { |
Diletant | 161:efd949e8d536 | 60 | Encode8((param >> 8) & 0xff); |
Diletant | 161:efd949e8d536 | 61 | Encode8(param & 0xff); |
Diletant | 161:efd949e8d536 | 62 | } |
Diletant | 161:efd949e8d536 | 63 | |
Diletant | 161:efd949e8d536 | 64 | void EncodeStart(void) { |
Diletant | 161:efd949e8d536 | 65 | device.user.response.ready = 0; //Disable transmission |
Diletant | 161:efd949e8d536 | 66 | device.user.response.buffer.count = 0; //Clear buffer |
Diletant | 161:efd949e8d536 | 67 | Encode8(0xdd); //Write response header code |
Diletant | 161:efd949e8d536 | 68 | } |
Diletant | 161:efd949e8d536 | 69 | |
Diletant | 161:efd949e8d536 | 70 | void EncodeEnd(void) { |
Diletant | 161:efd949e8d536 | 71 | device.user.response.enabled = 0; //Disable response overwrite |
Diletant | 161:efd949e8d536 | 72 | device.user.response.ready = 1; //Enable transmission |
Diletant | 161:efd949e8d536 | 73 | device.user.response.buffer.position = 0; //Reset transmitter |
Diletant | 161:efd949e8d536 | 74 | } |
Diletant | 161:efd949e8d536 | 75 | |
Diletant | 161:efd949e8d536 | 76 | void EncodeFail(void) { |
Diletant | 161:efd949e8d536 | 77 | device.user.response.buffer.count = 0; //Clear buffer |
Diletant | 161:efd949e8d536 | 78 | device.user.response.enabled = 0; //Disable response overwrite |
Diletant | 161:efd949e8d536 | 79 | } |
Diletant | 161:efd949e8d536 | 80 | |
Diletant | 161:efd949e8d536 | 81 | void EncodeAddress(void) { |
Diletant | 161:efd949e8d536 | 82 | Encode8(device.user.address); |
Diletant | 161:efd949e8d536 | 83 | } |
Diletant | 161:efd949e8d536 | 84 | |
Diletant | 161:efd949e8d536 | 85 | void EncodeMessage(void) { |
Diletant | 161:efd949e8d536 | 86 | Encode16(device.user.response.message); |
Diletant | 161:efd949e8d536 | 87 | } |
Diletant | 161:efd949e8d536 | 88 | |
Diletant | 161:efd949e8d536 | 89 | void EncodeParameters(void) { |
Diletant | 161:efd949e8d536 | 90 | for (uint8_t i = 0; i < device.user.response.parametersCount; i++){ |
Diletant | 161:efd949e8d536 | 91 | uint8_t * b = (uint8_t *)device.user.response.parameters[i].ref; |
Diletant | 161:efd949e8d536 | 92 | for (uint8_t j = 0; j < device.user.response.parameters[i].size; j++){ |
Diletant | 161:efd949e8d536 | 93 | Encode8(*b); b++; |
Diletant | 161:efd949e8d536 | 94 | } |
Diletant | 161:efd949e8d536 | 95 | } |
Diletant | 161:efd949e8d536 | 96 | } |
Diletant | 161:efd949e8d536 | 97 | |
Diletant | 161:efd949e8d536 | 98 | void EncodeCRC(void) { |
Diletant | 161:efd949e8d536 | 99 | int16_t crc = 0; |
Diletant | 161:efd949e8d536 | 100 | for (int i = 2; i < device.user.response.buffer.count; i++) crc += device.user.response.buffer.data[i]; |
Diletant | 161:efd949e8d536 | 101 | Encode16(crc); |
Diletant | 161:efd949e8d536 | 102 | EncodeEnd(); |
Diletant | 161:efd949e8d536 | 103 | } |
Diletant | 161:efd949e8d536 | 104 | |
Diletant | 161:efd949e8d536 | 105 | void EncodeDeviceMode(void) { |
Diletant | 161:efd949e8d536 | 106 | uint8_t mode; |
Diletant | 161:efd949e8d536 | 107 | if (device.latch.mode == DeviceLatch10kHz) |
Diletant | 161:efd949e8d536 | 108 | mode = 1; |
Diletant | 161:efd949e8d536 | 109 | else if (device.latch.mode == DeviceLatchMeander) |
Diletant | 161:efd949e8d536 | 110 | mode = 2; |
Diletant | 161:efd949e8d536 | 111 | else if ((device.latch.mode == DeviceLatchRS422) && (device.latch.format == DeviceLatchFormatDeltaPS)) |
Diletant | 161:efd949e8d536 | 112 | mode = 3; |
Diletant | 161:efd949e8d536 | 113 | else if ((device.latch.mode == DeviceLatchPin) && (device.latch.format == DeviceLatchFormatDeltaPS)) |
Diletant | 161:efd949e8d536 | 114 | mode = 4; |
Diletant | 161:efd949e8d536 | 115 | else if ((device.latch.mode == DeviceLatchRS422) && (device.latch.format == DeviceLatchFormatDeltaBINS)) |
Diletant | 161:efd949e8d536 | 116 | mode = 5; |
Diletant | 161:efd949e8d536 | 117 | else if ((device.latch.mode == DeviceLatchPin) && (device.latch.format == DeviceLatchFormatDeltaBINS)) |
Diletant | 161:efd949e8d536 | 118 | mode = 6; |
Diletant | 161:efd949e8d536 | 119 | else |
Diletant | 161:efd949e8d536 | 120 | mode = 0; |
Diletant | 161:efd949e8d536 | 121 | Encode8(mode); |
Diletant | 161:efd949e8d536 | 122 | } |
Diletant | 161:efd949e8d536 | 123 | |
Diletant | 161:efd949e8d536 | 124 | void EncodeSysRgR(void) { |
Diletant | 161:efd949e8d536 | 125 | uint16_t u16; |
Diletant | 161:efd949e8d536 | 126 | //TODO |
Diletant | 161:efd949e8d536 | 127 | |
Diletant | 161:efd949e8d536 | 128 | Encode16(u16); |
Diletant | 161:efd949e8d536 | 129 | } |
Diletant | 161:efd949e8d536 | 130 | |
Diletant | 161:efd949e8d536 | 131 | void EncodeBINSDiff(void) { |
Diletant | 161:efd949e8d536 | 132 | //TODO |
Diletant | 161:efd949e8d536 | 133 | } |
Diletant | 161:efd949e8d536 | 134 | |
Diletant | 161:efd949e8d536 | 135 | void EncodeValidBINS(void) { |
Diletant | 161:efd949e8d536 | 136 | //TODO |
Diletant | 161:efd949e8d536 | 137 | } |