Find variable in Object Dictionary *****************************************/
| 92 | |
| 93 | /* Find variable in Object Dictionary *****************************************/ |
| 94 | static void findVariable(CO_trace_t *trace) { |
| 95 | bool_t err = false; |
| 96 | uint16_t index; |
| 97 | uint8_t subIndex; |
| 98 | uint8_t dataLen; |
| 99 | void *OdDataPtr = NULL; |
| 100 | unsigned dtIndex = 0; |
| 101 | |
| 102 | /* parse mapping */ |
| 103 | index = (uint16_t) ((*trace->map) >> 16); |
| 104 | subIndex = (uint8_t) ((*trace->map) >> 8); |
| 105 | dataLen = (uint8_t) (*trace->map); |
| 106 | if((dataLen & 0x07) != 0) { /* data length must be byte aligned */ |
| 107 | err = true; |
| 108 | } |
| 109 | dataLen >>= 3; /* in bytes now */ |
| 110 | if(dataLen == 0) { |
| 111 | dataLen = 4; |
| 112 | } |
| 113 | |
| 114 | /* find mapped variable, if map available */ |
| 115 | if(!err && (index != 0 || subIndex != 0)) { |
| 116 | uint16_t entryNo = CO_OD_find(trace->SDO, index); |
| 117 | |
| 118 | if(index >= 0x1000 && entryNo != 0xFFFF && subIndex <= trace->SDO->OD[entryNo].maxSubIndex) { |
| 119 | OdDataPtr = CO_OD_getDataPointer(trace->SDO, entryNo, subIndex); |
| 120 | } |
| 121 | |
| 122 | if(OdDataPtr != NULL) { |
| 123 | uint16_t len = CO_OD_getLength(trace->SDO, entryNo, subIndex); |
| 124 | |
| 125 | if(len < dataLen) { |
| 126 | dataLen = len; |
| 127 | } |
| 128 | } |
| 129 | else { |
| 130 | err = true; |
| 131 | } |
| 132 | } |
| 133 | |
| 134 | /* Get function pointers for correct data type */ |
| 135 | if(!err) { |
| 136 | /* first sequence: data length */ |
| 137 | switch(dataLen) { |
| 138 | case 1: dtIndex = 0; break; |
| 139 | case 2: dtIndex = 1; break; |
| 140 | case 4: dtIndex = 2; break; |
| 141 | default: err = true; break; |
| 142 | } |
| 143 | /* second sequence: signed or unsigned */ |
| 144 | if(((*trace->format) & 1) == 1) { |
| 145 | dtIndex += 3; |
| 146 | } |
| 147 | /* third sequence: Output type */ |
| 148 | dtIndex += ((*trace->format) >> 1) * 6; |
| 149 | |
| 150 | if(dtIndex > (sizeof(dataTypes) / sizeof(CO_trace_dataType_t))) { |
| 151 | err = true; |
no outgoing calls
no test coverage detected