Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
elphel-apps-camogm
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Elphel
elphel-apps-camogm
Commits
d7e36e5d
Commit
d7e36e5d
authored
Mar 31, 2017
by
Mikhail Karpenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Periodically save status file, not just in the end of recording
parent
27c6e9f4
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
20 additions
and
14 deletions
+20
-14
camogm.h
src/camogm.h
+2
-0
camogm_jpeg.c
src/camogm_jpeg.c
+18
-14
No files found.
src/camogm.h
View file @
d7e36e5d
...
...
@@ -160,6 +160,8 @@ struct writer_params {
uint64_t
lba_start
;
///< disk starting LBA
uint64_t
lba_current
;
///< current write position in LBAs
uint64_t
lba_end
;
///< disk last LBA
time_t
stat_update
;
///< time when status file was updated
};
/**
* @struct camogm_state
...
...
src/camogm_jpeg.c
View file @
d7e36e5d
...
...
@@ -27,6 +27,7 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <time.h>
#include <elphel/c313a.h>
#include <elphel/ahci_cmd.h>
...
...
@@ -36,10 +37,12 @@
/** State file record format. It includes device path in /dev, starting, current and ending LBAs */
#define STATE_FILE_FORMAT "%s\t%llu\t%llu\t%llu\n"
/** Status file update period, in seconds */
#define STAT_UPDATE_PERIOD 60
/* forward declarations */
static
void
*
jpeg_writer
(
void
*
thread_args
);
static
int
save_state_file
(
const
rawdev_buffer
*
rawdev
,
uint64_t
current_pos
);
static
int
save_state_file
(
const
camogm_state
*
state
);
/** Get starting and endign LBAs of the partition specified as raw device buffer */
static
int
get_disk_range
(
struct
range
*
range
)
...
...
@@ -100,11 +103,9 @@ static int find_state(FILE *f, uint64_t *pos, const rawdev_buffer *rawdev)
/** Read state from file and restore disk write pointer */
int
open_state_file
(
const
rawdev_buffer
*
rawdev
,
uint64_t
*
current_pos
)
{
int
fd
,
len
;
FILE
*
f
;
int
ret
=
0
;
uint64_t
lba_pos
;
char
buff
[
SMALL_BUFF_LEN
]
=
{
0
};
if
(
strlen
(
rawdev
->
state_path
)
==
0
)
{
return
ret
;
...
...
@@ -125,18 +126,16 @@ int open_state_file(const rawdev_buffer *rawdev, uint64_t *current_pos)
}
/** Save current position of the disk write pointer */
static
int
save_state_file
(
const
rawdev_buffer
*
rawdev
,
uint64_t
current_pos
)
static
int
save_state_file
(
const
camogm_state
*
state
)
{
int
ret
=
0
;
FILE
*
f
;
struct
range
range
;
const
rawdev_buffer
*
rawdev
=
&
state
->
rawdev
;
const
struct
writer_params
*
params
=
&
state
->
writer_params
;
if
(
strlen
(
rawdev
->
state_path
)
==
0
)
{
return
ret
;
}
if
(
get_disk_range
(
&
range
)
!=
0
)
{
return
-
1
;
}
// save pointers to a regular file
f
=
fopen
(
rawdev
->
state_path
,
"w"
);
...
...
@@ -144,7 +143,7 @@ static int save_state_file(const rawdev_buffer *rawdev, uint64_t current_pos)
return
-
1
;
}
fprintf
(
f
,
"Device
\t\t
Start LBA
\t
Current LBA
\t
End LBA
\n
"
);
fprintf
(
f
,
STATE_FILE_FORMAT
,
rawdev
->
rawdev_path
,
range
.
from
,
current_pos
,
range
.
to
);
fprintf
(
f
,
STATE_FILE_FORMAT
,
rawdev
->
rawdev_path
,
params
->
lba_start
,
params
->
lba_current
,
params
->
lba_end
);
fflush
(
f
);
fsync
(
fileno
(
f
));
fclose
(
f
);
...
...
@@ -272,6 +271,7 @@ int camogm_start_jpeg(camogm_state *state)
offset
=
lba_to_offset
(
state
->
writer_params
.
lba_current
-
state
->
writer_params
.
lba_start
);
lseek64
(
state
->
writer_params
.
blockdev_fd
,
offset
,
SEEK_SET
);
D6
(
fprintf
(
debug_file
,
"Open block device: %s, offset in bytes: %llu
\n
"
,
state
->
rawdev
.
rawdev_path
,
offset
));
state
->
writer_params
.
stat_update
=
time
(
NULL
);
}
return
0
;
...
...
@@ -290,7 +290,7 @@ int camogm_frame_jpeg(camogm_state *state)
ssize_t
iovlen
,
l
=
0
;
struct
iovec
chunks_iovec
[
8
];
int
port
=
state
->
port_num
;
struct
frame_data
fdata
=
{
0
}
;
time_t
curr_time
;
sprintf
(
state
->
path
,
"%s%d_%010ld_%06ld.jpeg"
,
state
->
path_prefix
,
port
,
state
->
this_frame_params
[
port
].
timestamp_sec
,
state
->
this_frame_params
[
port
].
timestamp_usec
);
if
(
!
state
->
rawdev_op
)
{
...
...
@@ -342,6 +342,12 @@ int camogm_frame_jpeg(camogm_state *state)
if
(
state
->
writer_params
.
last_ret_val
!=
0
)
{
return
state
->
writer_params
.
last_ret_val
;
}
// update status file if time has come
curr_time
=
time
(
NULL
);
if
(
difftime
(
curr_time
,
state
->
writer_params
.
stat_update
)
>
STAT_UPDATE_PERIOD
)
{
save_state_file
(
state
);
}
}
return
0
;
...
...
@@ -359,7 +365,6 @@ int camogm_end_jpeg(camogm_state *state)
int
ret
=
0
;
int
bytes
;
ssize_t
iovlen
;
struct
frame_data
fdata
=
{
0
};
if
(
state
->
rawdev_op
)
{
// write any remaining data, do not use writer thread as there can be only one block left CHUNK_REM buffer
...
...
@@ -389,7 +394,7 @@ int camogm_end_jpeg(camogm_state *state)
if
(
ret
==
-
1
)
D0
(
fprintf
(
debug_file
,
"Error: %s
\n
"
,
strerror
(
errno
)));
save_state_file
(
&
state
->
rawdev
,
state
->
writer_params
.
lba_current
);
save_state_file
(
state
);
}
return
ret
;
}
...
...
@@ -402,7 +407,6 @@ int camogm_end_jpeg(camogm_state *state)
*/
void
*
jpeg_writer
(
void
*
thread_args
)
{
int
rslt
=
0
;
int
chunk_index
;
ssize_t
iovlen
,
l
;
bool
process
=
true
;
...
...
@@ -437,7 +441,7 @@ void *jpeg_writer(void *thread_args)
l
=
0
;
state
->
writer_params
.
last_ret_val
=
0
;
chunk_index
=
get_data_buffers
(
state
,
&
chunks_iovec
,
FILE_CHUNKS_NUM
);
chunk_index
=
get_data_buffers
(
state
,
chunks_iovec
,
FILE_CHUNKS_NUM
);
if
(
chunk_index
>
0
)
{
for
(
int
i
=
0
;
i
<
chunk_index
;
i
++
)
l
+=
chunks_iovec
[
i
].
iov_len
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment