serve: loop until killed and receive messages from the RTU interface
| 146 | |
| 147 | // serve: loop until killed and receive messages from the RTU interface |
| 148 | void ModbusServerRTU::serve(ModbusServerRTU *myServer) { |
| 149 | ModbusMessage request; // received request message |
| 150 | ModbusMessage m; // Application's response data |
| 151 | ModbusMessage response; // Response proper to be sent |
| 152 | |
| 153 | // init microseconds timer |
| 154 | myServer->MSRlastMicros = micros(); |
| 155 | |
| 156 | while (true) { |
| 157 | // Initialize all temporary vectors |
| 158 | request.clear(); |
| 159 | response.clear(); |
| 160 | m.clear(); |
| 161 | |
| 162 | // Wait for and read an request |
| 163 | request = RTUutils::receive( |
| 164 | 'S', |
| 165 | *(myServer->MSRserial), |
| 166 | myServer->serverTimeout, |
| 167 | myServer->MSRlastMicros, |
| 168 | myServer->MSRinterval, |
| 169 | myServer->MSRuseASCII, |
| 170 | myServer->MSRskipLeadingZeroByte); |
| 171 | |
| 172 | // Request longer than 1 byte (that will signal an error in receive())? |
| 173 | if (request.size() > 1) { |
| 174 | |
| 175 | // Yes. |
| 176 | // Do we have a sniffer listening? |
| 177 | if (myServer->sniffer) { |
| 178 | // Yes. call it |
| 179 | myServer->sniffer(request); |
| 180 | } |
| 181 | // Is it a broadcast? |
| 182 | if (request[0] == 0) { |
| 183 | // Yes. Do we have a listener? |
| 184 | if (myServer->listener) { |
| 185 | // Yes. call it |
| 186 | myServer->listener(request); |
| 187 | } |
| 188 | // else we simply ignore it |
| 189 | } else { |
| 190 | // No Broadcast. |
| 191 | // Do we have a callback function registered for it? |
| 192 | MBSworker callBack = myServer->getWorker(request[0], request[1]); |
| 193 | if (callBack) { |
| 194 | // Yes, we do. Count the message |
| 195 | { |
| 196 | LOCK_GUARD(cntLock, myServer->m); |
| 197 | myServer->messageCount++; |
| 198 | } |
| 199 | // Get the user's response |
| 200 | m = callBack(request); |
| 201 | |
| 202 | // Process Response. Is it one of the predefined types? |
| 203 | if (m[0] == 0xFF && (m[1] == 0xF0 || m[1] == 0xF1)) { |
| 204 | // Yes. Check it |
| 205 | switch (m[1]) { |
nothing calls this directly
no test coverage detected