MCPcopy Create free account
hub / github.com/dalathegreat/Battery-Emulator / serve

Method serve

Software/src/lib/eModbus-eModbus/ModbusServerRTU.cpp:148–253  ·  view source on GitHub ↗

serve: loop until killed and receive messages from the RTU interface

Source from the content-addressed store, hash-verified

146
147// serve: loop until killed and receive messages from the RTU interface
148void 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]) {

Callers

nothing calls this directly

Calls 12

microsFunction · 0.85
sendFunction · 0.85
delayFunction · 0.85
getWorkerMethod · 0.80
getFunctionCodeMethod · 0.80
resizeMethod · 0.80
isServerForMethod · 0.80
setErrorMethod · 0.80
getServerIDMethod · 0.80
getErrorMethod · 0.80
clearMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected