Commit bd35d5ce authored by Andrey Filippov's avatar Andrey Filippov
Browse files

Ported pgm_hist function

parent a40eed25
Loading
Loading
Loading
Loading
+58 −32
Original line number Original line Diff line number Diff line
@@ -1408,45 +1408,68 @@ int pgm_hist (int sensor_port, ///< sensor port number (0..3
												   ///< be applied to,  negative - ASAP
												   ///< be applied to,  negative - ASAP
												   ///< @return OK - 0, <0 - error
												   ///< @return OK - 0, <0 - error
{
{
    int sub_chn, poffs;
    int nupdate=0;
    x393_hist_left_top_t        left_top = {.d32=0};
    x393_hist_width_height_m1_t width_height = {.d32=0};
    struct {
    struct {
        long left;
        long left;
        long width;
        long width;
        long top;
        long top;
        long height;
        long height;
    } hist_setup_data;
    } hist_setup_data;
    struct frameparspair_t pars_to_update[4* MAX_SENSORS];
    /*
    struct frameparspair_t pars_to_update[4]={
    struct frameparspair_t pars_to_update[4]={
            {P_HISTWND_LEFT, 0},
            {P_HISTWND_LEFT, 0},
            {P_HISTWND_WIDTH, 0},
            {P_HISTWND_WIDTH, 0},
            {P_HISTWND_TOP, 0},
            {P_HISTWND_TOP, 0},
            {P_HISTWND_HEIGHT, 0}
            {P_HISTWND_HEIGHT, 0}
    };
    };
    */
    MDF3(printk(" frame16=%d\n",frame16));
    MDF3(printk(" frame16=%d\n",frame16));
    if (frame16 >= PARS_FRAMES) return -1; // wrong frame
    if (frame16 >= PARS_FRAMES) return -1; // wrong frame
    for (sub_chn =0; sub_chn < MAX_SENSORS; sub_chn++)  if (GLOBALPARS(sensor_port, G_SUBCHANNELS) & (1 << sub_chn)){
        poffs = HIST_SUBCHN_OFFSET * sub_chn;
        //  int fpga_addr=(frame16 <0) ? X313_SEQ_ASAP : (X313_SEQ_FRAME0+frame16);
        //  int fpga_addr=(frame16 <0) ? X313_SEQ_ASAP : (X313_SEQ_FRAME0+frame16);
        // calculate absolute window from the relative, apply limits
        // calculate absolute window from the relative, apply limits
    hist_setup_data.width=  ((thispars->pars[P_HISTWND_RWIDTH] * thispars->pars[P_ACTUAL_WIDTH])>>16) & 0xffe;
        hist_setup_data.width=  ((thispars->pars[P_HISTWND_RWIDTH + poffs] * thispars->pars[P_ACTUAL_WIDTH])>>16) & 0xffe;
        if (hist_setup_data.width<2) hist_setup_data.width=2;
        if (hist_setup_data.width<2) hist_setup_data.width=2;
        else if (hist_setup_data.width > thispars->pars[P_ACTUAL_WIDTH]) hist_setup_data.width = thispars->pars[P_ACTUAL_WIDTH];
        else if (hist_setup_data.width > thispars->pars[P_ACTUAL_WIDTH]) hist_setup_data.width = thispars->pars[P_ACTUAL_WIDTH];
    hist_setup_data.left=  ((thispars->pars[P_HISTWND_RLEFT] * (thispars->pars[P_ACTUAL_WIDTH]-hist_setup_data.width)) >>16) & 0xffe;
        hist_setup_data.left=  ((thispars->pars[P_HISTWND_RLEFT + poffs] * (thispars->pars[P_ACTUAL_WIDTH]-hist_setup_data.width)) >>16) & 0xffe;
        if (hist_setup_data.left> (thispars->pars[P_ACTUAL_WIDTH]-hist_setup_data.width)) hist_setup_data.left = thispars->pars[P_ACTUAL_WIDTH]-hist_setup_data.width;
        if (hist_setup_data.left> (thispars->pars[P_ACTUAL_WIDTH]-hist_setup_data.width)) hist_setup_data.left = thispars->pars[P_ACTUAL_WIDTH]-hist_setup_data.width;


    hist_setup_data.height=  ((thispars->pars[P_HISTWND_RHEIGHT] * thispars->pars[P_ACTUAL_HEIGHT])>>16) & 0xffe;
        hist_setup_data.height=  ((thispars->pars[P_HISTWND_RHEIGHT + poffs] * thispars->pars[P_ACTUAL_HEIGHT])>>16) & 0xffe;
        if (hist_setup_data.height<2) hist_setup_data.height=2;
        if (hist_setup_data.height<2) hist_setup_data.height=2;
        else if (hist_setup_data.height > thispars->pars[P_ACTUAL_HEIGHT]) hist_setup_data.height = thispars->pars[P_ACTUAL_HEIGHT];
        else if (hist_setup_data.height > thispars->pars[P_ACTUAL_HEIGHT]) hist_setup_data.height = thispars->pars[P_ACTUAL_HEIGHT];
    hist_setup_data.top=  ((thispars->pars[P_HISTWND_RTOP] * (thispars->pars[P_ACTUAL_HEIGHT]-hist_setup_data.height)) >>16) & 0xffe;
        hist_setup_data.top=  ((thispars->pars[P_HISTWND_RTOP + poffs] * (thispars->pars[P_ACTUAL_HEIGHT]-hist_setup_data.height)) >>16) & 0xffe;
        if (hist_setup_data.top > (thispars->pars[P_ACTUAL_HEIGHT]-hist_setup_data.height)) hist_setup_data.top = thispars->pars[P_ACTUAL_HEIGHT]-hist_setup_data.height;
        if (hist_setup_data.top > (thispars->pars[P_ACTUAL_HEIGHT]-hist_setup_data.height)) hist_setup_data.top = thispars->pars[P_ACTUAL_HEIGHT]-hist_setup_data.height;


    if ((hist_setup_data.left   != thispars->pars[P_HISTWND_LEFT]) ||
        if ((hist_setup_data.left   != thispars->pars[P_HISTWND_LEFT + poffs]) ||
            (hist_setup_data.width  != thispars->pars[P_HISTWND_WIDTH]) ||
                (hist_setup_data.width  != thispars->pars[P_HISTWND_WIDTH + poffs]) ||
            (hist_setup_data.top    != thispars->pars[P_HISTWND_TOP]) ||
                (hist_setup_data.top    != thispars->pars[P_HISTWND_TOP + poffs]) ||
            (hist_setup_data.height != thispars->pars[P_HISTWND_HEIGHT])) {
                (hist_setup_data.height != thispars->pars[P_HISTWND_HEIGHT + poffs])) {
            // set these values to FPGA
            // set these values to FPGA
            left_top.left =          hist_setup_data.left;
            left_top.top =           hist_setup_data.top;
            width_height.width_m1 =  hist_setup_data.width-2;
            width_height.height_m1 = hist_setup_data.height-2;
            X393_SEQ_SEND1S (sensor_port, frame16, x393_histogram_lt, left_top, sub_chn);
            X393_SEQ_SEND1S (sensor_port, frame16, x393_histogram_wh, width_height,sub_chn);
            MDF3(printk("  X393_SEQ_SEND1S(0x%x, 0x%x, x393_histogram_lt, 0x%x, %d)\n", sensor_port, frame16, left_top.d32, sub_chn));
            MDF3(printk("  X393_SEQ_SEND1S(0x%x, 0x%x, x393_histogram_wh, 0x%x, %d)\n", sensor_port, frame16, width_height.d32, sub_chn));
            if ((nupdate == 0) || (HIST_SUBCHN_OFFSET > 0)) { // Update only once until there are per-subchannle parameters
                SETFRAMEPARS_SET(P_HISTWND_LEFT + poffs,hist_setup_data.left);
                SETFRAMEPARS_SET(P_HISTWND_WIDTH + poffs,hist_setup_data.width);
                SETFRAMEPARS_SET(P_HISTWND_TOP + poffs,hist_setup_data.top);
                SETFRAMEPARS_SET(P_HISTWND_HEIGHT + poffs,hist_setup_data.height);
            }

#ifdef NC353
#ifdef NC353
            X3X3_SEQ_SEND1(frame16,  X313_WA_HIST_LEFT,   hist_setup_data.left);
            X3X3_SEQ_SEND1(frame16,  X313_WA_HIST_LEFT,   hist_setup_data.left);
            X3X3_SEQ_SEND1(frame16,  X313_WA_HIST_WIDTH,  hist_setup_data.width-2);
            X3X3_SEQ_SEND1(frame16,  X313_WA_HIST_WIDTH,  hist_setup_data.width-2);
            X3X3_SEQ_SEND1(frame16,  X313_WA_HIST_TOP,    hist_setup_data.top);
            X3X3_SEQ_SEND1(frame16,  X313_WA_HIST_TOP,    hist_setup_data.top);
            X3X3_SEQ_SEND1(frame16,  X313_WA_HIST_HEIGHT, hist_setup_data.height-2);
            X3X3_SEQ_SEND1(frame16,  X313_WA_HIST_HEIGHT, hist_setup_data.height-2);
#endif
            MDF3(printk("  X3X3_SEQ_SEND1(0x%x,0x%x, 0x%x)\n", fpga_addr,  (int) X313_WA_HIST_LEFT,   (int) hist_setup_data.left));
            MDF3(printk("  X3X3_SEQ_SEND1(0x%x,0x%x, 0x%x)\n", fpga_addr,  (int) X313_WA_HIST_LEFT,   (int) hist_setup_data.left));
            MDF3(printk("  X3X3_SEQ_SEND1(0x%x,0x%x, 0x%x)\n", fpga_addr,  (int) X313_WA_HIST_WIDTH,  (int) hist_setup_data.width-2));
            MDF3(printk("  X3X3_SEQ_SEND1(0x%x,0x%x, 0x%x)\n", fpga_addr,  (int) X313_WA_HIST_WIDTH,  (int) hist_setup_data.width-2));
            MDF3(printk("  X3X3_SEQ_SEND1(0x%x,0x%x, 0x%x)\n", fpga_addr,  (int) X313_WA_HIST_TOP,    (int) hist_setup_data.top));
            MDF3(printk("  X3X3_SEQ_SEND1(0x%x,0x%x, 0x%x)\n", fpga_addr,  (int) X313_WA_HIST_TOP,    (int) hist_setup_data.top));
@@ -1456,6 +1479,9 @@ int pgm_hist (int sensor_port, ///< sensor port number (0..3
            pars_to_update[2].val=hist_setup_data.top;
            pars_to_update[2].val=hist_setup_data.top;
            pars_to_update[3].val=hist_setup_data.height;
            pars_to_update[3].val=hist_setup_data.height;
            setFramePars(sensor_port, thispars, 4, pars_to_update);  // save intermediate/readonly parameters
            setFramePars(sensor_port, thispars, 4, pars_to_update);  // save intermediate/readonly parameters
#endif
        }
        setFramePars(sensor_port, thispars, nupdate, pars_to_update);  // save intermediate/readonly parameters
    }
    }
    return 0;
    return 0;
}
}
+2 −0
Original line number Original line Diff line number Diff line
@@ -13,6 +13,8 @@ int add_sensor_proc(int index, int (*sens_func)(int sensor_port, struct sensor_t
/// @param data - appropriate data type (matching function definition) to be written
/// @param data - appropriate data type (matching function definition) to be written
#define X393_SEQ_SEND1(port,frame,func,data) {if ((frame) < 0) seqr_##func (0,       (data), (port)); \
#define X393_SEQ_SEND1(port,frame,func,data) {if ((frame) < 0) seqr_##func (0,       (data), (port)); \
                                              else             seqa_##func ((frame), (data), (port)); }
                                              else             seqa_##func ((frame), (data), (port)); }
#define X393_SEQ_SEND1S(port,frame,func,data,subchn) {if ((frame) < 0) seqr_##func (0,       (data), (port), (subchn)); \
                                                      else             seqa_##func ((frame), (data), (port), (subchn)); }




/** Tells if parameter is modifies
/** Tells if parameter is modifies
+2 −0
Original line number Original line Diff line number Diff line
@@ -384,6 +384,8 @@
#define P_AUTOEXP_ON    76       ///< Autoexposure control (unsigned long on)
#define P_AUTOEXP_ON    76       ///< Autoexposure control (unsigned long on)
// relative histogram (autoexposure) window (changed from % to 1/0x10000)
// relative histogram (autoexposure) window (changed from % to 1/0x10000)
// TODO: For 393 - split per multiplexed channel
// TODO: For 393 - split per multiplexed channel
#define HIST_SUBCHN_OFFSET 0 ///< for individual per-subchannel vignetting parameters (add num_sub_chn * VIGNET_SUBCHN_OFFSET)
                               ///< set for NC393 when define, meanwhile will use the same for all sub-channels
#define P_HISTWND_RWIDTH  77 ///< Histogram window relative width 16.16 (0x10000 - 1.0);
#define P_HISTWND_RWIDTH  77 ///< Histogram window relative width 16.16 (0x10000 - 1.0);
#define P_HISTWND_RHEIGHT 78 ///< Histogram window relative height 16.16 (0x10000 - 1.0);
#define P_HISTWND_RHEIGHT 78 ///< Histogram window relative height 16.16 (0x10000 - 1.0);
#define P_HISTWND_RLEFT   79 ///< Histogram window relative left margin 16.16 (0x10000 - 1.0);
#define P_HISTWND_RLEFT   79 ///< Histogram window relative left margin 16.16 (0x10000 - 1.0);