11#include <rtapi_pci.h>
22#include <rtapi_io.h>
33
4- #include <rtapi.h> // RTAPI realtime OS API
5- #include <rtapi_app.h> // RTAPI realtime module decls
6- #include <hal.h> // HAL public API decls
4+ #include "rtapi.h" // RTAPI realtime OS API
5+ #include "rtapi_app.h" // RTAPI realtime module decls
6+ #include "rtapi_stdint.h" // portable ints
7+ #include "hal.h" // HAL public API decls
78#include "gm.h" // Hardware dependent defines
89#include <rtapi_math.h>
910
@@ -16,9 +17,11 @@ typedef struct { //encoder_t
1617 // Pins
1718 hal_bit_t * reset ;
1819 hal_s32_t * counts ;
20+ hal_s64_t * counts64 ;
1921 hal_float_t * position ;
2022 hal_float_t * velocity ;
2123 hal_s32_t * rawcounts ;
24+ hal_s64_t * rawcounts64 ;
2225 hal_bit_t * index_enable ;
2326
2427 // Parameters
@@ -30,11 +33,11 @@ typedef struct { //encoder_t
3033 hal_float_t min_speed_estimate ;
3134
3235 // Private data
33- hal_s32_t raw_offset ;
34- hal_s32_t index_offset ;
35- hal_s32_t last_index_latch ;
36+ rtapi_s64 index_offset ;
37+ rtapi_s64 last_index_latch ;
3638 hal_bit_t first_index ;
3739 hal_bit_t module_exist ;
40+ rtapi_s32 old_counts ;
3841} encoder_t ;
3942
4043typedef struct { //switches_t
@@ -239,27 +242,27 @@ typedef struct { //stepgen_t
239242 hal_float_t * position_cmd ;
240243 hal_float_t * velocity_cmd ;
241244 hal_float_t * position_fb ;
242- hal_s32_t * count_fb ;
245+ hal_s64_t * count_fb ;
243246 hal_bit_t * enable ;
244247
245248 // Parameters
246249 hal_u32_t step_type ; //0: StepDir, 1: UpDown, 2: Quadrature
247- hal_bit_t control_type ; //0: position, 1: velocity
250+ hal_bit_t control_type ; //0: position, 1: velocity
248251 hal_u32_t steplen ;
249252 hal_u32_t stepspace ;
250253 hal_u32_t dirdelay ;
251254 hal_float_t maxaccel ;
252255 hal_float_t maxvel ;
253256 hal_bit_t polarity_A ;
254- hal_bit_t polarity_B ;
257+ hal_bit_t polarity_B ;
255258 hal_float_t position_scale ;
256259
257260 //Saved Parameters
258261 hal_u32_t curr_steplen ;
259262 hal_u32_t curr_stepspace ;
260263 hal_u32_t curr_dirdelay ;
261264 hal_float_t curr_maxaccel ;
262- hal_float_t curr_maxvel ;
265+ hal_float_t curr_maxvel ;
263266 hal_float_t curr_position_scale ;
264267
265268 // Private data
@@ -623,9 +626,11 @@ ExportEncoder(void *arg, int comp_id, int version)
623626 //Export Pins
624627 if (error == 0 ) error = hal_pin_bit_newf (HAL_IN , & (device -> encoder [i ].reset ), comp_id , "gm.%1d.encoder.%1d.reset" , boardId , i );
625628 if (error == 0 ) error = hal_pin_s32_newf (HAL_OUT , & (device -> encoder [i ].counts ), comp_id , "gm.%1d.encoder.%1d.counts" , boardId , i );
629+ if (error == 0 ) error = hal_pin_s64_newf (HAL_OUT , & (device -> encoder [i ].counts64 ), comp_id , "gm.%1d.encoder.%1d.counts64" , boardId , i );
626630 if (error == 0 ) error = hal_pin_float_newf (HAL_OUT , & (device -> encoder [i ].position ), comp_id , "gm.%1d.encoder.%1d.position" , boardId , i );
627631 if (error == 0 ) error = hal_pin_float_newf (HAL_OUT , & (device -> encoder [i ].velocity ), comp_id , "gm.%1d.encoder.%1d.velocity" , boardId , i );
628632 if (error == 0 ) error = hal_pin_s32_newf (HAL_OUT , & (device -> encoder [i ].rawcounts ), comp_id , "gm.%1d.encoder.%1d.rawcounts" , boardId , i );
633+ if (error == 0 ) error = hal_pin_s64_newf (HAL_OUT , & (device -> encoder [i ].rawcounts64 ), comp_id , "gm.%1d.encoder.%1d.rawcounts" , boardId , i );
629634 if (error == 0 ) error = hal_pin_bit_newf (HAL_IO , & (device -> encoder [i ].index_enable ), comp_id , "gm.%1d.encoder.%1d.index-enable" , boardId , i );
630635
631636 //Export Parameters
@@ -637,7 +642,7 @@ ExportEncoder(void *arg, int comp_id, int version)
637642 if (error == 0 ) error = hal_param_float_newf (HAL_RW , & (device -> encoder [i ].min_speed_estimate ), comp_id , "gm.%1d.encoder.%1d.min-speed-estimate" , boardId , i );
638643
639644 //Init parameters
640- device -> encoder [i ].raw_offset = pCard -> ENC_counter [i ];
645+ device -> encoder [i ].old_counts = pCard -> ENC_counter [i ];
641646 device -> encoder [i ].index_offset = 0 ;
642647 device -> encoder [i ].last_index_latch = pCard -> ENC_index_latch [i ];
643648 device -> encoder [i ].first_index = 1 ;
@@ -679,7 +684,7 @@ ExportStepgen(void *arg, int comp_id, int version)
679684 if (error == 0 ) error = hal_pin_float_newf (HAL_IN , & (device -> stepgen [i ].position_cmd ), comp_id , "gm.%1d.stepgen.%1d.position-cmd" , boardId , i );
680685 if (error == 0 ) error = hal_pin_float_newf (HAL_OUT , & (device -> stepgen [i ].position_fb ), comp_id , "gm.%1d.stepgen.%1d.position-fb" , boardId , i );
681686 if (error == 0 ) error = hal_pin_float_newf (HAL_IN , & (device -> stepgen [i ].velocity_cmd ), comp_id , "gm.%1d.stepgen.%1d.velocity-cmd" , boardId , i );
682- if (error == 0 ) error = hal_pin_s32_newf (HAL_OUT , & (device -> stepgen [i ].count_fb ), comp_id , "gm.%1d.stepgen.%1d.count-fb" , boardId , i );
687+ if (error == 0 ) error = hal_pin_s64_newf (HAL_OUT , & (device -> stepgen [i ].count_fb ), comp_id , "gm.%1d.stepgen.%1d.count-fb" , boardId , i );
683688 if (error == 0 ) error = hal_pin_bit_newf (HAL_IN , & (device -> stepgen [i ].enable ), comp_id , "gm.%1d.stepgen.%1d.enable" , boardId , i );
684689
685690 //Export Parameters.
@@ -1472,7 +1477,7 @@ encoder(void *arg, long period)
14721477 card * pCard = device -> pCard ;
14731478
14741479 int i ;
1475- hal_s32_t temp1 = 0 , temp2 ;
1480+ rtapi_s32 temp1 = 0 , temp2 , delta_counts ;
14761481 hal_float_t vel ;
14771482
14781483 //Update parameters
@@ -1529,12 +1534,15 @@ encoder(void *arg, long period)
15291534 }
15301535 }
15311536 device -> encoder [i ].last_index_latch = temp2 ;
1532-
1533- * (device -> encoder [i ].rawcounts ) = temp1 - device -> encoder [i ].raw_offset ;
1537+ delta_counts = temp1 - device -> encoder [i ].old_counts ;
1538+ device -> encoder [i ].old_counts = temp1 ;
1539+ * (device -> encoder [i ].rawcounts ) += delta_counts ;
1540+ * (device -> encoder [i ].rawcounts64 ) += delta_counts ;
15341541 * (device -> encoder [i ].counts ) = * (device -> encoder [i ].rawcounts ) - device -> encoder [i ].index_offset ;
1542+ * (device -> encoder [i ].counts64 ) = * (device -> encoder [i ].rawcounts64 ) - device -> encoder [i ].index_offset ;
15351543
15361544 if ((device -> encoder [i ].position_scale < 0.000001 ) && (device -> encoder [i ].position_scale > -0.000001 )) device -> encoder [i ].position_scale = 1 ; //Don't like to divide by 0
1537- * (device -> encoder [i ].position ) = (hal_float_t ) * (device -> encoder [i ].counts ) / device -> encoder [i ].position_scale ;
1545+ * (device -> encoder [i ].position ) = (hal_float_t ) * (device -> encoder [i ].counts64 ) / device -> encoder [i ].position_scale ;
15381546
15391547 vel = (hal_float_t ) pCard -> ENC_period [i ];
15401548 if (vel == 0 ) vel = 1 ;
0 commit comments