Commit eb2f643e authored by Andrey Filippov's avatar Andrey Filippov

making resilient against restarting camogm and incrementing state file name

parent 997be073
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
#endif #endif
/** @brief Default debug level */ /** @brief Default debug level */
#define DEFAULT_DEBUG_LVL 6 #define DEFAULT_DEBUG_LVL 0
/** @brief Default poll() timeout in ms*/ /** @brief Default poll() timeout in ms*/
#define DEFAULT_POLL_TIMEOUT 1000 #define DEFAULT_POLL_TIMEOUT 1000
/** @brief JPEG trailer size in bytes */ /** @brief JPEG trailer size in bytes */
...@@ -125,7 +125,7 @@ int debug_level; ...@@ -125,7 +125,7 @@ int debug_level;
FILE* debug_file; FILE* debug_file;
void camogm_init(camogm_state *state, char *pipe_name, uint16_t port_num); void camogm_init(camogm_state *state, char *pipe_name, uint16_t port_num);
int camogm_start(camogm_state *state); int camogm_start(camogm_state *state, bool restart);
int camogm_stop(camogm_state *state); int camogm_stop(camogm_state *state);
void camogm_reset(camogm_state *state); void camogm_reset(camogm_state *state);
int camogm_debug(camogm_state *state, const char *fname); int camogm_debug(camogm_state *state, const char *fname);
...@@ -340,7 +340,7 @@ int camogm_debug_level(int d) ...@@ -340,7 +340,7 @@ int camogm_debug_level(int d)
* @param[in] state a pointer to a structure containing current state * @param[in] state a pointer to a structure containing current state
* @return 0 if the recording finished successfully and negative error code otherwise * @return 0 if the recording finished successfully and negative error code otherwise
*/ */
int camogm_start(camogm_state *state) int camogm_start(camogm_state *state, bool restart)
{ {
int timestamp_start; int timestamp_start;
int rslt; int rslt;
...@@ -357,10 +357,15 @@ int camogm_start(camogm_state *state) ...@@ -357,10 +357,15 @@ int camogm_start(camogm_state *state)
return CAMOGM_FRAME_OTHER; return CAMOGM_FRAME_OTHER;
} }
if (state->rawdev_op){ if (state->rawdev_op){
copy_state_file(state); // copy camogm.disk to named state file, fill be used when downloading data as file_start parameter if (!restart) {
D1(fprintf(debug_file, "Starting raw data recording, marked %s, state->path='%s'\n", get_state_path(state), state->path)); copy_state_file(state); // copy camogm.disk to named state file, it will be used when downloading data as file_start parameter
D1(syslog (LOG_INFO, "Starting raw data recording, marked %s", get_state_path(state))); D1(fprintf(debug_file, "Starting raw data recording, marked %s, state->path='%s'\n", get_state_path(state), state->path));
next_state_path(state); // increment path so next time will use different one. D1(syslog (LOG_INFO, "Starting raw data recording, marked %s", get_state_path(state)));
next_state_path(state); // increment path so next time will use different one.
} else {
D1(fprintf(debug_file, "Re-starting raw data recording, using the same state file, text will be %s, state->path='%s'\n", get_state_path(state), state->path));
D1(syslog (LOG_INFO, "Re-starting raw data recording, next will be %s", get_state_path(state)));
}
} else { } else {
D1(fprintf(debug_file, "Starting file system recording to %s\n", state->path)); D1(fprintf(debug_file, "Starting file system recording to %s\n", state->path));
D1(syslog (LOG_INFO, "Starting file system recording to %s", state->path)); D1(syslog (LOG_INFO, "Starting file system recording to %s", state->path));
...@@ -1538,10 +1543,13 @@ int parse_cmd(camogm_state *state, FILE* npipe) ...@@ -1538,10 +1543,13 @@ int parse_cmd(camogm_state *state, FILE* npipe)
} }
// now cmd is trimmed, arg is NULL or a pointer to trimmed command arguments // now cmd is trimmed, arg is NULL or a pointer to trimmed command arguments
if (strcmp(cmd, "start") == 0) { if (strcmp(cmd, "start") == 0) {
if (state->prog_state != STATE_STOPPED) {
return -1; // can not start if it is already running
}
check_compressors(state); check_compressors(state);
get_disk_info(state); get_disk_info(state);
D6(fprintf(debug_file, "camogm_start() from %s:%d: @ %07d\n", __FILE__, __LINE__,get_fpga_usec(state->fd_fparmsall[0], 0))); D6(fprintf(debug_file, "camogm_start() from %s:%d: @ %07d\n", __FILE__, __LINE__,get_fpga_usec(state->fd_fparmsall[0], 0)));
camogm_start(state); camogm_start(state, false);
return 1; return 1;
} else if (strcmp(cmd, "reset") == 0) { // will reset pointer to the last acquired frame (if any) } else if (strcmp(cmd, "reset") == 0) { // will reset pointer to the last acquired frame (if any)
camogm_reset(state); camogm_reset(state);
...@@ -1874,7 +1882,7 @@ int listener_loop(camogm_state *state) ...@@ -1874,7 +1882,7 @@ int listener_loop(camogm_state *state)
state->prog_state = STATE_RESTARTING; state->prog_state = STATE_RESTARTING;
D6(fprintf(debug_file, "camogm_start() from %s:%d: @ %07d\n", \ D6(fprintf(debug_file, "camogm_start() from %s:%d: @ %07d\n", \
__FILE__, __LINE__,get_fpga_usec(state->fd_fparmsall[0], 0))); __FILE__, __LINE__,get_fpga_usec(state->fd_fparmsall[0], 0)));
camogm_start(state); camogm_start(state, true);
break; break;
case CAMOGM_FRAME_FILE_ERR: // error with file I/O case CAMOGM_FRAME_FILE_ERR: // error with file I/O
case CAMOGM_FRAME_OTHER: // other errors case CAMOGM_FRAME_OTHER: // other errors
...@@ -1915,7 +1923,7 @@ int listener_loop(camogm_state *state) ...@@ -1915,7 +1923,7 @@ int listener_loop(camogm_state *state)
// retry starting // retry starting
D2(fprintf(debug_file, "camogm_start() from %s:%d: @ %07d\n", __FILE__, __LINE__,get_fpga_usec(state->fd_fparmsall[0], 0))); D2(fprintf(debug_file, "camogm_start() from %s:%d: @ %07d\n", __FILE__, __LINE__,get_fpga_usec(state->fd_fparmsall[0], 0)));
switch ((rslt = -camogm_start(state))) { switch ((rslt = -camogm_start(state, true))) {
case 0: case 0:
break; // file started OK, nothing to do break; // file started OK, nothing to do
case CAMOGM_TOO_EARLY: case CAMOGM_TOO_EARLY:
...@@ -1963,6 +1971,7 @@ int listener_loop(camogm_state *state) ...@@ -1963,6 +1971,7 @@ int listener_loop(camogm_state *state)
// } // if pfd.revents & POLLIN // } // if pfd.revents & POLLIN
#endif #endif
} // while (process) } // while (process)
syslog (LOG_DEBUG, "%s:line %d : Exiting camogm's listener loop @ %07d\n", __FILE__, __LINE__, get_fpga_usec(sstate.fd_fparmsall[0], 0));
D2(fprintf(debug_file, "End of while (process) from %s:%d: @ %07d\n", \ D2(fprintf(debug_file, "End of while (process) from %s:%d: @ %07d\n", \
__FILE__, __LINE__,get_fpga_usec(state->fd_fparmsall[0], 0))); __FILE__, __LINE__,get_fpga_usec(state->fd_fparmsall[0], 0)));
// normally, we should not be here // normally, we should not be here
...@@ -2353,7 +2362,7 @@ int open_files(camogm_state *state) ...@@ -2353,7 +2362,7 @@ int open_files(camogm_state *state)
clean_up(state); clean_up(state);
return -3; return -3;
} }
syslog (LOG_INFO, "open_files(): ccam_dma_buf[%d] = %p", port, ccam_dma_buf[port]); D1(syslog (LOG_INFO, "open_files(): ccam_dma_buf[%d] = %p", port, ccam_dma_buf[port]));
// now open/mmap file to read sensor/compressor parameters (currently - just free memory in circbuf and compressor state) // now open/mmap file to read sensor/compressor parameters (currently - just free memory in circbuf and compressor state)
...@@ -2459,7 +2468,7 @@ int main(int argc, char *argv[]) ...@@ -2459,7 +2468,7 @@ int main(int argc, char *argv[])
__FILE__, __LINE__, ret, get_fpga_usec(sstate.fd_fparmsall[0], 0))); __FILE__, __LINE__, ret, get_fpga_usec(sstate.fd_fparmsall[0], 0)));
ret = listener_loop(&sstate); ret = listener_loop(&sstate);
syslog (LOG_INFO, "%s:line %d : Exiting camogm @ %07d\n", __FILE__, __LINE__, get_fpga_usec(sstate.fd_fparmsall[0], 0));
return ret; return ret;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment