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

added functionality

parent 7b7496a5
Loading
Loading
Loading
Loading
+66 −39
Original line number Original line Diff line number Diff line
@@ -260,8 +260,9 @@ static zend_function_entry elphel_functions[] = {
        PHP_FE(elphel_get_exif_elphel, NULL)
        PHP_FE(elphel_get_exif_elphel, NULL)
        PHP_FE(elphel_update_exif, NULL)
        PHP_FE(elphel_update_exif, NULL)
        PHP_FE(elphel_get_circbuf_pointers, NULL)
        PHP_FE(elphel_get_circbuf_pointers, NULL)
        PHP_FE(elphel_frame2tf, NULL)
        PHP_FE(elphel_frame2ts, NULL)
        PHP_FE(elphel_tf2frame, NULL)
        PHP_FE(elphel_ts2frame, NULL)
        PHP_FE(elphel_capture_range, NULL)
        {NULL, NULL, NULL}
        {NULL, NULL, NULL}
};
};


@@ -2365,10 +2366,11 @@ PHP_FUNCTION(elphel_get_fpga_time) {
    RETURN_DOUBLE(dtime);
    RETURN_DOUBLE(dtime);
}
}


PHP_FUNCTION(elphel_frame2tf) {
PHP_FUNCTION(elphel_frame2ts) {
    double cts = 0.0;
    double cts = 0.0;
	long port, frame=0;
	long port, frame=0;
	long cframe;
	long cframe;
	long trig_decimate =1;
    double period_sec; // trigger period in seconds
    double period_sec; // trigger period in seconds
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &port, &frame) == FAILURE)
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &port, &frame) == FAILURE)
        RETURN_NULL();
        RETURN_NULL();
@@ -2378,19 +2380,23 @@ PHP_FUNCTION(elphel_frame2tf) {
    cframe = ELPHEL_GLOBALPARS(port, G_COMPRESSOR_FRAME);
    cframe = ELPHEL_GLOBALPARS(port, G_COMPRESSOR_FRAME);
    cts = ELPHEL_GLOBALPARS(port, G_COMPRESSOR_SEC) + 0.000001* ELPHEL_GLOBALPARS(port, G_COMPRESSOR_USEC);
    cts = ELPHEL_GLOBALPARS(port, G_COMPRESSOR_SEC) + 0.000001* ELPHEL_GLOBALPARS(port, G_COMPRESSOR_USEC);
    if (frame > 0){ // if <=0 (or absent) return last compressed frame
    if (frame > 0){ // if <=0 (or absent) return last compressed frame
    	// Read trigger decimation (used when slower sesnor is triggered by the faster one, like MT9P006 from Boson-640
    	trig_decimate = ((struct framepars_t *) ELPHEL_G(framePars[port]))[cframe & PARS_FRAMES_MASK ].pars[P_TRIG_DECIMATE] + 1;
        // read trigger period (even for externally triggered slaves this value has to be defined and used for period)
        // read trigger period (even for externally triggered slaves this value has to be defined and used for period)
        period_sec = 0.00000001 * (((struct framepars_t *) ELPHEL_G(framePars[port]))[cframe & PARS_FRAMES_MASK ].pars[P_TRIG_PERIOD]);
        period_sec = 0.00000001 * trig_decimate * (((struct framepars_t *) ELPHEL_G(framePars[port]))[cframe & PARS_FRAMES_MASK ].pars[P_TRIG_PERIOD]);
        cts += (frame - cframe) * period_sec;
        cts += (frame - cframe) * period_sec;
    }
    }
    RETURN_DOUBLE(cts);
    RETURN_DOUBLE(cts);
}
}
//		trig_decimate = aframepars[mchn][thisFrameNumber(mchn) & PARS_FRAMES_MASK].pars[P_TRIG_DECIMATE] + 1;


PHP_FUNCTION(elphel_tf2frame) {
PHP_FUNCTION(elphel_ts2frame) {
    double dts = 0.0;
    double dts = 0.0;
    double cts = 0.0;
    double cts = 0.0;
    double delta_ts;
    double delta_ts;
    long port;
    long port;
	long cframe;
	long cframe;
	long trig_decimate =1;
    double period_sec; // trigger period in seconds
    double period_sec; // trigger period in seconds
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|d", &port, &dts) == FAILURE)
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|d", &port, &dts) == FAILURE)
        RETURN_NULL();
        RETURN_NULL();
@@ -2400,49 +2406,71 @@ PHP_FUNCTION(elphel_tf2frame) {
    cframe = ELPHEL_GLOBALPARS(port, G_COMPRESSOR_FRAME);
    cframe = ELPHEL_GLOBALPARS(port, G_COMPRESSOR_FRAME);
    cts = ELPHEL_GLOBALPARS(port, G_COMPRESSOR_SEC) + 0.000001* ELPHEL_GLOBALPARS(port, G_COMPRESSOR_USEC);
    cts = ELPHEL_GLOBALPARS(port, G_COMPRESSOR_SEC) + 0.000001* ELPHEL_GLOBALPARS(port, G_COMPRESSOR_USEC);
    if (dts > 0){ // if <=0 (or absent) return last compressed frame
    if (dts > 0){ // if <=0 (or absent) return last compressed frame
    	// Read trigger decimation (used when slower sesnor is triggered by the faster one, like MT9P006 from Boson-640
    	trig_decimate = ((struct framepars_t *) ELPHEL_G(framePars[port]))[cframe & PARS_FRAMES_MASK ].pars[P_TRIG_DECIMATE] + 1;
        // read trigger period (even for externally triggered slaves this value has to be defined and used for period)
        // read trigger period (even for externally triggered slaves this value has to be defined and used for period)
        period_sec = 0.00000001 * (((struct framepars_t *) ELPHEL_G(framePars[port]))[cframe & PARS_FRAMES_MASK ].pars[P_TRIG_PERIOD]);
        period_sec = 0.00000001 * trig_decimate * (((struct framepars_t *) ELPHEL_G(framePars[port]))[cframe & PARS_FRAMES_MASK ].pars[P_TRIG_PERIOD]);
        delta_ts = dts - cts + 0.5 * period_sec; // for rounding
        delta_ts = dts - cts + 0.5 * period_sec; // for rounding
        cframe += (long) (delta_ts/period_sec);
        cframe += (long) (delta_ts/period_sec);
    }
    }
    RETURN_LONG(cframe);
    RETURN_LONG(cframe);
}
}


#if 0
/**
static struct framepars_all_t test_structure;
 * Program multiple channels (according to 'port_mask') to start compressor at absolute (or relative) 'frame', run it for 'duration' frames
static void php_elphel_init_globals(zend_elphel_globals *elphel_globals)
 * and then stop. If 'duration'==0 - just stop compressor, if 'duration' <0 - only start.
{
 * This function is intended to be executed in a background process (such as in capture_range.php) not to hold http client
    int port;
 * BUG: frame number after stop is 2 less than expected (ahead applied in wrong place?)
    test_structure.globalPars[G_THIS_FRAME] = 999;
 */
    test_structure.framePars[0].pars[P_EXPOS] = 111;
PHP_FUNCTION(elphel_capture_range) {
    test_structure.framePars[1].pars[P_EXPOS] = 222;
	long port = 0;
    test_structure.framePars[2].pars[P_EXPOS] = 333;
	long port_mask = (1 << SENSOR_PORTS)-1;
    test_structure.framePars[3].pars[P_EXPOS] = 444;
	long frame = 0;
    test_structure.framePars[4].pars[P_EXPOS] = 555;
	long duration=0;
    test_structure.framePars[5].pars[P_EXPOS] = 666;
	long this_frame = ELPHEL_GLOBALPARS(port, G_THIS_FRAME);
    test_structure.framePars[6].pars[P_EXPOS] = 777;
	long maxahead = PARS_FRAMES_MASK - 3; // -2?
    test_structure.framePars[7].pars[P_EXPOS] = 888;
	long ahead, frame_stop;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll|ll", &port, &port_mask, &frame, &duration) == FAILURE)
    //ELPHEL_GLOBALPARS(G_THIS_FRAME)
        RETURN_NULL();
    for (port = 0; port < SENSOR_PORTS; port ++) {
    if (frame < (this_frame + FRAME_DEAFAULT_AHEAD)){
        elphel_globals->frameParsAll[port] = NULL;
    	frame =  this_frame + FRAME_DEAFAULT_AHEAD;
        elphel_globals->framePars[port] =    NULL;
        elphel_globals->pastPars[port] =     NULL;
        elphel_globals->funcs2call[port]=    NULL;
    }
    }

    ahead = frame - this_frame;
    elphel_globals->frameParsAll[0] = &test_structure;
    if (ahead > maxahead){

        lseek((int) ELPHEL_G( fd_fparmsall[port]), (frame-maxahead) + LSEEK_FRAME_WAIT_ABS, SEEK_END );
    for (port = 0; port < SENSOR_PORTS; port ++) {
    }
        elphel_globals->framePars[port] =          elphel_globals->frameParsAll[port]->framePars;
    if (duration == 1){ // single
        elphel_globals->pastPars[port] =           elphel_globals->frameParsAll[port]->pastPars;
        if (((frame=elphel_set_P_value_common (port, P_COMPRESSOR_RUN, COMPRESSOR_RUN_SINGLE, frame, FRAMEPAIR_JUST_THIS, port_mask)))<0)  {
        elphel_globals->funcs2call[port]=          elphel_globals->frameParsAll[port]->func2call.pars;
            RETURN_NULL();
        elphel_globals->globalPars[port] =         elphel_globals->frameParsAll[port]->globalPars;
        }
        elphel_globals->multiSensIndex[port] =     elphel_globals->frameParsAll[port]->multiSensIndex;
        RETURN_LONG(frame);
        elphel_globals->multiSensRvrsIndex[port] = elphel_globals->frameParsAll[port]->multiSensRvrsIndex; /// not yet used
    } else if (duration == 0){ // jst stop
        if (((frame=elphel_set_P_value_common (port, P_COMPRESSOR_RUN, COMPRESSOR_RUN_STOP, frame, FRAMEPAIR_FORCE_NEWPROC, port_mask)))<0) {
            RETURN_NULL();
        }
        RETURN_LONG(frame);
    } else if (duration < 0) {// just start
        if (((frame=elphel_set_P_value_common (port, P_COMPRESSOR_RUN, COMPRESSOR_RUN_CONT, frame, FRAMEPAIR_FORCE_NEWPROC, port_mask)))<0) {
            RETURN_NULL();
        }
        RETURN_LONG(frame);
    } else {
    	frame_stop = frame+duration;
        if (((frame=elphel_set_P_value_common (port, P_COMPRESSOR_RUN, COMPRESSOR_RUN_CONT, frame, FRAMEPAIR_FORCE_NEWPROC, port_mask)))<0) {
            RETURN_NULL();
        }
        this_frame = ELPHEL_GLOBALPARS(port, G_THIS_FRAME);
        ahead = frame_stop - this_frame;
        if (ahead > maxahead){
            lseek((int) ELPHEL_G( fd_fparmsall[port]), (frame_stop - maxahead) + LSEEK_FRAME_WAIT_ABS, SEEK_END );
        }
        if (((frame=elphel_set_P_value_common (port, P_COMPRESSOR_RUN, COMPRESSOR_RUN_STOP, frame_stop, FRAMEPAIR_FORCE_NEWPROC, port_mask)))<0) {
            RETURN_NULL();
        }
        RETURN_LONG(frame);
    }
    }
}
}
#else



static void php_elphel_init_histograms(void){
static void php_elphel_init_histograms(void){
    int i, total_hist_entries;
    int i, total_hist_entries;
@@ -2633,7 +2661,6 @@ static void php_elphel_init_globals(zend_elphel_globals *elphel_globals)
    elphel_globals->exif_size=0;
    elphel_globals->exif_size=0;
//    php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d: elphel_globals->exif_size= 0x%x\n",  __LINE__,elphel_globals->exif_size);
//    php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d: elphel_globals->exif_size= 0x%x\n",  __LINE__,elphel_globals->exif_size);
}
}
#endif


PHP_RINIT_FUNCTION(elphel)
PHP_RINIT_FUNCTION(elphel)
{
{
+3 −2
Original line number Original line Diff line number Diff line
@@ -116,8 +116,9 @@ PHP_FUNCTION(elphel_get_interframe_meta);
PHP_FUNCTION(elphel_get_exif_elphel);
PHP_FUNCTION(elphel_get_exif_elphel);
PHP_FUNCTION(elphel_get_circbuf_pointers);
PHP_FUNCTION(elphel_get_circbuf_pointers);
PHP_FUNCTION(elphel_update_exif); // force to rebuild directory after Exif format was changed Usually done automatically
PHP_FUNCTION(elphel_update_exif); // force to rebuild directory after Exif format was changed Usually done automatically
PHP_FUNCTION(elphel_frame2tf);
PHP_FUNCTION(elphel_frame2ts);
PHP_FUNCTION(elphel_tf2frame);
PHP_FUNCTION(elphel_ts2frame);
PHP_FUNCTION(elphel_capture_range);


PHP_MINIT_FUNCTION(elphel);
PHP_MINIT_FUNCTION(elphel);
PHP_MSHUTDOWN_FUNCTION(elphel);
PHP_MSHUTDOWN_FUNCTION(elphel);