-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Only load each wide integer once in MODBUS_SET_INT*_TO_INT*() macros #684
base: master
Are you sure you want to change the base?
Conversation
We require contributors to sign our Contributor License Agreement. In order for us to review and merge your code, please fill https://forms.gle/5635zjphDo5JEJQSA to get added. Your document will be manually checked by the maintainer. Be patient... |
lmfao |
yeah im not posting you all of my PII im not fucking insane. apply if you want, dont if you dont |
Insane or not the idea seems to be fine (macros as ugly in some cases) There is a little mistake in SET_INT16 and SET_INT32:
|
If you have a union like this as part of the read data: union { uint8_t serial[6]; uint16_t serial_raw[3]; }; and do the obvious for(size_t i = 0; i < sizeof(rdng.serial_raw) / sizeof(*rdng.serial_raw); ++i) { MODBUS_SET_INT16_TO_INT8(rdng.serial, i*2, rdng.serial_raw[i]); } then because serial_raw[i] is updated through serial[i] at first, then loaded again, you end up with rdng.serial[i*2]=rdng.serial[i*2+1] for all i, which is both confusing and wrong; instead, you must do for(size_t i = 0; i < sizeof(rdng.serial_raw) / sizeof(*rdng.serial_raw); ++i) { uint16_t r = rdng.serial_raw[i]; MODBUS_SET_INT16_TO_INT8(rdng.serial, i*2, rdng.serial_raw[i]); } but there's really no reason to require this, and this patch lets you use them directly
We require contributors to sign our Contributor License Agreement. In order for us to review and merge your code, please fill https://forms.gle/5635zjphDo5JEJQSA to get added. Your document will be manually checked by the maintainer. Be patient... |
Yep; updated. |
If you have a union like this as part of the read data:
and do the obvious
then because
serial_raw[i]
is updated throughserial[i]
at first, then loaded again, you end up withrdng.serial[i*2]=rdng.serial[i*2+1]
for all i, which is both confusing and wrong (for example, "PmpaF1" ends up as "PPppFF"); instead, you must dobut there's really no reason to require this, and this patch lets you use them directly