Epoch time realtime component help
06 Nov 2023 03:22 - 06 Nov 2023 03:27 #284682
by dberndt
Epoch time realtime component help was created by dberndt
Hello all,
I'm looking to get epoch time (seconds since linux epoch jan1, 1970) onto a float pin so that I can compare that with the epoch time a userspace component will generate in post-processing of some halsample'd data. Basically so I can understand the lag and re-stitch the data offline.
I've never written a realtime component before and my C hasn't been used much in a couple of decades. Perhaps I could get some assistance?
This does get a number into the the output pin, but it does not seem to update every time the function is called. Though it does seem to work on occasion for a few seconds, or that is just a C induced hallucination.
I eventually need to add milliseconds to this, but that seems trivial to pull out of tv_usec.
Can anyone point me in the right direction?
During this coding journey I found it pretty annoying that larger floats just print in exponent notation in all the linuxcnc tools. How do I go about viewing the full value of a float in halmeter, halcmd, anything? Is there a flag/option for this somewhere?
Thanks,
-Dave
Edit I'm compiling with halcompile mycomp.comp followed by halcompile --install mycomp.comp
Running 2.9pre1 RIP on Mint 21.
I'm looking to get epoch time (seconds since linux epoch jan1, 1970) onto a float pin so that I can compare that with the epoch time a userspace component will generate in post-processing of some halsample'd data. Basically so I can understand the lag and re-stitch the data offline.
I've never written a realtime component before and my C hasn't been used much in a couple of decades. Perhaps I could get some assistance?
pin out float totalmseconds "totalmseconds";
variable int curtime;
function _;
;;
#include <stdio.h>
#include <stdint.h>
#include <sys/time.h>
FUNCTION(_) {
struct timeval tv;
struct timezone tz;
gettimeofday(&tv, &tz);
curtime = (long int)tv.tv_sec;
//subtract 1699.... just to make the float smaller so it'll print more nicely in halmeter/halcmd/etc
totalmseconds = (float)curtime - 1699226972;
}
This does get a number into the the output pin, but it does not seem to update every time the function is called. Though it does seem to work on occasion for a few seconds, or that is just a C induced hallucination.
I eventually need to add milliseconds to this, but that seems trivial to pull out of tv_usec.
Can anyone point me in the right direction?
During this coding journey I found it pretty annoying that larger floats just print in exponent notation in all the linuxcnc tools. How do I go about viewing the full value of a float in halmeter, halcmd, anything? Is there a flag/option for this somewhere?
Thanks,
-Dave
Edit I'm compiling with halcompile mycomp.comp followed by halcompile --install mycomp.comp
Running 2.9pre1 RIP on Mint 21.
Last edit: 06 Nov 2023 03:27 by dberndt.
Please Log in or Create an account to join the conversation.
06 Nov 2023 07:40 #284686
by rodw
Replied by rodw on topic Epoch time realtime component help
I don't think its necessary to use any conversion to get epocch time
Ref: www.tutorialspoint.com/c_standard_library/c_function_time.htm
#include <stdio.h>
#include <time.h>
int main () {
time_t seconds;
seconds = time(NULL);
printf("Hours since January 1, 1970 = %ld\n", seconds/3600);
return(0);
}
Ref: www.tutorialspoint.com/c_standard_library/c_function_time.htm
Please Log in or Create an account to join the conversation.
08 Nov 2023 04:43 #284838
by dberndt
Replied by dberndt on topic Epoch time realtime component help
Thanks. I got it working. I'll leave the ugly code below, it's got a bunch of extra logic in there that didn't end up being used but I don't want to clean it up and potentially break it and post it as code I'm actually using when I'm not.
I'd still love to see a way to display floats in a more useful way. Displaying epoch seconds as a float is kind of disasterous. 1.699373e+09 is just not that helpful...
I'd still love to see a way to display floats in a more useful way. Displaying epoch seconds as a float is kind of disasterous. 1.699373e+09 is just not that helpful...
// Output Pins
pin out float totalmseconds "totalmsecondsaaa";
variable int curtime;
variable int curms;
variable int firstrun = 0;
variable int counter = 0;
variable float elapsedtime = 0;
function _;
;;
#include <stdio.h>
#include <stdint.h>
#include <sys/time.h>
struct timeval tv;
struct timezone tz;
FUNCTION(_) {
//totalmseconds = (float)curtime - 1699226972;
if (firstrun == 0) {
firstrun = 1;
}
elapsedtime += period * 0.000000001;
if (counter % 1 == 0) {
counter = 1;
gettimeofday(&tv, &tz);
curtime = (long int)tv.tv_sec;
curms = (long int)tv.tv_usec;
//printf("***** curtime: %d %d\n", curtime, curms);
//printf("%lf\n", elapsedtime);
totalmseconds = curtime + ((float)curms * 0.000001);
}
counter += 1;
}
Please Log in or Create an account to join the conversation.
Time to create page: 0.133 seconds