8 #ifndef K_FIRESYNC_SPOT_H
9 #define K_FIRESYNC_SPOT_H
16 #include <kFireSync/Data/kSpot.x.h>
18 #define kSPOT_CENTRE_SHIFT (8) // centre shift
19 #define kSPOT_CENTRE_SCALE (1 << kSPOT_CENTRE_SHIFT) // centre scale
47 typedef struct kFpgaCSum
57 typedef struct kFpgaCSum3
64 return cs->csum3 & kFPGA_CSUM3_OVERFLOW_MASK;
69 return (cs->csum3 & kFPGA_CSUM3_SUM_MASK) >> kFPGA_CSUM3_SUM_SHIFT;
74 return (cs->csum3 & kFPGA_CSUM3_WSUM_MASK) >> kFPGA_CSUM3_WSUM_SHIFT;
101 return (kCSUM4_SUM_MASK >> kCSUM4_SUM_SHIFT) - 1;
111 return (kCSUM4_WSUM_MASK >> kCSUM4_WSUM_SHIFT) - 1;
133 cs->csum = kCSUM4_OVERFLOW;
146 return cs->csum == kCSUM4_OVERFLOW;
223 #define kPHASE_PIXEL_2_NULL_PHASE (0xFFFFFF)
291 typedef struct kFpgaSpot
300 return (((cg->center_width & kxFPGA_SPOT_CENTER_MASK2) >> kxFPGA_SPOT_CENTER_SHIFT2) << kxFPGA_SPOT_CENTER_SIZE1) |
301 (cg->center_width & kxFPGA_SPOT_CENTER_MASK1);
306 return (cg->center_width & kxFPGA_SPOT_SPOT_WIDTH_MASK) >> kxFPGA_SPOT_SPOT_WIDTH_SHIFT;
311 return (((cg->sum_misc & kxFPGA_SPOT_SLICE_MASK2) >> kxFPGA_SPOT_SLICE_SHIFT2) << kxFPGA_SPOT_SLICE_SIZE1) |
312 (cg->slice & kxFPGA_SPOT_SLICE_MASK1);
317 return cg->sum_misc & kxFPGA_SPOT_MISC_EMPTY_MASK;
322 return (cg->sum_misc & kxFPGA_SPOT_MISC_SUM_MASK) >> kxFPGA_SPOT_MISC_SUM_SHIFT;
327 return ((cg->center_width & kxFPGA_SPOT_SOBEL_ENTRY_VALUE_MASK2) >> kxFPGA_SPOT_SOBEL_ENTRY_VALUE_SHIFT2) +
328 ((cg->slice & kxFPGA_SPOT_SOBEL_ENTRY_VALUE_MASK1) >> kxFPGA_SPOT_SOBEL_ENTRY_VALUE_SHIFT1);
345 k32u value = ((cg->center_width & kxFPGA_SPOT_SOBEL_ENTRY_VALUE_MASK2) >> kxFPGA_SPOT_SOBEL_ENTRY_VALUE_SHIFT2) +
346 ((cg->slice & kxFPGA_SPOT_SOBEL_ENTRY_VALUE_MASK1) >> kxFPGA_SPOT_SOBEL_ENTRY_VALUE_SHIFT1);
348 return value << (kSPOT_CENTRE_SHIFT - kxFPGA_WIDE_SPOT_SOBEL_ENTRY_OFFSET_FRACTIONAL_BITS);
365 k32u value = ((cg->center_width & kxFPGA_SPOT_SOBEL_ENTRY_VALUE_MASK2) >> kxFPGA_SPOT_SOBEL_ENTRY_VALUE_SHIFT2) +
366 ((cg->slice & kxFPGA_SPOT_SOBEL_ENTRY_VALUE_MASK1) >> kxFPGA_SPOT_SOBEL_ENTRY_VALUE_SHIFT1);
368 return value << (kSPOT_CENTRE_SHIFT - kxFPGA_WIDE_SPOT_SOBEL_EXIT_OFFSET_FRACTIONAL_BITS);
373 return (cg->sum_misc & kxFPGA_SPOT_MISC_ORIENT_MASK) == 0;
378 return (cg->sum_misc & kxFPGA_SPOT_MISC_ORIENT_MASK) != 0;
408 return (((cg->center_width & kxFPGA_WIDE_SPOT_CENTER_MASK2) >> kxFPGA_WIDE_SPOT_CENTER_SHIFT2) << kxFPGA_WIDE_SPOT_CENTER_SIZE1) |
409 (cg->center_width & kxFPGA_WIDE_SPOT_CENTER_MASK1);
421 return ((cg->center_width & kxFPGA_WIDE_SPOT_SPOT_WIDTH_MASK) >> kxFPGA_WIDE_SPOT_SPOT_WIDTH_SHIFT) << kxFPGA_WIDE_SPOT_MULTIPLIER_SHIFT;
433 return (((cg->sum_misc & kxFPGA_WIDE_SPOT_SLICE_MASK2) >> kxFPGA_WIDE_SPOT_SLICE_SHIFT2) << kxFPGA_WIDE_SPOT_SLICE_SIZE1) |
434 (cg->slice & kxFPGA_WIDE_SPOT_SLICE_MASK1);
446 return (cg->sum_misc & kxFPGA_WIDE_SPOT_MISC_EMPTY_MASK) != 0;
458 return ((cg->sum_misc & kxFPGA_WIDE_SPOT_MISC_SUM_MASK) >> kxFPGA_WIDE_SPOT_MISC_SUM_SHIFT) << kxFPGA_WIDE_SPOT_MULTIPLIER_SHIFT;
475 return ((cg->center_width & kxFPGA_WIDE_SPOT_SOBEL_SPARE_MASK2) >> kxFPGA_WIDE_SPOT_SOBEL_SPARE_SHIFT2) +
476 ((cg->slice & kxFPGA_WIDE_SPOT_SOBEL_SPARE_MASK1) >> kxFPGA_WIDE_SPOT_SOBEL_SPARE_SHIFT1);
493 k32u value = ((cg->center_width & kxFPGA_WIDE_SPOT_SOBEL_SPARE_MASK2) >> kxFPGA_WIDE_SPOT_SOBEL_SPARE_SHIFT2) +
494 ((cg->slice & kxFPGA_WIDE_SPOT_SOBEL_SPARE_MASK1) >> kxFPGA_WIDE_SPOT_SOBEL_SPARE_SHIFT1);
496 return value << (kSPOT_CENTRE_SHIFT - kxFPGA_WIDE_SPOT_SOBEL_ENTRY_OFFSET_FRACTIONAL_BITS);
513 k32u value = ((cg->center_width & kxFPGA_WIDE_SPOT_SOBEL_SPARE_MASK2) >> kxFPGA_WIDE_SPOT_SOBEL_SPARE_SHIFT2) +
514 ((cg->slice & kxFPGA_WIDE_SPOT_SOBEL_SPARE_MASK1) >> kxFPGA_WIDE_SPOT_SOBEL_SPARE_SHIFT1);
516 return value << (kSPOT_CENTRE_SHIFT - kxFPGA_WIDE_SPOT_SOBEL_EXIT_OFFSET_FRACTIONAL_BITS);
522 return (cg->sum_misc & kxFPGA_WIDE_SPOT_MISC_ORIENT_MASK) == 0;
524 kDeprecate(kFpgaWideSpot_IsColumn)
529 return (cg->sum_misc & kxFPGA_WIDE_SPOT_MISC_ORIENT_MASK) != 0;
531 kDeprecate(kFpgaWideSpot_IsRow)
636 kFsFx(
k32u) kSpot_NoiseBackground(
kImage image);
642 #define kSPOT_FPGA_2I_CENTRE_SHIFT (kSPOT_CENTRE_SHIFT) // Focalspec FPGA uses 9; we use 8 to match kSPOT
643 #define kSPOT_FPGA_2I_CENTRE_SCALE (1 << kSPOT_FPGA_2I_CENTRE_SHIFT)
644 #define kSPOT_FPGA_2I_FRACTIONAL_SHIFT (10)
645 #define kSPOT_FPGA_2I_FRACTIONAL_DISCARD_SHIFT (kSPOT_FPGA_2I_FRACTIONAL_SHIFT - kSPOT_FPGA_2I_CENTRE_SHIFT)
647 #define kSPOT_FPGA_2I_SHIFT (4)
648 #define kSPOT_FPGA_2I_SCALE (1 << kSPOT_FPGA_2I_SHIFT)
651 #define kSPOT_FPGA_2I_MAX_FILTER_SIZE (16)
652 #define kSPOT_FPGA_2I_FILTER_SHIFT (kSPOT_FPGA_2I_MAX_FILTER_SIZE / 2)
671 #define kSPOT_FPGA_2I_CENTRE_LSB ((k64u) 0)
672 #define kSPOT_FPGA_2I_CENTRE_MSB ((k64u) 21)
674 #define kSPOT_FPGA_2I_DETECTION_LSB ((k64u) 24)
675 #define kSPOT_FPGA_2I_DETECTION_MSB ((k64u) 35)
676 #define kSPOT_FPGA_2I_INTENSITY_LSB ((k64u) 36)
677 #define kSPOT_FPGA_2I_INTENSITY_MSB ((k64u) 47)
679 #define kSPOT_FPGA_2I_SLICE_LSB ((k64u) 48)
680 #define kSPOT_FPGA_2I_SLICE_MSB ((k64u) 61)
682 #define kSPOT_FPGA_2I_PATCH_LSB ((k64u) 63)
683 #define kSPOT_FPGA_2I_PATCH_MSB ((k64u) 63)
686 #define kFpgaSpot2i_BitCount_(FIELD) (kSPOT_FPGA_2I_##FIELD##_MSB - kSPOT_FPGA_2I_##FIELD##_LSB + 1)
875 kSize lastPositiveIndex,
k16s lastPositiveGradient,
kSize firstNegativeIndex,
k16s firstNegativeGradient)
878 const k32u lastPositiveIndex32u = (
k32u) lastPositiveIndex;
879 const k32u firstNegativeIndex32u = (
k32u) firstNegativeIndex;
880 const k32u absPositiveGradient32u = (
k32u) lastPositiveGradient;
881 const k32u absNegativeGradient32u = (
k32u) (-firstNegativeGradient);
883 const k32u scaledPosition = firstNegativeIndex32u << kSPOT_FPGA_2I_CENTRE_SHIFT;
886 const k32u saturationOffset = firstNegativeIndex32u - lastPositiveIndex32u - 1;
887 const k32u scaledSaturationOffset = saturationOffset << (kSPOT_FPGA_2I_CENTRE_SHIFT - 1);
890 const k32u deltaGrad = absPositiveGradient32u + absNegativeGradient32u;
891 const k32u scaledNegativeGrad = absNegativeGradient32u << kSPOT_FPGA_2I_FRACTIONAL_SHIFT;
892 const k32u scaledSubpixelShift = (scaledNegativeGrad / deltaGrad) >> kSPOT_FPGA_2I_FRACTIONAL_DISCARD_SHIFT;
894 const k32u interpolatedCentre = scaledPosition - scaledSaturationOffset - scaledSubpixelShift;
896 return interpolatedCentre;
kStatus kFpgaSpot2i_ConvertFrom(kFpgaSpot2i *outSpots, kSpot const *inSpots, kSize count=1)
Populate kFpgaSpot2i(s) from kSpot(s)
void kFpgaSpot2i_Zero(kFpgaSpot2i *spot)
Zero the spot.
Definition: kSpot.h:747
#define kField_CreateNamed_(FIELD_NAME, FLD_VAL)
Creates a bitfield by token-pasting mask/shift macros using a specific naming scheme.
Definition: kFsDef.h:558
void kCSum4_SetWSum(kCSum4 *cs, k32u wsum)
Sets the weighted sum component of the CSum value.
Definition: kSpot.h:177
kBool kCSum4_IsOverflow(const kCSum4 *cs)
Reports whether the csum represents an 'overflow' result.
Definition: kSpot.h:144
void kCSum4_Init(kCSum4 *cs, k32u sum, k32u wsum)
Initializes a csum to a valid value.
Definition: kSpot.h:121
k32u kFpgaSpot2i_Centre(const kFpgaSpot2i *spot)
Extract spot centre from packed kFpgaSpot2i.
Definition: kSpot.h:758
Bit-packed spot structure for FocalSpec spot algorithm Range Count Use 63..63 1 Patch 62...
Definition: kSpot.h:666
k32u kFpgaWideSpot_ExitOffset(const kFpgaWideSpot *cg)
Reports the spot exit offset.
Definition: kSpot.h:511
k16u kFpgaSpot2i_Detection(kFpgaSpot2i const *spot)
Extract Detection filter value from packed kFpgaSpot2i.
Definition: kSpot.h:769
k16u kFpgaSpot2i_Intensity(kFpgaSpot2i const *spot)
Extract Intensity from packed kFpgaSpot2i.
Definition: kSpot.h:780
void kPhasePixel2_SetIntensity(kPhasePixel2 *phasePixel, k8u intensity)
Sets the intensity value in a kPhasePixel2 structure.
Definition: kSpot.h:258
Represents a CSum value in the format produced by the Binarize-CSum camera algorithm (version 4)...
Definition: kSpot.h:87
Represents a laser line spot detected within an image.
Definition: kSpot.h:392
Represents camera algorithm spot sort options.
kStatus kSpot_SobelvZc(kImage image, kArrayList spots, kSize edgeWindow, kSize averageWindow, kSize intensityWindow, k16u threshold, kImage edgeImage=kNULL, kImage averageImage=kNULL, kImage intensityImage=kNULL, kSize const *roi=kNULL)
Focalspec Moving Average + Zero Crossing spot detector reference implementation.
k16u kFpgaWideSpot_Sum(const kFpgaWideSpot *cg)
Reports the spot intensity sum.
Definition: kSpot.h:456
k16u kFpgaWideSpot_Width(const kFpgaWideSpot *cg)
Gets the spot width.
Definition: kSpot.h:419
k16u kFpgaSpot2i_Slice(kFpgaSpot2i const *spot)
Extract Slice index from packed kFpgaSpot2i.
Definition: kSpot.h:791
Essential declarations related to FireSync nodes.
k8u kPhasePixel2_Intensity(kPhasePixel2 phasePixel)
Extracts the intensity field from a kPhasePixel2 structure.
Definition: kSpot.h:246
kStatus kFpgaSpot2i_ConvertTo(kFpgaSpot2i const *inSpots, kSpot *outSpots, kSize count=1)
Populate kSpot(s) from kFpgaSpot2i(s)
void kFpgaSpot2i_SetIntensity(kFpgaSpot2i *spot, k64u const intensity)
Set intensity in packed kFpgaSpot2i.
Definition: kSpot.h:716
k32u csum
Column sum fields.
Definition: kSpot.h:89
Represents a phase result produced by PL stripe+phase hardware acceleration algorithm.
Definition: kSpot.h:203
void kFpgaSpot2i_SetCentre(kFpgaSpot2i *spot, k64u const centre)
Set centre position in packed kFpgaSpot2i.
Definition: kSpot.h:694
#define kField_ExtractNamedRange_(REG_VAL, FIELD_NAME)
Extracts a bitfield by token-pasting left/right macros using a specific naming scheme.
Definition: kFsDef.h:633
Essential API declarations for the kFireSync library.
void kFpgaSpot2i_SetSlice(kFpgaSpot2i *spot, k64u const slice)
Set slice index in packed kFpgaSpot2i.
Definition: kSpot.h:727
k32u kSpot_InterpolateSobelvZcSpotCentre(kSize lastPositiveIndex, k16s lastPositiveGradient, kSize firstNegativeIndex, k16s firstNegativeGradient)
Integer math Focalspec spot centre interpolation.
Definition: kSpot.h:874
void kCSum4_SetSum(kCSum4 *cs, k32u sum)
Sets the sum component of the CSum value.
Definition: kSpot.h:155
k32u kPhasePixel2_Phase(kPhasePixel2 phasePixel)
Extracts the phase field from a kPhasePixel2 structure.
Definition: kSpot.h:270
#define kField_ExtractNamed_(REG_VAL, FIELD_NAME)
Extracts a bitfield by token-pasting mask/shift macros using a specific naming scheme.
Definition: kFsDef.h:606
k32u kFpgaWideSpot_Centre(const kFpgaWideSpot *cg)
Gets the spot centroid.
Definition: kSpot.h:406
k16u kFpgaWideSpot_Slice(const kFpgaWideSpot *cg)
Gets the spot slice index (column or row, depending on orientiation).
Definition: kSpot.h:431
k32u kFpgaWideSpot_EntryOffset(const kFpgaWideSpot *cg)
Reports the spot entry offset.
Definition: kSpot.h:491
k32u kCSum4_WSum(const kCSum4 *cs)
Reports the weighted-sum component of the CSum value.
Definition: kSpot.h:188
void kPhasePixel2_SetPhase(kPhasePixel2 *phasePixel, k32u phase)
Sets the phase value in a kPhasePixel2 structure.
Definition: kSpot.h:282
#define kField_InsertNamed_(REG_REF, FIELD_NAME, FLD_VAL)
Inserts a bitfield into an existing register value by token-pasting mask/shift macros using a specifi...
Definition: kFsDef.h:654
k32u kFpgaWideSpot_EntryValue(const kFpgaWideSpot *cg)
Reports the spot entry intensity value.
Definition: kSpot.h:473
void kFpgaSpot2i_SetDetection(kFpgaSpot2i *spot, k64u const detection)
Set detection filter value in packed kFpgaSpot2i.
Definition: kSpot.h:705
void kFpgaSpot2i_SetPatch(kFpgaSpot2i *spot, kBool isPatch)
Set patch in packed kFpgaSpot2i.
Definition: kSpot.h:738
Represents a phase result produced by PL stripe+phase hardware acceleration algorithm.
Definition: kSpot.h:218
void kCSum4_InitOverflow(kCSum4 *cs)
Initializes a csum to represent the 'overflow' condition.
Definition: kSpot.h:131
#define kField_InsertNamedRange_(REG_REF, FIELD_NAME, FLD_VAL)
Inserts a bitfield into an existing register value by token-pasting left/right macros using a specifi...
Definition: kFsDef.h:681
k16u kFpgaWideSpot_IsEmpty(const kFpgaWideSpot *cg)
Reports whether the spot is empty (null, filler).
Definition: kSpot.h:444
k32u kCSum4_MaxSum()
Reports the maximum sum that can be represented by this data type.
Definition: kSpot.h:99
k32u kCSum4_MaxWSum()
Reports the maximum weighted sum that can be represented by this data type.
Definition: kSpot.h:109
k32u kCSum4_Sum(const kCSum4 *cs)
Reports the sum component of the CSum value.
Definition: kSpot.h:166
void kPhasePixel2_Init(kPhasePixel2 *phasePixel, k32u phase, k8u intensity)
Initializes a kPhasePixel2 stucture.
Definition: kSpot.h:233
kBool kFpgaSpot2i_Patch(kFpgaSpot2i const *spot)
Extract patch from packed kFpgaSpot2i.
Definition: kSpot.h:802