MCPcopy Create free account
hub / github.com/CANopenNode/CANopenNode / findVariable

Function findVariable

extra/CO_trace.c:94–169  ·  view source on GitHub ↗

Find variable in Object Dictionary *****************************************/

Source from the content-addressed store, hash-verified

92
93/* Find variable in Object Dictionary *****************************************/
94static 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;

Callers 2

CO_ODF_traceConfigFunction · 0.85
CO_trace_initFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected