diff --git a/camogm.c b/camogm.c
index 1f41497d7fc190aac459f4c48d49bbf405e2a18e..a1e33660721481a73a48632ef975ed65f7b7f686 100644
--- a/camogm.c
+++ b/camogm.c
@@ -911,15 +911,13 @@ void camogm_set_start_after_timestamp(camogm_state *state, double d)
state->start_after_timestamp = d;
}
-
void camogm_status(camogm_state *state, char * fn, int xml)
{
int _len = 0;
- int _dur[SENSOR_PORTS], _udur[SENSOR_PORTS];
-//TODO:make it XML file
+ int _dur = 0, _udur = 0, _dur_raw, _udur_raw;
FILE* f;
char *_state, *_output_format, *_using_exif, *_using_global_pointer, *_compressor_state[SENSOR_PORTS];
- int _b_free, _b_used, _b_size; // , save_p;
+ int _b_free[SENSOR_PORTS], _b_used[SENSOR_PORTS], _b_size[SENSOR_PORTS];
int _frames_remain[SENSOR_PORTS] = {0};
int _sec_remain[SENSOR_PORTS] = {0};
int _frames_skip = 0;
@@ -930,10 +928,37 @@ void camogm_status(camogm_state *state, char * fn, int xml)
_kml_used = state->kml_used ? "yes" : "no";
_kml_height_mode = state->kml_height_mode ? "GPS altitude" : "map ground level"; //! 1 - actual, 0 - ground
-
- _b_free = getGPValue(state->port_num, G_FREECIRCBUF);
- _b_used = getGPValue(state->port_num, G_CIRCBUFSIZE) - getGPValue(state->port_num, G_FREECIRCBUF);
- _b_size = getGPValue(state->port_num, G_FRAME_SIZE);
+ for (int chn = 0; chn < SENSOR_PORTS; chn++) {
+ _b_free[chn] = getGPValue(chn, G_FREECIRCBUF);
+ _b_used[chn] = getGPValue(chn, G_CIRCBUFSIZE) - getGPValue(state->port_num, G_FREECIRCBUF);
+ _b_size[chn] = getGPValue(chn, G_FRAME_SIZE);
+ _compressor_state[chn] = (getGPValue(chn, P_COMPRESSOR_RUN) == 2) ? "running" : "stopped";
+ if (state->frames_skip > 0)
+ _frames_remain[chn] = state->frames_skip_left[chn];
+ else if (state->frames_skip < 0)
+ _sec_remain[chn] = (state->frames_skip_left[chn] - state->this_frame_params[chn].timestamp_sec);
+
+ _dur_raw = state->this_frame_params[chn].timestamp_sec - state->frame_params[chn].timestamp_sec;
+ _udur_raw = state->this_frame_params[chn].timestamp_usec - state->frame_params[chn].timestamp_usec;
+ if (_udur_raw < 0) {
+ _dur_raw -= 1;
+ _udur_raw += 1000000;
+ } else if (_udur_raw >= 1000000) {
+ _dur_raw += 1;
+ _udur_raw -= 1000000;
+ }
+ _dur += _dur_raw;
+ _udur += _udur_raw;
+ if (_udur > 1000000) {
+ _dur += 1;
+ _udur -= 1000000;
+ }
+ }
+ if ( state->frames_skip > 0 ) {
+ _frames_skip = state->frames_skip;
+ } else if ( state->frames_skip < 0 ) {
+ _sec_skip = -(state->frames_skip);
+ }
if (!fn) f = stdout;
else if (strcmp(fn, "stdout") == 0) f = stdout;
@@ -946,17 +971,6 @@ void camogm_status(camogm_state *state, char * fn, int xml)
}
if (state->vf) _len = ftell(state->vf); //! for ogm
else if ((state->ivf) >= 0) _len = lseek(state->ivf, 0, SEEK_CUR); //!for mov
- FOR_EACH_PORT(int, chn) {
- _dur[chn] = state->this_frame_params[chn].timestamp_sec - state->frame_params[chn].timestamp_sec;
- _udur[chn] = state->this_frame_params[chn].timestamp_usec - state->frame_params[chn].timestamp_usec;
- if (_udur[chn] < 0) {
- _dur[chn] -= 1;
- _udur[chn] += 1000000;
- } else if (_udur[chn] >= 1000000) {
- _dur[chn] += 1;
- _udur[chn] -= 1000000;
- }
- }
_state = state->running ? "running" : (state->starting ? "starting" : "stopped");
_output_format = state->format ? ((state->format == CAMOGM_FORMAT_OGM) ? "ogm" :
((state->format == CAMOGM_FORMAT_JPEG) ? "jpeg" :
@@ -964,30 +978,16 @@ void camogm_status(camogm_state *state, char * fn, int xml)
"other"))) : "none";
_using_exif = state->exif ? "yes" : "no";
_using_global_pointer = state->save_gp ? "yes" : "no";
- FOR_EACH_PORT(int, chn) {_compressor_state[chn] = (getGPValue(chn, P_COMPRESSOR_RUN) == 2) ? "running" : "stopped";}
- if ( state->frames_skip > 0 ) {
- FOR_EACH_PORT(int, chn) {_frames_remain[chn] = state->frames_skip_left[chn];}
- _frames_skip = state->frames_skip;
- } else if ( state->frames_skip < 0 ) {
- FOR_EACH_PORT(int, chn) {_sec_remain[chn] = (state->frames_skip_left[chn] - state->this_frame_params[chn].timestamp_sec);}
- _sec_skip = -(state->frames_skip);
- }
-
if (xml) {
fprintf(f, "\n" \
"\n" \
" \"%s\"\n" \
- " \"%s\"\n" \
" \"%s\"\n" \
" %d\n" \
- " %d\n" \
" %f\n" \
" %d.%06d\n" \
" %d\n" \
- " %d\n" \
- " %d\n" \
- " %d\n" \
" %d\n" \
" %d\n" \
" %d\n" \
@@ -1001,11 +1001,6 @@ void camogm_status(camogm_state *state, char * fn, int xml)
" %f\n" \
" %d\n" \
" %d\n" \
- " %d\n" \
- " %d\n" \
- " %d\n" \
- " %d\n" \
- " %d\n" \
" \"%s\"\n" \
" %d\n" \
" \"%s\"\n" \
@@ -1020,75 +1015,110 @@ void camogm_status(camogm_state *state, char * fn, int xml)
" %d\n" \
" %d.%06d\n" \
" \"%s\"\n" \
- " \"%s\"\n" \
- "\n",
- _state, _compressor_state[0], state->path, state->frameno, _b_size, state->start_after_timestamp, _dur[0], _udur[0], _len, state->frame_period[0], \
- _frames_skip, _sec_skip, _frames_remain[0], _sec_remain[0], \
+ " \"%s\"\n",
+ _state, state->path, state->frameno, state->start_after_timestamp, _dur, _udur, _len, \
+ _frames_skip, _sec_skip, \
state->width, state->height, _output_format, _using_exif, \
state->path_prefix, state->segment_duration, state->segment_length, state->max_frames, state->timescale, \
- state->frames_per_chunk, state->last_error_code, state->buf_overruns[0], state->buf_min[0], _b_free, _b_used, state->cirbuf_rp[0], \
+ state->frames_per_chunk, state->last_error_code, \
state->debug_name, debug_level, _using_global_pointer, \
_kml_enable, _kml_used, state->kml_path, state->kml_horHalfFov, state->kml_vertHalfFov, state->kml_near, \
_kml_height_mode, state->kml_height, state->kml_period, state->kml_last_ts, state->kml_last_uts, \
state->greedy ? "yes" : "no", state->ignore_fps ? "yes" : "no");
- } else {
- fprintf(f, "state %s\n", _state);
- FOR_EACH_PORT(int, chn) {fprintf(f, "compressor %d state %s\n", chn, _compressor_state[chn]);}
- fprintf(f, "file %s\n", state->path);
- fprintf(f, "frame %d\n", state->frameno);
- fprintf(f, "frame size %d\n", _b_size);
- fprintf(f, "start_after_timestamp %f\n", state->start_after_timestamp);
- FOR_EACH_PORT(int, chn) {fprintf(f, "file duration %d.%06d sec\n", _dur[chn], _udur[chn]);}
- fprintf(f, "file length %d B\n", _len);
- FOR_EACH_PORT(int, chn) {fprintf(f, "frame period %d (0x%x)\n", state->frame_period[chn], state->frame_period[chn]);}
- if ( _frames_skip > 0 ) {
- FOR_EACH_PORT(int, chn) {fprintf(f, "frames to skip on port %d %d (left %d)\n", chn, _frames_skip, _frames_remain[chn]);}
- }
- if ( _sec_skip < 0 ) {
- FOR_EACH_PORT(int, chn) {fprintf(f, "timelapse period on port %d %d sec (remaining %d sec)\n", chn, _sec_skip, _sec_remain[chn]);}
+
+ FOR_EACH_PORT(int, chn) {
+ char *_active = is_chn_active(state, chn) ? "yes" : "no";
+ fprintf(f,
+ "\t\n" \
+ "\t\t\"%s\"<\channel_active>\n" \
+ "\t\t\"%s\"\n" \
+ "\t\t%d\n" \
+ "\t\t%d\n" \
+ "\t\t%d\n" \
+ "\t\t%d\n" \
+ "\t\t%d\n" \
+ "\t\t%d\n" \
+ "\t\t%d\n" \
+ "\t\t%d\n" \
+ "\t\t%d\n" \
+ "\t\n",
+ chn,
+ _active,
+ _compressor_state[chn],
+ _b_size[chn],
+ _frames_remain[chn],
+ _sec_remain[chn],
+ state->buf_overruns[chn],
+ state->buf_min[chn],
+ state->frame_period[chn],
+ _b_free[chn],
+ _b_used[chn],
+ state->cirbuf_rp[chn],
+ chn
+ );
}
- fprintf(f, "width %d (0x%x)\n", state->width, state->width);
- fprintf(f, "height %d (0x%x)\n", state->height, state->height);
+ fprintf(f, "\n");
+ } else {
+ fprintf(f, "state \t%s\n", _state);
+ fprintf(f, "file \t%s\n", state->path);
+ fprintf(f, "frame \t%d\n", state->frameno);
+ fprintf(f, "start_after_timestamp \t%f\n", state->start_after_timestamp);
+ fprintf(f, "file duration \t%d.%06d sec\n", _dur, _udur);
+ fprintf(f, "file length \t%d B\n", _len);
+ fprintf(f, "width \t%d (0x%x)\n", state->width, state->width);
+ fprintf(f, "height \t%d (0x%x)\n", state->height, state->height);
fprintf(f, "\n");
- fprintf(f, "output format %s\n", _output_format);
- fprintf(f, "using exif %s\n", _using_exif);
- fprintf(f, "path prefix: %s\n", state->path_prefix);
- fprintf(f, "max file duration: %d sec\n", state->segment_duration);
- fprintf(f, "max file length: %d B\n", state->segment_length);
- fprintf(f, "max frames %d\n", state->max_frames);
- fprintf(f, "timescale %f\n", state->timescale);
- fprintf(f, "frames per chunk %d\n", state->frames_per_chunk);
- fprintf(f, "greedy %s\n", state->greedy ? "yes" : "no");
- fprintf(f, "ignore fps %s\n", state->ignore_fps ? "yes" : "no");
+ fprintf(f, "output format \t%s\n", _output_format);
+ fprintf(f, "using exif \t%s\n", _using_exif);
+ fprintf(f, "path prefix: \t%s\n", state->path_prefix);
+ fprintf(f, "max file duration: \t%d sec\n", state->segment_duration);
+ fprintf(f, "max file length: \t%d B\n", state->segment_length);
+ fprintf(f, "max frames \t%d\n", state->max_frames);
+ fprintf(f, "timescale \t%f\n", state->timescale);
+ fprintf(f, "frames per chunk \t%d\n", state->frames_per_chunk);
+ fprintf(f, "greedy \t%s\n", state->greedy ? "yes" : "no");
+ fprintf(f, "ignore fps \t%s\n", state->ignore_fps ? "yes" : "no");
fprintf(f, "\n");
- fprintf(f, "last error code %d\n", state->last_error_code);
- FOR_EACH_PORT(int, chn) {fprintf(f, "buffer %d overruns %d\n", chn, state->buf_overruns[chn]);}
- FOR_EACH_PORT(int, chn) {fprintf(f, "buffer %d minimal %d\n", chn, state->buf_min[chn]);}
- fprintf(f, "buffer free %d\n", _b_free);
- fprintf(f, "buffer used %d\n", _b_used);
- FOR_EACH_PORT(int, chn) {fprintf(f, "circbuf_rp %d (0x%x)\n", state->cirbuf_rp[chn], state->cirbuf_rp[chn]);}
+ fprintf(f, "last error code \t%d\n", state->last_error_code);
fprintf(f, "\n");
- fprintf(f, "debug output to %s\n", state->debug_name);
- fprintf(f, "debug level %d\n", debug_level);
- fprintf(f, "use global pointer %s\n", _using_global_pointer);
- fprintf(f, "\n\n");
- fprintf(f, "kml_enable %s\n", _kml_enable);
- fprintf(f, "kml_used %s\n", _kml_used);
- fprintf(f, "kml_path %s\n", state->kml_path);
- fprintf(f, "kml_horHalfFov %f degrees\n", state->kml_horHalfFov);
- fprintf(f, "kml_vertHalfFov %f degrees\n", state->kml_vertHalfFov);
- fprintf(f, "kml_near %f m\n", state->kml_near);
- fprintf(f, "kml height mode %s\n", _kml_height_mode);
- fprintf(f, "kml_height (extra) %f m\n", state->kml_height);
- fprintf(f, "kml_period %d\n", state->kml_period);
- fprintf(f, "kml_last_ts %d.%06d\n", state->kml_last_ts, state->kml_last_uts);
+ fprintf(f, "debug output to \t%s\n", state->debug_name);
+ fprintf(f, "debug level \t%d\n", debug_level);
+ fprintf(f, "use global pointer \t%s\n", _using_global_pointer);
fprintf(f, "\n\n");
-
+ fprintf(f, "kml_enable \t%s\n", _kml_enable);
+ fprintf(f, "kml_used \t%s\n", _kml_used);
+ fprintf(f, "kml_path \t%s\n", state->kml_path);
+ fprintf(f, "kml_horHalfFov \t%f degrees\n", state->kml_horHalfFov);
+ fprintf(f, "kml_vertHalfFov \t%f degrees\n", state->kml_vertHalfFov);
+ fprintf(f, "kml_near \t%f m\n", state->kml_near);
+ fprintf(f, "kml height mode \t%s\n", _kml_height_mode);
+ fprintf(f, "kml_height (extra) \t%f m\n", state->kml_height);
+ fprintf(f, "kml_period \t%d\n", state->kml_period);
+ fprintf(f, "kml_last_ts \t%d.%06d\n", state->kml_last_ts, state->kml_last_uts);
+ fprintf(f, "\n");
+ FOR_EACH_PORT(int, chn) {
+ char *_active = is_chn_active(state, chn) ? "yes" : "no";
+ fprintf(f, "===== Sensor port %d status =====\n", chn);
+ fprintf(f, "enabled \t%s\n", _active);
+ fprintf(f, "compressor state \t%s\n", _compressor_state[chn]);
+ fprintf(f, "frame size \t%d\n", _b_size[chn]);
+ if (_frames_skip > 0)
+ fprintf(f, "frames to skip \t%d (left %d)\n", _frames_skip, _frames_remain[chn]);
+ if (_sec_skip < 0 )
+ fprintf(f, "timelapse period \t%d sec (remaining %d sec)\n", _sec_skip, _sec_remain[chn]);
+ fprintf(f, "buffer overruns \t%d\n", state->buf_overruns[chn]);
+ fprintf(f, "buffer minimal \t%d\n", state->buf_min[chn]);
+ fprintf(f, "frame period \t%d (0x%x)\n", state->frame_period[chn], state->frame_period[chn]);
+ fprintf(f, "buffer free \t%d\n", _b_free[chn]);
+ fprintf(f, "buffer used \t%d\n", _b_used[chn]);
+ fprintf(f, "circbuf_rp \t%d (0x%x)\n", state->cirbuf_rp[chn], state->cirbuf_rp[chn]);
+ fprintf(f, "\n");
+ }
}
if ((f != stdout) && (f != stderr)) fclose(f);
FOR_EACH_PORT(int, chn) {if (state->buf_overruns[chn] >= 0) state->buf_overruns[chn] = 0;} //! resets overruns after reading status , so "overruns" means since last reading status
state->last_error_code = 0; //! Reset error
- FOR_EACH_PORT(int, chn) {state->buf_min[chn] = _b_free;}
+ FOR_EACH_PORT(int, chn) {state->buf_min[chn] = _b_free[chn];}
}
//! will read from pipe, return pointer to null terminated string if available, NULL otherwise
@@ -1345,7 +1375,6 @@ int listener_loop(camogm_state *state)
while (process) {
curr_port = select_port(state);
state->port_num = curr_port;
- printf("Selected port: %d\n", curr_port);
// look at command queue first
cmd = parse_cmd(state, cmd_file);
if (cmd) {
@@ -1481,7 +1510,6 @@ unsigned int select_port(camogm_state *state)
if (free_sz[i] < free_sz[i - 1])
chn = i;
}
- printf("free sizes: %lx, %lx, %lx, %lx\n", free_sz[0], free_sz[1], free_sz[2], free_sz[3]);
return chn;
}