libmodbus icon indicating copy to clipboard operation
libmodbus copied to clipboard

Added a client context parameter to the modbus_t context, and getter/setter methods.

Open JetForMe opened this issue 3 years ago • 6 comments

This commit adds

  • client_context to the _modbus struct
  • modbus_set_client_context()
  • modbus_get_client_context()
  • Documentation for the above

The code otherwise ignores _modbus.client_context. It is available to calling code for it to associate its own context with the callback (typically a pointer to an object).

JetForMe avatar Jul 13 '22 08:07 JetForMe

I'm reluctant to add any new field to _modbus struct (even more a free pointer not managed). Could you explain your use case?

stephane avatar Jul 29 '22 10:07 stephane

Note that libmodbus will never do anything to that field, except pass it back in the callback. It does not own the contents of that field.

A common scenario in object-oriented languages like C++ or Swift is to wrap library data structures. In this case, I've defined a class MODBUSContext that has a pointer to modbust_t. When the library provides any kind of callback functionality, there needs to be a way for the called function to get at its own context. In my case, my class implements the custom RTS functionality, but to do so, it needs its own context. The only way to get at that context when called back by libmodbus is for libmodbus to keep track of it. I cast a pointer to my object to void*, and when my callback is called, I get that pointer out of the modbus_t struct, cast it back to my class type, and I'm off to the races.

This is a very common and widely-used pattern.

JetForMe avatar Jul 30 '22 01:07 JetForMe

@stephane Does that make sense?

JetForMe avatar Aug 14 '22 02:08 JetForMe

I've added documentation for the new functions.

JetForMe avatar Aug 24 '22 20:08 JetForMe