123

Dependencies:   mbed

Fork of LG by igor Apu

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