123

Dependencies:   mbed

Fork of LG by igor Apu

Committer:
Diletant
Date:
Sun May 22 18:59:20 2016 +0000
Revision:
166:c3c0b8a90d81
Parent:
161:efd949e8d536
Child:
167:bedc0a9d559a
Device & ... update. Not final!!!

Who changed what in which revision?

UserRevisionLine numberNew 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 InitUserProtocolDecoder(void) {
Diletant 161:efd949e8d536 8 device.user.decoder.error = 0;
Diletant 161:efd949e8d536 9 device.user.decoder.count = 0;
Diletant 161:efd949e8d536 10 device.user.decoder.canceled = 1;
Diletant 161:efd949e8d536 11 device.user.decoder.address = 0;
Diletant 161:efd949e8d536 12 device.user.decoder.version = 0;
Diletant 161:efd949e8d536 13 device.user.decoder.code = 0;
Diletant 161:efd949e8d536 14 device.user.decoder.position = 0;
Diletant 161:efd949e8d536 15 device.user.decoder.CRC = 0;
Diletant 161:efd949e8d536 16 }
Diletant 161:efd949e8d536 17
Diletant 161:efd949e8d536 18 void DeviceDecodeUserRequests(void) {
Diletant 161:efd949e8d536 19 do {
Diletant 161:efd949e8d536 20 DecodeStart(); if (device.user.decoder.error) continue;
Diletant 161:efd949e8d536 21 DecodeAddress(); if (device.user.decoder.error) continue;
Diletant 161:efd949e8d536 22 DecodeCode(); if (device.user.decoder.error) continue;
Diletant 161:efd949e8d536 23 switch(device.user.decoder.code){
Diletant 161:efd949e8d536 24 case FACTORY_ACCESS: DecodeFactory(); break;
Diletant 161:efd949e8d536 25 case DEV_MODE: DecodeDeviceMode(); break;
Diletant 161:efd949e8d536 26 case DELTA_BINS: DecodeDelta(); break;
Diletant 161:efd949e8d536 27 case DELTA_PS: DecodeDelta(); break;
Diletant 161:efd949e8d536 28 case DELTA_SF: DecodeDelta(); break;
Diletant 161:efd949e8d536 29 case BIT_MODE: DecodeBITMode(); break;
Diletant 161:efd949e8d536 30 case MAINTENANCE: DecodeMaintenanceMode(); break;
Diletant 161:efd949e8d536 31 case M0_BASIC: DecodeMBasic(); break;
Diletant 161:efd949e8d536 32 case M0_RATE: DecodeMRate(); break;
Diletant 161:efd949e8d536 33 case M0_STIMUL: DecodeMStymul(); break;
Diletant 161:efd949e8d536 34 case M0_RESET: DecodeMReset(); break;
Diletant 161:efd949e8d536 35 case M0_TMP_W: DecodeMTmpW(); break;
Diletant 161:efd949e8d536 36 case M0_TMP_R: DecodeMTmpR(); break;
Diletant 161:efd949e8d536 37 //case M0_E5R_W: break;
Diletant 161:efd949e8d536 38 //case M0_ADC_R: break;
Diletant 161:efd949e8d536 39 //case M0_VIB_W: break;
Diletant 161:efd949e8d536 40 //case M0_CNT_R: break;
Diletant 161:efd949e8d536 41 case M0_GPH_W: DecodeMGphW(); break;
Diletant 161:efd949e8d536 42 //case M0_FLG_R: break;
Diletant 161:efd949e8d536 43 case M0_PARAM_W: DecodeMParamW(); break;
Diletant 161:efd949e8d536 44 case M0_PARAM_R: DecodeMParamR(); break;
Diletant 161:efd949e8d536 45 //case M0_E5RA_W: break;
Diletant 161:efd949e8d536 46 default: DecodeFail();
Diletant 161:efd949e8d536 47 }
Diletant 161:efd949e8d536 48 } while (device.user.decoder.count > 0);
Diletant 161:efd949e8d536 49 }
Diletant 161:efd949e8d536 50
Diletant 161:efd949e8d536 51 uint8_t Decode8(void) {
Diletant 161:efd949e8d536 52 if (device.user.decoder.position != device.user.request.buffer.end) {
Diletant 161:efd949e8d536 53 uint8_t param = device.user.request.buffer.data[device.user.decoder.position];
Diletant 161:efd949e8d536 54
Diletant 161:efd949e8d536 55 sprintf(device.service.buffer, "Decode8(): %02x %04d %04d %04d\r\n", param, device.user.decoder.position, device.user.request.buffer.start, device.user.request.buffer.end); WriteConcole(); //Development message
Diletant 161:efd949e8d536 56
Diletant 161:efd949e8d536 57 device.user.decoder.position = (device.user.decoder.position + 1) % InputBufferSize;
Diletant 161:efd949e8d536 58 device.user.decoder.count++;
Diletant 161:efd949e8d536 59 device.user.decoder.CRC += param;
Diletant 161:efd949e8d536 60 return param;
Diletant 161:efd949e8d536 61 } else {
Diletant 161:efd949e8d536 62 DecodeCancel();
Diletant 161:efd949e8d536 63 return 0;
Diletant 161:efd949e8d536 64 }
Diletant 161:efd949e8d536 65 }
Diletant 161:efd949e8d536 66
Diletant 161:efd949e8d536 67 uint16_t Decode16(void) {
Diletant 161:efd949e8d536 68 uint8_t hi = Decode8(); if (device.user.decoder.error) return 0;
Diletant 161:efd949e8d536 69 uint8_t lo = Decode8(); if (device.user.decoder.error) return 0;
Diletant 161:efd949e8d536 70 return (hi << 8) | lo;
Diletant 161:efd949e8d536 71 }
Diletant 161:efd949e8d536 72
Diletant 161:efd949e8d536 73 uint32_t Decode32(void) {
Diletant 161:efd949e8d536 74 uint32_t b3 = Decode8(); if (device.user.decoder.error) return 0;
Diletant 161:efd949e8d536 75 uint32_t b2 = Decode8(); if (device.user.decoder.error) return 0;
Diletant 161:efd949e8d536 76 uint32_t b1 = Decode8(); if (device.user.decoder.error) return 0;
Diletant 161:efd949e8d536 77 uint32_t b0 = Decode8(); if (device.user.decoder.error) return 0;
Diletant 161:efd949e8d536 78 return (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
Diletant 161:efd949e8d536 79 }
Diletant 161:efd949e8d536 80
Diletant 161:efd949e8d536 81 void DecodeStart(void) {
Diletant 161:efd949e8d536 82 if (device.user.decoder.canceled){
Diletant 161:efd949e8d536 83 DecodeCancel(); //Prevent next decode attempts until more data arrive
Diletant 161:efd949e8d536 84 } else {
Diletant 161:efd949e8d536 85 device.user.decoder.error = 0;
Diletant 161:efd949e8d536 86 device.user.decoder.count = 0;
Diletant 161:efd949e8d536 87 device.user.decoder.position = device.user.request.buffer.start;
Diletant 161:efd949e8d536 88 device.user.response.enabled = 0;
Diletant 161:efd949e8d536 89 uint8_t param = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 90
Diletant 161:efd949e8d536 91 //sprintf(tmp,"DecodeStart()\r\n"); WriteConcole(tmp); //Development message
Diletant 161:efd949e8d536 92
Diletant 161:efd949e8d536 93 if (param != 0xcc) DecodeFail();
Diletant 161:efd949e8d536 94
Diletant 161:efd949e8d536 95 device.user.response.type = RESPONSE_IMMEDIATE; //Default type
Diletant 161:efd949e8d536 96 }
Diletant 161:efd949e8d536 97 }
Diletant 161:efd949e8d536 98
Diletant 161:efd949e8d536 99 void DecodeAddress(void) {
Diletant 161:efd949e8d536 100 uint8_t address = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 101 device.user.decoder.CRC = 0;
Diletant 161:efd949e8d536 102 if ((address == device.user.address) || (address == BROADCAST_ADDRESS)) {
Diletant 161:efd949e8d536 103 device.user.decoder.address = address;
Diletant 161:efd949e8d536 104 } else {
Diletant 161:efd949e8d536 105 DecodeFail();
Diletant 161:efd949e8d536 106 }
Diletant 161:efd949e8d536 107 //sprintf(tmp,"DecodeAddress()\r\n"); WriteConcole(tmp); //Development message
Diletant 161:efd949e8d536 108 }
Diletant 161:efd949e8d536 109
Diletant 161:efd949e8d536 110 void DecodeCode(void) {
Diletant 161:efd949e8d536 111 uint8_t code = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 112 device.user.decoder.code = code << 8;
Diletant 161:efd949e8d536 113 //sprintf(tmp,"DecodeCode()\r\n"); WriteConcole(tmp); //Development message
Diletant 161:efd949e8d536 114 }
Diletant 161:efd949e8d536 115
Diletant 161:efd949e8d536 116 void DecodeExtentionCode(void) {
Diletant 161:efd949e8d536 117 uint8_t ext = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 118 device.user.decoder.code |= ext;
Diletant 161:efd949e8d536 119 //sprintf(tmp,"DecodeExtensionCode()\r\n"); WriteConcole(tmp); //Development message
Diletant 161:efd949e8d536 120 }
Diletant 161:efd949e8d536 121
Diletant 161:efd949e8d536 122 void DecodeEnd(void) {
Diletant 161:efd949e8d536 123 //sprintf(tmp,"DecodeEnd()\r\n"); WriteConcole(tmp); //Development message
Diletant 161:efd949e8d536 124
Diletant 161:efd949e8d536 125 device.user.request.buffer.start = (device.user.request.buffer.start + device.user.decoder.count) % InputBufferSize;
Diletant 161:efd949e8d536 126 if (device.user.request.buffer.start == device.user.request.buffer.end) device.user.request.buffer.empty = 1;
Diletant 161:efd949e8d536 127
Diletant 161:efd949e8d536 128 device.user.decoder.count = 0;
Diletant 161:efd949e8d536 129 if (device.user.decoder.error == 0) {
Diletant 161:efd949e8d536 130 device.user.response.code = device.user.decoder.code;
Diletant 161:efd949e8d536 131
Diletant 161:efd949e8d536 132 if (device.user.decoder.address == BROADCAST_ADDRESS) {
Diletant 161:efd949e8d536 133 device.user.response.type = RESPONSE_DELAYED;
Diletant 161:efd949e8d536 134 device.user.response.counter = 0;
Diletant 161:efd949e8d536 135 device.user.response.trigger = BROADCAST_FRAME * device.user.address; //0/100/200 mks
Diletant 161:efd949e8d536 136 }
Diletant 161:efd949e8d536 137
Diletant 161:efd949e8d536 138 device.user.response.enabled = 1;
Diletant 161:efd949e8d536 139 }
Diletant 161:efd949e8d536 140 }
Diletant 161:efd949e8d536 141
Diletant 161:efd949e8d536 142 void DecodeCancel(void) {
Diletant 161:efd949e8d536 143 device.user.decoder.error = 1;
Diletant 161:efd949e8d536 144 device.user.decoder.canceled = 1; //Set canceled flag: do not try to decode until new data arrive
Diletant 161:efd949e8d536 145 device.user.decoder.count = 0;
Diletant 161:efd949e8d536 146 }
Diletant 161:efd949e8d536 147
Diletant 161:efd949e8d536 148 void DecodeFail(void) {
Diletant 161:efd949e8d536 149 //sprintf(tmp,"DecodeFail()\r\n"); WriteConcole(tmp); //Development message
Diletant 161:efd949e8d536 150
Diletant 161:efd949e8d536 151 device.user.decoder.error = 2;
Diletant 161:efd949e8d536 152 device.user.decoder.count = 1;
Diletant 161:efd949e8d536 153 DecodeEnd();
Diletant 161:efd949e8d536 154 }
Diletant 161:efd949e8d536 155
Diletant 161:efd949e8d536 156 void DecodeCRC(void) {
Diletant 161:efd949e8d536 157 uint16_t CRC = device.user.decoder.CRC;
Diletant 161:efd949e8d536 158 //sprintf(tmp,"CS1 %4x\r\n", device.host.decoder.CRC); WriteConcole(tmp); //Development message
Diletant 161:efd949e8d536 159
Diletant 161:efd949e8d536 160 device.user.decoder.CRC = Decode16(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 161 //sprintf(tmp,"CS2 %4x\r\n", device.host.decoder.CRC); WriteConcole(tmp); //Development message
Diletant 161:efd949e8d536 162
Diletant 161:efd949e8d536 163 if (CRC == device.user.decoder.CRC)
Diletant 161:efd949e8d536 164 DecodeEnd();
Diletant 161:efd949e8d536 165 else
Diletant 161:efd949e8d536 166 DecodeFail();
Diletant 161:efd949e8d536 167 }
Diletant 161:efd949e8d536 168
Diletant 161:efd949e8d536 169 void DecodeHashParam(uint32_t * size, void ** ref) {
Diletant 161:efd949e8d536 170 uint32_t hash = Decode32(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 171 for (uint32_t i = 0; i < HASH_PARAM_COUNT; i++){
Diletant 161:efd949e8d536 172 if (hashParamTable[i].hash == hash){
Diletant 161:efd949e8d536 173 *ref = hashParamTable[i].ref;
Diletant 161:efd949e8d536 174 *size = hashParamTable[i].size;
Diletant 161:efd949e8d536 175 return;
Diletant 161:efd949e8d536 176 }
Diletant 161:efd949e8d536 177 }
Diletant 161:efd949e8d536 178 DecodeFail();
Diletant 161:efd949e8d536 179 }
Diletant 161:efd949e8d536 180
Diletant 161:efd949e8d536 181 void DecodeFactoryReadParam(void) {
Diletant 161:efd949e8d536 182 void * ref;
Diletant 161:efd949e8d536 183 uint32_t size;
Diletant 161:efd949e8d536 184
Diletant 161:efd949e8d536 185 DecodeHashParam(&size, &ref); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 186 switch (device.user.decoder.code & 0x0f) {
Diletant 161:efd949e8d536 187 //Read 8 bit
Diletant 161:efd949e8d536 188 case 0x00:
Diletant 161:efd949e8d536 189 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 190 device.user.response.parametersCount = 1;
Diletant 161:efd949e8d536 191 device.user.response.parameters[0].ref = ref;
Diletant 161:efd949e8d536 192 device.user.response.parameters[0].size = size;
Diletant 161:efd949e8d536 193 device.user.response.message = MESSAGE_OK;
Diletant 161:efd949e8d536 194 break;
Diletant 161:efd949e8d536 195 //Read 16 bit
Diletant 161:efd949e8d536 196 case 0x01:
Diletant 161:efd949e8d536 197 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 198 device.user.response.parametersCount = 1;
Diletant 161:efd949e8d536 199 device.user.response.parameters[0].ref = ref;
Diletant 161:efd949e8d536 200 device.user.response.parameters[0].size = size;
Diletant 161:efd949e8d536 201 device.user.response.message = MESSAGE_OK;
Diletant 161:efd949e8d536 202 break;
Diletant 161:efd949e8d536 203 //Read 32 bit
Diletant 161:efd949e8d536 204 case 0x03:
Diletant 161:efd949e8d536 205 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 206 device.user.response.parametersCount = 1;
Diletant 161:efd949e8d536 207 device.user.response.parameters[0].ref = ref;
Diletant 161:efd949e8d536 208 device.user.response.parameters[0].size = size;
Diletant 161:efd949e8d536 209 device.user.response.message = MESSAGE_OK;
Diletant 161:efd949e8d536 210 break;
Diletant 161:efd949e8d536 211 //Read array
Diletant 161:efd949e8d536 212 case 0x0f:
Diletant 161:efd949e8d536 213 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 214 device.user.response.parametersCount = 1;
Diletant 161:efd949e8d536 215 device.user.response.parameters[0].ref = ref;
Diletant 161:efd949e8d536 216 device.user.response.parameters[0].size = size;
Diletant 161:efd949e8d536 217 device.user.response.message = MESSAGE_OK;
Diletant 161:efd949e8d536 218 break;
Diletant 161:efd949e8d536 219 default:
Diletant 161:efd949e8d536 220 DecodeFail();
Diletant 161:efd949e8d536 221 device.user.response.message = MESSAGE_UNKNOWN_REQUEST_CODE;
Diletant 161:efd949e8d536 222 device.user.response.parametersCount = 0;
Diletant 161:efd949e8d536 223 }
Diletant 161:efd949e8d536 224 }
Diletant 161:efd949e8d536 225
Diletant 161:efd949e8d536 226 void DecodeFactoryWriteParam(void) {
Diletant 161:efd949e8d536 227 void * ref;
Diletant 161:efd949e8d536 228 uint32_t size;
Diletant 161:efd949e8d536 229 uint8_t param8;
Diletant 161:efd949e8d536 230 uint16_t param16;
Diletant 161:efd949e8d536 231 uint32_t param32;
Diletant 161:efd949e8d536 232
Diletant 161:efd949e8d536 233 DecodeHashParam(&size, &ref); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 234 switch (device.user.decoder.code & 0x0f) {
Diletant 161:efd949e8d536 235 //Write 8 bit
Diletant 161:efd949e8d536 236 case 0x00:
Diletant 161:efd949e8d536 237 param8 = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 238 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 239 *((uint8_t *)ref) = param8;
Diletant 161:efd949e8d536 240 device.user.response.message = MESSAGE_OK;
Diletant 161:efd949e8d536 241 device.user.response.parametersCount = 0;
Diletant 161:efd949e8d536 242 break;
Diletant 161:efd949e8d536 243 //Write 16 bit
Diletant 161:efd949e8d536 244 case 0x01:
Diletant 161:efd949e8d536 245 param16 = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 246 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 247 *((uint16_t *)ref) = param16;
Diletant 161:efd949e8d536 248 device.user.response.message = MESSAGE_OK;
Diletant 161:efd949e8d536 249 device.user.response.parametersCount = 0;
Diletant 161:efd949e8d536 250 break;
Diletant 161:efd949e8d536 251 //Write 32 bit
Diletant 161:efd949e8d536 252 case 0x03:
Diletant 161:efd949e8d536 253 param32 = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 254 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 255 *((uint32_t *)ref) = param32;
Diletant 161:efd949e8d536 256 device.user.response.message = MESSAGE_OK;
Diletant 161:efd949e8d536 257 device.user.response.parametersCount = 0;
Diletant 161:efd949e8d536 258 break;
Diletant 161:efd949e8d536 259 //Write array
Diletant 161:efd949e8d536 260 case 0x0f:
Diletant 161:efd949e8d536 261 param16 = Decode16(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 262 for (uint16_t i = 0; i < param16; i++){
Diletant 161:efd949e8d536 263 param8 = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 264 *(((uint8_t *)ref + i)) = param8;
Diletant 161:efd949e8d536 265 }
Diletant 161:efd949e8d536 266 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 267 device.user.response.message = MESSAGE_OK;
Diletant 161:efd949e8d536 268 device.user.response.parametersCount = 0;
Diletant 161:efd949e8d536 269 break;
Diletant 161:efd949e8d536 270 default:
Diletant 161:efd949e8d536 271 DecodeFail();
Diletant 161:efd949e8d536 272 device.user.response.message = MESSAGE_UNKNOWN_REQUEST_CODE;
Diletant 161:efd949e8d536 273 device.user.response.parametersCount = 0;
Diletant 161:efd949e8d536 274 }
Diletant 161:efd949e8d536 275 }
Diletant 161:efd949e8d536 276
Diletant 161:efd949e8d536 277 void DecodeFactoryFunctionCall(uint16_t parametersLength) {
Diletant 161:efd949e8d536 278 uint32_t hash = Decode32(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 279 for (uint32_t i = 0; i < HASH_FUNC_COUNT; i++){
Diletant 161:efd949e8d536 280 if (hashFuncTable[i].hash == hash){
Diletant 161:efd949e8d536 281 void * ref = hashFuncTable[i].ref;
Diletant 161:efd949e8d536 282 uint32_t resultSize = hashFuncTable[i].resultSize;
Diletant 161:efd949e8d536 283 uint32_t paramCount = hashFuncTable[i].paramCount;
Diletant 161:efd949e8d536 284 if (paramCount == parametersLength){
Diletant 161:efd949e8d536 285 if (paramCount == 0){
Diletant 161:efd949e8d536 286 //FunctionCall(ref);
Diletant 161:efd949e8d536 287 ((void (*)())ref)();
Diletant 161:efd949e8d536 288 return;
Diletant 161:efd949e8d536 289 } else if (paramCount == 1){
Diletant 161:efd949e8d536 290 ((void (*)())ref)(device.user.decoder.param0);
Diletant 161:efd949e8d536 291 return;
Diletant 161:efd949e8d536 292 } else if (paramCount == 2){
Diletant 161:efd949e8d536 293 ((void (*)())ref)(device.user.decoder.param0, device.user.decoder.param1);
Diletant 161:efd949e8d536 294 return;
Diletant 161:efd949e8d536 295 } else if (paramCount == 3){
Diletant 161:efd949e8d536 296 ((void (*)())ref)(device.user.decoder.param0, device.user.decoder.param1, device.user.decoder.param2);
Diletant 161:efd949e8d536 297 return;
Diletant 161:efd949e8d536 298 } else if (paramCount == 4){
Diletant 161:efd949e8d536 299 ((void (*)())ref)(device.user.decoder.param0, device.user.decoder.param1, device.user.decoder.param2, device.user.decoder.param3);
Diletant 161:efd949e8d536 300 return;
Diletant 161:efd949e8d536 301 }
Diletant 161:efd949e8d536 302 }
Diletant 161:efd949e8d536 303 }
Diletant 161:efd949e8d536 304 }
Diletant 161:efd949e8d536 305 DecodeFail();
Diletant 161:efd949e8d536 306 }
Diletant 161:efd949e8d536 307
Diletant 161:efd949e8d536 308 void DecodeFactory(void) {
Diletant 161:efd949e8d536 309 //sprintf(tmp," DecodeFactory()\r\n"); WriteConcole(tmp); //Development message
Diletant 161:efd949e8d536 310 DecodeExtentionCode(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 311
Diletant 161:efd949e8d536 312 switch (device.user.decoder.code & 0xf0) {
Diletant 161:efd949e8d536 313 //Read param
Diletant 161:efd949e8d536 314 case 0x00:
Diletant 161:efd949e8d536 315 DecodeFactoryReadParam();
Diletant 161:efd949e8d536 316 break;
Diletant 161:efd949e8d536 317 //Write param
Diletant 161:efd949e8d536 318 case 0x10:
Diletant 161:efd949e8d536 319 DecodeFactoryWriteParam();
Diletant 161:efd949e8d536 320 break;
Diletant 161:efd949e8d536 321 //Set function parameter by immediate value
Diletant 161:efd949e8d536 322 case 0x20:
Diletant 161:efd949e8d536 323 break;
Diletant 161:efd949e8d536 324 //Set function parameter by variable value
Diletant 161:efd949e8d536 325 case 0x30:
Diletant 161:efd949e8d536 326 break;
Diletant 161:efd949e8d536 327 //Set function parameter by variable reference
Diletant 161:efd949e8d536 328 case 0x40:
Diletant 161:efd949e8d536 329 break;
Diletant 161:efd949e8d536 330 //Call function - no parameters
Diletant 161:efd949e8d536 331 case 0x50:
Diletant 161:efd949e8d536 332 case 0x51:
Diletant 161:efd949e8d536 333 case 0x52:
Diletant 161:efd949e8d536 334 case 0x53:
Diletant 161:efd949e8d536 335 case 0x54:
Diletant 161:efd949e8d536 336 DecodeFactoryFunctionCall(device.user.decoder.code & 0x0f);
Diletant 161:efd949e8d536 337 break;
Diletant 161:efd949e8d536 338 //Read flash
Diletant 161:efd949e8d536 339 case 0x60:
Diletant 161:efd949e8d536 340 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 341 DeviceFlashReadAll();
Diletant 161:efd949e8d536 342 device.user.response.message = MESSAGE_OK;
Diletant 161:efd949e8d536 343 device.user.response.parametersCount = 0;
Diletant 161:efd949e8d536 344 break;
Diletant 161:efd949e8d536 345 //Write flash
Diletant 161:efd949e8d536 346 case 0x70:
Diletant 161:efd949e8d536 347 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 348 DeviceFlashWriteAll();
Diletant 161:efd949e8d536 349 device.user.response.message = MESSAGE_OK;
Diletant 161:efd949e8d536 350 device.user.response.parametersCount = 0;
Diletant 161:efd949e8d536 351 break;
Diletant 161:efd949e8d536 352 default:
Diletant 161:efd949e8d536 353 DecodeFail();
Diletant 161:efd949e8d536 354 device.user.response.message = MESSAGE_UNKNOWN_REQUEST_CODE;
Diletant 161:efd949e8d536 355 }
Diletant 161:efd949e8d536 356 }
Diletant 161:efd949e8d536 357
Diletant 161:efd949e8d536 358 void DecodeDeviceMode(void) {
Diletant 161:efd949e8d536 359 /*
Diletant 161:efd949e8d536 360 *** Description ***
Diletant 161:efd949e8d536 361 Elio5_cmd_en.pdf:
Diletant 161:efd949e8d536 362 Device_Mode - device operating modes:
Diletant 161:efd949e8d536 363 The device operating mode is encoded by 4 low bits (0..3) of byte 4.
Diletant 161:efd949e8d536 364 0 – reserved;
Diletant 161:efd949e8d536 365 1 – internal latch mode: latch by pulses 10 kHz (power on default mode);
Diletant 161:efd949e8d536 366 2 - internal latch mode: latch by signed meander pulses;
Diletant 161:efd949e8d536 367 3 – external latch mode with B_Delta_PS format data and RS422 request by command B_Delta_PS;
Diletant 161:efd949e8d536 368 4 – external latch mode with B_Delta_PS format data and latch pulse request;
Diletant 161:efd949e8d536 369 5 – external latch mode with B_Delta_BINS format data and RS422 request by command B_Delta_BINS;
Diletant 161:efd949e8d536 370 6 – external latch mode with B_Delta_BINS format data and latch pulse request;
Diletant 161:efd949e8d536 371
Diletant 161:efd949e8d536 372 *** Command action ***
Diletant 161:efd949e8d536 373 commandset_asm.asm - exec_CMD:
Diletant 161:efd949e8d536 374 CMD_Mode = 3;
Diletant 161:efd949e8d536 375
Diletant 161:efd949e8d536 376 commandset.c - B_Dev_Mode(void):
Diletant 161:efd949e8d536 377 Device_Mode = rcv_buf[3] & 0x00ff; //e. read the byte of command parameter from the receiver buffer and write it to the counter mode register //r. и записываем в регистр режима счетчиков
Diletant 161:efd949e8d536 378 trm_cycl = 0; //e. periodic data transmission is not needed //r. периодическая передача ответа не требуется
Diletant 161:efd949e8d536 379
Diletant 161:efd949e8d536 380 commandset_asm.asm - Mk_AskDev():
Diletant 161:efd949e8d536 381 num_of_par = 2; //e. 2 parameters output //r. выводить два параметра
Diletant 161:efd949e8d536 382 addr_param[0] = &Device_Mode; //e. address of the counter mode register (intenal latch, external latch, etc.) //r. адрес регистра режима счетчиков (внутр., внешняя защелка и т.д.)
Diletant 161:efd949e8d536 383 addr_param[1] = &SRgR; //e. address of the mode register of the processor card //r. адрес регистра режима платы процессора
Diletant 161:efd949e8d536 384 size_param[0] = 2; //e. size of the counter mode register - 2 bytes //r. размер регистра режима счетчиков - 2 байта
Diletant 161:efd949e8d536 385 size_param[1] = 2; //e. size of the mode register of the processor card //r. размер регистра режима платы процессора
Diletant 161:efd949e8d536 386 trm_cycl = 0; //e. forbid cyclic transmission of the parameter //r. запретить передачу параметра в цикле
Diletant 161:efd949e8d536 387 trm_ena = 1; //e. allow operation of the transmitter //r. разрешить работу передатчика
Diletant 161:efd949e8d536 388 */
Diletant 161:efd949e8d536 389 uint8_t mode = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 390 if ((mode > 0) && (mode < 7)){
Diletant 161:efd949e8d536 391 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 392 switch (mode) {
Diletant 161:efd949e8d536 393 case 1: device.latch.mode = DeviceLatch10kHz; break;
Diletant 161:efd949e8d536 394 case 2: device.latch.mode = DeviceLatchMeander; break;
Diletant 161:efd949e8d536 395 case 3: device.latch.mode = DeviceLatchRS422; device.latch.format = DeviceLatchFormatDeltaPS; break;
Diletant 161:efd949e8d536 396 case 4: device.latch.mode = DeviceLatchPin; device.latch.format = DeviceLatchFormatDeltaPS; break;
Diletant 161:efd949e8d536 397 case 5: device.latch.mode = DeviceLatchRS422; device.latch.format = DeviceLatchFormatDeltaBINS; break;
Diletant 161:efd949e8d536 398 case 6: device.latch.mode = DeviceLatchPin; device.latch.format = DeviceLatchFormatDeltaBINS; break;
Diletant 161:efd949e8d536 399 }
Diletant 161:efd949e8d536 400 //device.host.response.type = RESPONSE_IMMEDIATE; //Default type
Diletant 161:efd949e8d536 401 } else {
Diletant 161:efd949e8d536 402 DecodeFail();
Diletant 161:efd949e8d536 403 }
Diletant 161:efd949e8d536 404 }
Diletant 161:efd949e8d536 405
Diletant 161:efd949e8d536 406 void DecodeBITMode(void) {
Diletant 161:efd949e8d536 407 //In commandset.c - look as useless: set not used Is_BIT and BIT_Number variables
Diletant 161:efd949e8d536 408 //Consume required amount of input:
Diletant 161:efd949e8d536 409 Decode8(); if (device.user.decoder.error) return; //Is_BIT = 1/0;
Diletant 161:efd949e8d536 410 Decode8(); if (device.user.decoder.error) return; //BIT_number = (long)(rcv_buf[4] & 0x00FF) << 24;
Diletant 161:efd949e8d536 411 Decode8(); if (device.user.decoder.error) return; //BIT_number |= (long)(rcv_buf[5] & 0x00FF) << 16;
Diletant 161:efd949e8d536 412 Decode8(); if (device.user.decoder.error) return; //BIT_number |= (long)(rcv_buf[6] & 0x00FF) << 8;
Diletant 161:efd949e8d536 413 Decode8(); if (device.user.decoder.error) return; //BIT_number |= (long)(rcv_buf[7] & 0x00FF);
Diletant 161:efd949e8d536 414 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 415 }
Diletant 161:efd949e8d536 416
Diletant 161:efd949e8d536 417 void DecodeDelta(void) {
Diletant 161:efd949e8d536 418 //Same for DELTA_PS,DELTA_BINS,DELTA_SF - only code different and it processed already
Diletant 161:efd949e8d536 419 uint8_t mode = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 420 //if ((mode && 0x0f) == 0){ //DELTA_PS,DELTA_BINS
Diletant 161:efd949e8d536 421 if ((mode && 0x0e) == 0){ //DELTA_PS,DELTA_BINS,DELTA_SF
Diletant 161:efd949e8d536 422 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 423 //SRgR bits 4-5 - reponse rate
Diletant 161:efd949e8d536 424 switch ((mode >> 5) & 0x03){
Diletant 161:efd949e8d536 425 case 0: device.user.response.rate = 38400; break;
Diletant 161:efd949e8d536 426 case 1: device.user.response.rate = 115200; break;
Diletant 161:efd949e8d536 427 case 2: device.user.response.rate = 460800; break;
Diletant 161:efd949e8d536 428 case 3: device.user.response.rate = 921600; break;
Diletant 161:efd949e8d536 429 }
Diletant 161:efd949e8d536 430 if (mode & 0x04) {
Diletant 161:efd949e8d536 431 device.user.request.rate = device.user.response.rate;
Diletant 161:efd949e8d536 432 } else {
Diletant 161:efd949e8d536 433 device.user.request.rate = 38400;
Diletant 161:efd949e8d536 434 }
Diletant 161:efd949e8d536 435 if (mode & 0x01) { //DELTA_SF
Diletant 161:efd949e8d536 436 device.latch.reset = 0;
Diletant 161:efd949e8d536 437 } else {
Diletant 161:efd949e8d536 438 device.latch.reset = 1;
Diletant 161:efd949e8d536 439 }
Diletant 161:efd949e8d536 440 //device.latch.mode = DeviceLatchRS422; //Have to set by Device Mode command?
Diletant 161:efd949e8d536 441 if (device.user.response.code == DELTA_PS) device.latch.format = DeviceLatchFormatDeltaPS;
Diletant 161:efd949e8d536 442 else if (device.user.response.code == DELTA_BINS) device.latch.format = DeviceLatchFormatDeltaBINS;
Diletant 161:efd949e8d536 443 else if (device.user.response.code == DELTA_SF) device.latch.format = DeviceLatchFormatDeltaSF;
Diletant 161:efd949e8d536 444 //TODO: Latch(); //Remember counters for transmission, reset counters
Diletant 161:efd949e8d536 445 if (device.user.decoder.address == device.user.address) {
Diletant 161:efd949e8d536 446 if (mode & 0x80) {
Diletant 161:efd949e8d536 447 //TODO: reset device.counters here (or already done in Latch())
Diletant 161:efd949e8d536 448 device.user.response.counter = 0;
Diletant 161:efd949e8d536 449 device.user.response.trigger = 2000; //2000 mks - 500Hz
Diletant 161:efd949e8d536 450 device.user.response.type = RESPONSE_PERIODIC; //Override default type
Diletant 161:efd949e8d536 451 device.user.response.packet = 0;
Diletant 161:efd949e8d536 452 }
Diletant 161:efd949e8d536 453 }
Diletant 161:efd949e8d536 454 } else {
Diletant 161:efd949e8d536 455 DecodeFail();
Diletant 161:efd949e8d536 456 }
Diletant 161:efd949e8d536 457 }
Diletant 161:efd949e8d536 458
Diletant 161:efd949e8d536 459 void DecodeMaintenanceMode(void) {
Diletant 161:efd949e8d536 460 uint8_t version = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 461 if (version == 0x99) {
Diletant 161:efd949e8d536 462 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 463 device.user.decoder.version = 0;
Diletant 161:efd949e8d536 464 } else {
Diletant 161:efd949e8d536 465 DecodeFail();
Diletant 161:efd949e8d536 466 }
Diletant 161:efd949e8d536 467 }
Diletant 161:efd949e8d536 468
Diletant 161:efd949e8d536 469 void DecodeMBasic(void) {
Diletant 161:efd949e8d536 470 DecodeExtentionCode(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 471 switch (device.user.decoder.code) {
Diletant 161:efd949e8d536 472 case M0_CLEAR:
Diletant 161:efd949e8d536 473 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 474 DoMaintenanceClear();
Diletant 161:efd949e8d536 475 break;
Diletant 161:efd949e8d536 476 case M0_MIRROR:
Diletant 161:efd949e8d536 477 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 478 DoMaintenanceMirror();
Diletant 161:efd949e8d536 479 break;
Diletant 161:efd949e8d536 480 case M0_LDPAR_F:
Diletant 161:efd949e8d536 481 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 482 DeviceFlashReadAll();
Diletant 161:efd949e8d536 483 break;
Diletant 161:efd949e8d536 484 case M0_LDPAR_D:
Diletant 161:efd949e8d536 485 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 486 DeviceInitAllWithDefaults();
Diletant 161:efd949e8d536 487 break;
Diletant 161:efd949e8d536 488 case M0_START:
Diletant 161:efd949e8d536 489 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 490 DoMaintenanceStart();
Diletant 161:efd949e8d536 491 break;
Diletant 161:efd949e8d536 492 case M0_STOP:
Diletant 161:efd949e8d536 493 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 494 DoMaintenanceStop();
Diletant 161:efd949e8d536 495 break;
Diletant 161:efd949e8d536 496 case M0_PULSE:
Diletant 161:efd949e8d536 497 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 498 DeviceStartLightUp();
Diletant 161:efd949e8d536 499 break;
Diletant 161:efd949e8d536 500 default: DecodeFail();
Diletant 161:efd949e8d536 501 }
Diletant 161:efd949e8d536 502 }
Diletant 161:efd949e8d536 503
Diletant 161:efd949e8d536 504 void DoMaintenanceClear(void) {
Diletant 161:efd949e8d536 505 //TODO
Diletant 161:efd949e8d536 506 }
Diletant 161:efd949e8d536 507
Diletant 161:efd949e8d536 508 void DoMaintenanceMirror(void) {
Diletant 161:efd949e8d536 509 //TODO
Diletant 161:efd949e8d536 510 }
Diletant 161:efd949e8d536 511
Diletant 161:efd949e8d536 512 void DoMaintenanceStart(void) {
Diletant 161:efd949e8d536 513 //TODO
Diletant 161:efd949e8d536 514 }
Diletant 161:efd949e8d536 515
Diletant 161:efd949e8d536 516 void DoMaintenanceStop(void) {
Diletant 161:efd949e8d536 517 //TODO
Diletant 161:efd949e8d536 518 }
Diletant 161:efd949e8d536 519
Diletant 161:efd949e8d536 520 void DecodeMRate(void) {
Diletant 161:efd949e8d536 521 uint8_t mode = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 522 if ((mode && 0x18) == 0){
Diletant 161:efd949e8d536 523 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 524
Diletant 161:efd949e8d536 525 device.user.response.code |= mode & 0x07;
Diletant 161:efd949e8d536 526
Diletant 161:efd949e8d536 527 switch ((mode>>5) & 0x03) {
Diletant 161:efd949e8d536 528 case 0: device.user.response.rate = 38400; break;
Diletant 161:efd949e8d536 529 case 1: device.user.response.rate = 115200; break;
Diletant 161:efd949e8d536 530 case 2: device.user.response.rate = 460800; break;
Diletant 161:efd949e8d536 531 case 3: device.user.response.rate = 921600; break;
Diletant 161:efd949e8d536 532 }
Diletant 161:efd949e8d536 533
Diletant 161:efd949e8d536 534 if (mode & 0x80) {
Diletant 161:efd949e8d536 535 //TODO: reset device.counters here
Diletant 161:efd949e8d536 536 device.user.response.counter = 0;
Diletant 161:efd949e8d536 537 switch (mode & 0x03) {
Diletant 161:efd949e8d536 538 case 1: device.user.response.trigger = 1000000; break; //1 000 000 mks - 1Hz
Diletant 161:efd949e8d536 539 case 2: device.user.response.trigger = 3276700; break; //???
Diletant 161:efd949e8d536 540 case 3: device.user.response.trigger = 100; break; //100 mks - 10000Hz
Diletant 161:efd949e8d536 541 case 4: device.user.response.trigger = 800; break; //800 mks - 1250Hz
Diletant 161:efd949e8d536 542 case 7: device.user.response.trigger = 800; break; //800 mks - 1250Hz
Diletant 161:efd949e8d536 543 }
Diletant 161:efd949e8d536 544 device.user.response.type = RESPONSE_PERIODIC; //Override default type
Diletant 161:efd949e8d536 545 }
Diletant 161:efd949e8d536 546 } else {
Diletant 161:efd949e8d536 547 DecodeFail();
Diletant 161:efd949e8d536 548 }
Diletant 161:efd949e8d536 549 }
Diletant 161:efd949e8d536 550
Diletant 161:efd949e8d536 551 void DecodeMStymul(void) {
Diletant 161:efd949e8d536 552 uint8_t param = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 553 if ((param && 0x18) == 0){
Diletant 161:efd949e8d536 554 uint8_t hi = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 555 uint8_t lo = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 556 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 557
Diletant 161:efd949e8d536 558 device.user.decoder.code |= param & 0x04;
Diletant 161:efd949e8d536 559 device.user.response.rate = 38400;
Diletant 161:efd949e8d536 560
Diletant 161:efd949e8d536 561 device.user.response.enabled = (param & 0x80) >> 7;
Diletant 161:efd949e8d536 562
Diletant 161:efd949e8d536 563 uint8_t channel = param & 0x03;
Diletant 161:efd949e8d536 564 if (param & 0x04) {
Diletant 161:efd949e8d536 565 uint32_t flags = (hi << 8) | lo;
Diletant 161:efd949e8d536 566 //TODO: write flags - only flag register 0 defined
Diletant 161:efd949e8d536 567 if (channel == 0){
Diletant 161:efd949e8d536 568 //Potentiometers data
Diletant 161:efd949e8d536 569 if (flags & 0x01){
Diletant 161:efd949e8d536 570 } else {
Diletant 161:efd949e8d536 571 }
Diletant 161:efd949e8d536 572 //Potentiometers data input enable/disable flag
Diletant 161:efd949e8d536 573 if (flags & 0x02){
Diletant 161:efd949e8d536 574 } else {
Diletant 161:efd949e8d536 575 }
Diletant 161:efd949e8d536 576 //Laser Up
Diletant 161:efd949e8d536 577 if (flags & 0x03){
Diletant 161:efd949e8d536 578 } else {
Diletant 161:efd949e8d536 579 }
Diletant 161:efd949e8d536 580 //Software reper
Diletant 161:efd949e8d536 581 if (flags & 0x04){
Diletant 161:efd949e8d536 582 } else {
Diletant 161:efd949e8d536 583 }
Diletant 161:efd949e8d536 584 }
Diletant 161:efd949e8d536 585 } else {
Diletant 161:efd949e8d536 586 uint32_t voltage = ((hi << 4) | (lo >> 4)); //TODO: do correct transformations
Diletant 161:efd949e8d536 587 //TODO: write DAC
Diletant 161:efd949e8d536 588 switch (channel){
Diletant 161:efd949e8d536 589 case 0://PLC regulator
Diletant 161:efd949e8d536 590 break;
Diletant 161:efd949e8d536 591 case 1://PLC modulator
Diletant 161:efd949e8d536 592 break;
Diletant 161:efd949e8d536 593 case 2://laser power regulator
Diletant 161:efd949e8d536 594 break;
Diletant 161:efd949e8d536 595 case 3://worms
Diletant 161:efd949e8d536 596 break;
Diletant 161:efd949e8d536 597 }
Diletant 161:efd949e8d536 598 }
Diletant 161:efd949e8d536 599 } else {
Diletant 161:efd949e8d536 600 DecodeFail();
Diletant 161:efd949e8d536 601 }
Diletant 161:efd949e8d536 602 }
Diletant 161:efd949e8d536 603
Diletant 161:efd949e8d536 604 void DecodeMReset(void) {
Diletant 161:efd949e8d536 605 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 606
Diletant 161:efd949e8d536 607 while (1); //Wait watch dog reset
Diletant 161:efd949e8d536 608 }
Diletant 161:efd949e8d536 609
Diletant 161:efd949e8d536 610 void DecodeMControlRead(void) {
Diletant 161:efd949e8d536 611 uint8_t param = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 612 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 613
Diletant 161:efd949e8d536 614 if (param & 60 == 0)
Diletant 161:efd949e8d536 615 device.user.response.rate = 38400;
Diletant 161:efd949e8d536 616 else
Diletant 161:efd949e8d536 617 device.user.response.rate = 115200;
Diletant 161:efd949e8d536 618
Diletant 161:efd949e8d536 619 device.user.response.code |= param & 0x10;
Diletant 161:efd949e8d536 620 }
Diletant 161:efd949e8d536 621
Diletant 161:efd949e8d536 622 void DecodeMControlWrite(void) {
Diletant 161:efd949e8d536 623 uint8_t param = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 624 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 625
Diletant 161:efd949e8d536 626 if (param & 60 == 0)
Diletant 161:efd949e8d536 627 device.user.response.rate = 38400;
Diletant 161:efd949e8d536 628 else
Diletant 161:efd949e8d536 629 device.user.response.rate = 115200;
Diletant 161:efd949e8d536 630
Diletant 161:efd949e8d536 631 uint8_t bit = param & 0x0f;
Diletant 161:efd949e8d536 632 uint8_t value = param & 0x80 >> 7;
Diletant 161:efd949e8d536 633 if (param & 0x10 == 0){
Diletant 161:efd949e8d536 634 //RgConA - flags of regulator loops
Diletant 161:efd949e8d536 635 switch (bit){
Diletant 161:efd949e8d536 636 case 0://Laser switch
Diletant 161:efd949e8d536 637 //TODO
Diletant 161:efd949e8d536 638 break;
Diletant 161:efd949e8d536 639
Diletant 161:efd949e8d536 640 case 1://HFO loop switch
Diletant 161:efd949e8d536 641 device.isacs.regulator.state.enabled = value;
Diletant 161:efd949e8d536 642 break;
Diletant 161:efd949e8d536 643
Diletant 161:efd949e8d536 644 case 3://PLC loop switch
Diletant 161:efd949e8d536 645 device.plcs.regulator.state.enabled = value;
Diletant 161:efd949e8d536 646 break;
Diletant 161:efd949e8d536 647
Diletant 161:efd949e8d536 648 case 4://Modulator switch
Diletant 166:c3c0b8a90d81 649 //device.plcs.modulator.state.enabled = value;
Diletant 166:c3c0b8a90d81 650 device.plcs.sequencer.state.enabled = value;
Diletant 161:efd949e8d536 651 break;
Diletant 161:efd949e8d536 652
Diletant 161:efd949e8d536 653 case 5://Dither drive pulse width/output frequency loop switch
Diletant 161:efd949e8d536 654 device.dither.carrier.state.enabled = value;
Diletant 161:efd949e8d536 655 break;
Diletant 161:efd949e8d536 656
Diletant 161:efd949e8d536 657 case 6://Dither drive oscillation frequency loop switch
Diletant 161:efd949e8d536 658 device.dither.oscillation.state.enabled = value;
Diletant 161:efd949e8d536 659 break;
Diletant 161:efd949e8d536 660
Diletant 161:efd949e8d536 661 case 7: //All loops switch
Diletant 161:efd949e8d536 662 device.isacs.regulator.state.enabled = value;
Diletant 166:c3c0b8a90d81 663
Diletant 161:efd949e8d536 664 device.plcs.regulator.state.enabled = value;
Diletant 166:c3c0b8a90d81 665
Diletant 166:c3c0b8a90d81 666 //device.plcs.modulator.state.enabled = value;
Diletant 166:c3c0b8a90d81 667 device.plcs.sequencer.state.enabled = value;
Diletant 166:c3c0b8a90d81 668
Diletant 161:efd949e8d536 669 device.dither.carrier.state.enabled = value;
Diletant 166:c3c0b8a90d81 670
Diletant 161:efd949e8d536 671 device.dither.oscillation.state.enabled = value;
Diletant 161:efd949e8d536 672 break;
Diletant 161:efd949e8d536 673 }
Diletant 161:efd949e8d536 674 } else {
Diletant 161:efd949e8d536 675 //RgConB - counting mode: 00 - reference counters, 01 - dither counters and moving average filter
Diletant 161:efd949e8d536 676 switch (bit){
Diletant 161:efd949e8d536 677 case 0://Moving average filter
Diletant 161:efd949e8d536 678 //TODO
Diletant 161:efd949e8d536 679 break;
Diletant 161:efd949e8d536 680
Diletant 161:efd949e8d536 681 case 1://
Diletant 161:efd949e8d536 682 //TODO
Diletant 161:efd949e8d536 683 break;
Diletant 161:efd949e8d536 684
Diletant 161:efd949e8d536 685 case 2://
Diletant 161:efd949e8d536 686 //TODO
Diletant 161:efd949e8d536 687 break;
Diletant 161:efd949e8d536 688 }
Diletant 161:efd949e8d536 689 }
Diletant 161:efd949e8d536 690
Diletant 161:efd949e8d536 691 device.user.response.code |= param & 0x10;
Diletant 161:efd949e8d536 692 }
Diletant 161:efd949e8d536 693
Diletant 161:efd949e8d536 694 void DecodeMADCR(void) {
Diletant 161:efd949e8d536 695 //TODO
Diletant 161:efd949e8d536 696 }
Diletant 161:efd949e8d536 697
Diletant 161:efd949e8d536 698 void DecodeMTmpW(void) {
Diletant 161:efd949e8d536 699 //Not compatible with new ADC
Diletant 161:efd949e8d536 700 //Just consume required amount of input:
Diletant 161:efd949e8d536 701 Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 702 Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 703 Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 704 Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 705 Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 706 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 707 }
Diletant 161:efd949e8d536 708
Diletant 161:efd949e8d536 709 void DecodeMTmpR(void) {
Diletant 161:efd949e8d536 710 //Not compatible with new ADC
Diletant 161:efd949e8d536 711 //Just consume required amount of input:
Diletant 161:efd949e8d536 712 Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 713 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 714 }
Diletant 161:efd949e8d536 715
Diletant 161:efd949e8d536 716 void DecodeMe5rW(void) {
Diletant 161:efd949e8d536 717 //TODO
Diletant 161:efd949e8d536 718 }
Diletant 161:efd949e8d536 719
Diletant 161:efd949e8d536 720 void DecodeMCntR(void) {
Diletant 161:efd949e8d536 721 //TODO
Diletant 161:efd949e8d536 722 }
Diletant 161:efd949e8d536 723
Diletant 161:efd949e8d536 724 void DecodeMFlgR(void) {
Diletant 161:efd949e8d536 725 //TODO
Diletant 161:efd949e8d536 726 }
Diletant 161:efd949e8d536 727
Diletant 161:efd949e8d536 728 void DecodeMVibW(void) {
Diletant 161:efd949e8d536 729 //TODO
Diletant 161:efd949e8d536 730 }
Diletant 161:efd949e8d536 731
Diletant 161:efd949e8d536 732 void DecodeMGphW(void) {
Diletant 161:efd949e8d536 733 uint8_t gainA = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 734 uint8_t gainB = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 735 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 736 device.isacs.potentiometers.state.a = gainA;
Diletant 161:efd949e8d536 737 device.isacs.potentiometers.state.b = gainB;
Diletant 161:efd949e8d536 738 DeviceISACSSetPotentiometers();
Diletant 161:efd949e8d536 739 }
Diletant 161:efd949e8d536 740
Diletant 161:efd949e8d536 741 uint16_t GetCompatibilityValue(uint8_t index) {
Diletant 161:efd949e8d536 742
Diletant 161:efd949e8d536 743 return 0;
Diletant 161:efd949e8d536 744 }
Diletant 161:efd949e8d536 745
Diletant 161:efd949e8d536 746 void DecodeMParamR(void) {
Diletant 161:efd949e8d536 747 //TODO
Diletant 161:efd949e8d536 748 uint8_t index = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 749 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 750
Diletant 161:efd949e8d536 751 uint16_t param16;
Diletant 161:efd949e8d536 752 switch (index){
Diletant 161:efd949e8d536 753 case 0:
Diletant 161:efd949e8d536 754 param16 = device.user.address;
Diletant 161:efd949e8d536 755 break;
Diletant 161:efd949e8d536 756
Diletant 161:efd949e8d536 757 case 27:
Diletant 161:efd949e8d536 758 case 28:
Diletant 161:efd949e8d536 759 case 29:
Diletant 161:efd949e8d536 760 case 30:
Diletant 161:efd949e8d536 761 case 31:
Diletant 161:efd949e8d536 762 case 32:
Diletant 161:efd949e8d536 763 case 33:
Diletant 161:efd949e8d536 764 case 34:
Diletant 161:efd949e8d536 765 case 35:
Diletant 161:efd949e8d536 766 case 36:
Diletant 161:efd949e8d536 767 case 37:
Diletant 161:efd949e8d536 768 case 38:
Diletant 161:efd949e8d536 769 case 39:
Diletant 161:efd949e8d536 770 case 40:
Diletant 161:efd949e8d536 771 case 41:
Diletant 161:efd949e8d536 772 case 42:
Diletant 161:efd949e8d536 773 case 43:
Diletant 161:efd949e8d536 774 break;
Diletant 161:efd949e8d536 775
Diletant 161:efd949e8d536 776 case 61:
Diletant 161:efd949e8d536 777 param16 = device.sensor.settings.id;
Diletant 161:efd949e8d536 778 break;
Diletant 161:efd949e8d536 779
Diletant 161:efd949e8d536 780 case 64:
Diletant 161:efd949e8d536 781 case 65:
Diletant 161:efd949e8d536 782 case 66:
Diletant 161:efd949e8d536 783 case 67:
Diletant 161:efd949e8d536 784 case 68:
Diletant 161:efd949e8d536 785 case 69:
Diletant 161:efd949e8d536 786 case 70:
Diletant 161:efd949e8d536 787 case 71:
Diletant 161:efd949e8d536 788 case 72:
Diletant 161:efd949e8d536 789 case 73:
Diletant 161:efd949e8d536 790 case 74:
Diletant 161:efd949e8d536 791 case 75:
Diletant 161:efd949e8d536 792 case 76:
Diletant 161:efd949e8d536 793 case 77:
Diletant 161:efd949e8d536 794 case 78:
Diletant 161:efd949e8d536 795 case 79:
Diletant 161:efd949e8d536 796 case 81:
Diletant 161:efd949e8d536 797 case 82:
Diletant 161:efd949e8d536 798 case 84:
Diletant 161:efd949e8d536 799 case 85:
Diletant 161:efd949e8d536 800 case 87:
Diletant 161:efd949e8d536 801 case 88:
Diletant 161:efd949e8d536 802 case 90:
Diletant 161:efd949e8d536 803 case 91:
Diletant 161:efd949e8d536 804 case 93:
Diletant 161:efd949e8d536 805 case 94:
Diletant 161:efd949e8d536 806 case 96:
Diletant 161:efd949e8d536 807 case 97:
Diletant 161:efd949e8d536 808 case 99:
Diletant 161:efd949e8d536 809 case 100:
Diletant 161:efd949e8d536 810 case 102:
Diletant 161:efd949e8d536 811 case 103:
Diletant 161:efd949e8d536 812 case 105:
Diletant 161:efd949e8d536 813 case 106:
Diletant 161:efd949e8d536 814 case 108:
Diletant 161:efd949e8d536 815 case 109:
Diletant 161:efd949e8d536 816 case 111:
Diletant 161:efd949e8d536 817 case 112:
Diletant 161:efd949e8d536 818 case 114:
Diletant 161:efd949e8d536 819 case 115:
Diletant 161:efd949e8d536 820 case 117:
Diletant 161:efd949e8d536 821 case 118:
Diletant 161:efd949e8d536 822 case 121:
Diletant 161:efd949e8d536 823 case 122:
Diletant 161:efd949e8d536 824 case 124:
Diletant 161:efd949e8d536 825 case 125:
Diletant 161:efd949e8d536 826 /*reserved*/
Diletant 161:efd949e8d536 827 break;
Diletant 161:efd949e8d536 828
Diletant 161:efd949e8d536 829 default: DecodeFail();
Diletant 161:efd949e8d536 830 }
Diletant 161:efd949e8d536 831 }
Diletant 161:efd949e8d536 832
Diletant 161:efd949e8d536 833 void DecodeMParamW(void) {
Diletant 161:efd949e8d536 834 uint8_t index = Decode8(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 835 uint8_t param = Decode16(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 836 DecodeCRC(); if (device.user.decoder.error) return;
Diletant 161:efd949e8d536 837
Diletant 161:efd949e8d536 838 switch (index){
Diletant 161:efd949e8d536 839 case 0:
Diletant 161:efd949e8d536 840 device.user.address = param;
Diletant 161:efd949e8d536 841 break;
Diletant 161:efd949e8d536 842
Diletant 161:efd949e8d536 843 case 27:
Diletant 161:efd949e8d536 844 case 28:
Diletant 161:efd949e8d536 845 case 29:
Diletant 161:efd949e8d536 846 case 30:
Diletant 161:efd949e8d536 847 case 31:
Diletant 161:efd949e8d536 848 case 32:
Diletant 161:efd949e8d536 849 case 33:
Diletant 161:efd949e8d536 850 case 34:
Diletant 161:efd949e8d536 851 case 35:
Diletant 161:efd949e8d536 852 case 36:
Diletant 161:efd949e8d536 853 case 37:
Diletant 161:efd949e8d536 854 case 38:
Diletant 161:efd949e8d536 855 case 39:
Diletant 161:efd949e8d536 856 case 40:
Diletant 161:efd949e8d536 857 case 41:
Diletant 161:efd949e8d536 858 case 42:
Diletant 161:efd949e8d536 859 case 43:
Diletant 161:efd949e8d536 860 break;
Diletant 161:efd949e8d536 861
Diletant 161:efd949e8d536 862 case 61:
Diletant 161:efd949e8d536 863 device.sensor.settings.id = param;
Diletant 161:efd949e8d536 864 break;
Diletant 161:efd949e8d536 865
Diletant 161:efd949e8d536 866 case 64:
Diletant 161:efd949e8d536 867 case 65:
Diletant 161:efd949e8d536 868 case 66:
Diletant 161:efd949e8d536 869 case 67:
Diletant 161:efd949e8d536 870 case 68:
Diletant 161:efd949e8d536 871 case 69:
Diletant 161:efd949e8d536 872 case 70:
Diletant 161:efd949e8d536 873 case 71:
Diletant 161:efd949e8d536 874 case 72:
Diletant 161:efd949e8d536 875 case 73:
Diletant 161:efd949e8d536 876 case 74:
Diletant 161:efd949e8d536 877 case 75:
Diletant 161:efd949e8d536 878 case 76:
Diletant 161:efd949e8d536 879 case 77:
Diletant 161:efd949e8d536 880 case 78:
Diletant 161:efd949e8d536 881 case 79:
Diletant 161:efd949e8d536 882 case 81:
Diletant 161:efd949e8d536 883 case 82:
Diletant 161:efd949e8d536 884 case 84:
Diletant 161:efd949e8d536 885 case 85:
Diletant 161:efd949e8d536 886 case 87:
Diletant 161:efd949e8d536 887 case 88:
Diletant 161:efd949e8d536 888 case 90:
Diletant 161:efd949e8d536 889 case 91:
Diletant 161:efd949e8d536 890 case 93:
Diletant 161:efd949e8d536 891 case 94:
Diletant 161:efd949e8d536 892 case 96:
Diletant 161:efd949e8d536 893 case 97:
Diletant 161:efd949e8d536 894 case 99:
Diletant 161:efd949e8d536 895 case 100:
Diletant 161:efd949e8d536 896 case 102:
Diletant 161:efd949e8d536 897 case 103:
Diletant 161:efd949e8d536 898 case 105:
Diletant 161:efd949e8d536 899 case 106:
Diletant 161:efd949e8d536 900 case 108:
Diletant 161:efd949e8d536 901 case 109:
Diletant 161:efd949e8d536 902 case 111:
Diletant 161:efd949e8d536 903 case 112:
Diletant 161:efd949e8d536 904 case 114:
Diletant 161:efd949e8d536 905 case 115:
Diletant 161:efd949e8d536 906 case 117:
Diletant 161:efd949e8d536 907 case 118:
Diletant 161:efd949e8d536 908 case 121:
Diletant 161:efd949e8d536 909 case 122:
Diletant 161:efd949e8d536 910 case 124:
Diletant 161:efd949e8d536 911 case 125:
Diletant 161:efd949e8d536 912 /*reserved*/
Diletant 161:efd949e8d536 913 break;
Diletant 161:efd949e8d536 914
Diletant 161:efd949e8d536 915 default: DecodeFail();
Diletant 161:efd949e8d536 916 }
Diletant 161:efd949e8d536 917 }
Diletant 161:efd949e8d536 918
Diletant 161:efd949e8d536 919 void DecodeMRate2(void) {
Diletant 161:efd949e8d536 920 //TODO
Diletant 161:efd949e8d536 921 }
Diletant 161:efd949e8d536 922
Diletant 161:efd949e8d536 923 void DecodeMRate3(void) {
Diletant 161:efd949e8d536 924 //TODO
Diletant 161:efd949e8d536 925 }
Diletant 161:efd949e8d536 926
Diletant 161:efd949e8d536 927 void DecodeMe5raW(void) {
Diletant 161:efd949e8d536 928 //TODO
Diletant 161:efd949e8d536 929 }