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
6be06d67
Commit
6be06d67
authored
May 20, 2023
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Before overlapping raw write
parent
8ec453e8
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
59 additions
and
19 deletions
+59
-19
.cproject
eclipse_project_setup/.cproject
+4
-1
camogm.c
src/camogm.c
+5
-5
camogm_align.c
src/camogm_align.c
+38
-6
format_disk.py
src/format_disk/format_disk.py
+12
-7
No files found.
eclipse_project_setup/.cproject
View file @
6be06d67
...
...
@@ -27,6 +27,7 @@
<option
IS_BUILTIN_EMPTY=
"false"
IS_VALUE_EMPTY=
"false"
id=
"gnu.cpp.compiler.option.include.paths.864295621"
name=
"Include paths (-I)"
superClass=
"gnu.cpp.compiler.option.include.paths"
useByScannerDiscovery=
"false"
valueType=
"includePath"
>
<listOptionValue
builtIn=
"false"
value=
""${PWD}/sysroots/usr/include""
/>
<listOptionValue
builtIn=
"false"
value=
""${PWD}/sysroots/usr/include-uapi""
/>
<listOptionValue
builtIn=
"false"
value=
""${PWD}/sysroots/usr/include/ogg""
/>
</option>
<inputType
id=
"cdt.managedbuild.tool.gnu.cpp.compiler.input.2002029678"
superClass=
"cdt.managedbuild.tool.gnu.cpp.compiler.input"
/>
</tool>
...
...
@@ -34,6 +35,7 @@
<option
IS_BUILTIN_EMPTY=
"false"
IS_VALUE_EMPTY=
"false"
id=
"gnu.c.compiler.option.include.paths.1604866480"
name=
"Include paths (-I)"
superClass=
"gnu.c.compiler.option.include.paths"
useByScannerDiscovery=
"false"
valueType=
"includePath"
>
<listOptionValue
builtIn=
"false"
value=
""${PWD}/sysroots/usr/include""
/>
<listOptionValue
builtIn=
"false"
value=
""${PWD}/sysroots/usr/include-uapi""
/>
<listOptionValue
builtIn=
"false"
value=
""${PWD}/sysroots/usr/include/ogg""
/>
</option>
<option
IS_BUILTIN_EMPTY=
"false"
IS_VALUE_EMPTY=
"false"
id=
"gnu.c.compiler.option.preprocessor.def.symbols.1399974758"
name=
"Defined symbols (-D)"
superClass=
"gnu.c.compiler.option.preprocessor.def.symbols"
useByScannerDiscovery=
"false"
valueType=
"definedSymbols"
>
<listOptionValue
builtIn=
"false"
value=
"__arm__=1"
/>
...
...
@@ -51,6 +53,7 @@
<option
IS_BUILTIN_EMPTY=
"false"
IS_VALUE_EMPTY=
"false"
id=
"gnu.both.asm.option.include.paths.1372301239"
name=
"Include paths (-I)"
superClass=
"gnu.both.asm.option.include.paths"
valueType=
"includePath"
>
<listOptionValue
builtIn=
"false"
value=
""${PWD}/sysroots/usr/include""
/>
<listOptionValue
builtIn=
"false"
value=
""${PWD}/sysroots/usr/include-uapi""
/>
<listOptionValue
builtIn=
"false"
value=
""${PWD}/sysroots/usr/include/ogg""
/>
</option>
<inputType
id=
"cdt.managedbuild.tool.gnu.assembler.input.308294150"
superClass=
"cdt.managedbuild.tool.gnu.assembler.input"
/>
</tool>
...
...
src/camogm.c
View file @
6be06d67
...
...
@@ -573,7 +573,7 @@ int sendImageFrame(camogm_state *state)
}
// is the frame ready?
if
(
lseek
(
state
->
fd_circ
[
port
],
LSEEK_CIRC_READY
,
SEEK_END
)
<
0
)
{
D3
(
fprintf
(
debug_file
,
"?6,fp=0x%x
"
,
fp
));
//frame not ready, frame pointer seems valid, but not ready
D3
(
fprintf
(
debug_file
,
"?6,fp=0x%x
\n
"
,
fp
));
//frame not ready, frame pointer seems valid, but not ready
return
-
CAMOGM_FRAME_NOT_READY
;
// frame pointer valid, but no frames yet
}
...
...
@@ -583,7 +583,7 @@ int sendImageFrame(camogm_state *state)
//optionally save it to global read pointer (i.e. for debugging with imgsrv "/pointers")
if
(
state
->
save_gp
)
lseek
(
state
->
fd_circ
[
port
],
LSEEK_CIRC_SETP
,
SEEK_END
);
state
->
frames_skip_left
[
port
]
--
;
D3
(
fprintf
(
debug_file
,
"?7
"
));
//frame not ready
D3
(
fprintf
(
debug_file
,
"?7
\n
"
));
//frame not ready
return
-
CAMOGM_FRAME_NOT_READY
;
// the required frame is not ready
}
...
...
@@ -691,7 +691,7 @@ int sendImageFrame(camogm_state *state)
state
->
packetchunks
[
state
->
chunk_index
++
].
chunk
=
(
unsigned
char
*
)
&
ccam_dma_buf
[
state
->
port_num
][
state
->
cirbuf_rp
[
port
]
>>
2
];
state
->
writer_params
.
segments
=
1
;
}
D3
(
fprintf
(
debug_file
,
"
\t
cirbuf_rp
= 0x%x
\t
"
,
state
->
cirbuf_rp
[
port
]));
D3
(
fprintf
(
debug_file
,
"
\t
cirbuf_rp
[%d] = 0x%x
\t
"
,
port
,
state
->
cirbuf_rp
[
port
]));
D3
(
fprintf
(
debug_file
,
"_12_"
));
if
(
state
->
this_frame_params
[
port
].
color
!=
COLORMODE_RAW
)
{
// Tiff
state
->
packetchunks
[
state
->
chunk_index
].
bytes
=
2
;
...
...
@@ -1673,10 +1673,10 @@ int listener_loop(camogm_state *state)
}
#endif
}
else
if
(
state
->
prog_state
==
STATE_RUNNING
)
{
// no commands in queue, started
D6
(
fprintf
(
debug_file
,
"state->prog_state == STATE_RUNNING "
));
switch
((
rslt
=
-
sendImageFrame
(
state
)))
{
rslt
=
-
sendImageFrame
(
state
);
D6
(
fprintf
(
debug_file
,
" ==> %d"
,
rslt
));
switch
(
rslt
)
{
case
0
:
break
;
// frame sent OK, nothing to do (TODO: check file length/duration)
case
CAMOGM_FRAME_NOT_READY
:
// just wait for the frame to appear at the current pointer
...
...
src/camogm_align.c
View file @
6be06d67
...
...
@@ -17,7 +17,7 @@
/** @brief This define is needed to use lseek64 and should be set before includes */
#define _LARGEFILE64_SOURCE
#define ALIGN_INTERFRAME // New alignment mode - add zeros between frames (TIFF also), not inside JPEG with app15 (JPEG only)
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
...
...
@@ -31,6 +31,7 @@ static unsigned char app15[ALIGNMENT_SIZE] = {0xff, 0xef};
static
inline
size_t
get_size_from
(
const
struct
iovec
*
vects
,
int
index
,
size_t
offset
,
int
all
);
static
inline
size_t
align_bytes_num
(
size_t
data_len
,
size_t
align_len
);
static
inline
void
vectcpy
(
struct
iovec
*
dest
,
void
*
src
,
size_t
len
);
static
inline
void
vectset
(
struct
iovec
*
dest
,
int
src
,
size_t
len
);
static
inline
void
vectshrink
(
struct
iovec
*
vec
,
size_t
len
);
static
inline
void
vectshrinkhead
(
struct
iovec
*
vec
,
size_t
len
);
static
inline
unsigned
char
*
vectrpos
(
struct
iovec
*
vec
,
size_t
offset
);
...
...
@@ -61,6 +62,17 @@ static inline void vectcpy(struct iovec *dest, void *src, size_t len)
dest
->
iov_len
+=
len
;
}
/** Set @e len bytes with @e src to buffer pointed by @e dest vector */
static
inline
void
vectset
(
struct
iovec
*
dest
,
int
src
,
size_t
len
)
{
unsigned
char
*
d
=
(
unsigned
char
*
)
dest
->
iov_base
;
memset
(
d
+
dest
->
iov_len
,
src
,
len
);
dest
->
iov_len
+=
len
;
}
/** Shrink vector length by @len bytes */
static
inline
void
vectshrink
(
struct
iovec
*
vec
,
size_t
len
)
{
...
...
@@ -110,7 +122,7 @@ static inline size_t get_size_from(const struct iovec *vects, int index, size_t
return
total
;
}
/** Return the number of bytes needed to align @e data_len to @e align_len boundary */
/** Return the number of bytes needed to
be inserted to
align @e data_len to @e align_len boundary */
static
inline
size_t
align_bytes_num
(
size_t
data_len
,
size_t
align_len
)
{
size_t
rem
=
data_len
%
align_len
;
...
...
@@ -160,10 +172,12 @@ static void remap_vectors(camogm_state *state, struct iovec *chunks)
chunks
[
CHUNK_DATA_1
].
iov_base
=
chunks
[
CHUNK_DATA_0
].
iov_base
;
chunks
[
CHUNK_DATA_1
].
iov_len
=
0
;
}
chunks
[
CHUNK_TRAILER
].
iov_base
=
(
void
*
)
state
->
packetchunks
[
chunk_index
].
chunk
;
//
chunks[CHUNK_TRAILER].iov_base = (void *)state->packetchunks[chunk_index].chunk;
if
(
is_tiff
)
{
// Tiff
chunks
[
CHUNK_TRAILER
].
iov_base
=
(
void
*
)
state
->
packetchunks
[
chunk_index
-
1
].
chunk
;
// last used chunk (valid)
chunks
[
CHUNK_TRAILER
].
iov_len
=
0
;
}
else
{
chunks
[
CHUNK_TRAILER
].
iov_base
=
(
void
*
)
state
->
packetchunks
[
chunk_index
].
chunk
;
chunks
[
CHUNK_TRAILER
].
iov_len
=
state
->
packetchunks
[
chunk_index
].
bytes
;
}
...
...
@@ -288,7 +302,7 @@ void align_frame(camogm_state *state)
remap_vectors
(
state
,
chunks
);
total_sz
=
get_size_from
(
chunks
,
0
,
0
,
INCLUDE_REM
)
+
rbuff
->
iov_len
;
D4
(
fprintf
(
debug_file
,
"total_sz = %d
\n
"
,
total_sz
));
D4
(
fprintf
(
debug_file
,
"total_sz = %d
, rbuff->iov_len=%d
\n
"
,
total_sz
,
(
int
)(
rbuff
->
iov_len
)
));
if
(
total_sz
<
PHY_BLOCK_SIZE
)
{
/* the frame length is less than sector size, delay this frame */
if
(
rbuff
->
iov_len
!=
0
)
{
...
...
@@ -321,6 +335,14 @@ void align_frame(camogm_state *state)
vectshrink
(
rbuff
,
rbuff
->
iov_len
);
}
/*Calculate alignment size and add zeros here*/
#ifdef ALIGN_INTERFRAME
// calculate length after adding CHUNK_LEADER, CHUNK_EXIF and CHUNK_HEADER to the current cbuf
data_len
=
cbuff
->
iov_len
+
chunks
[
CHUNK_LEADER
].
iov_len
+
chunks
[
CHUNK_EXIF
].
iov_len
+
chunks
[
CHUNK_HEADER
].
iov_len
;
len
=
align_bytes_num
(
data_len
,
ALIGNMENT_SIZE
);
dev_dbg
(
dev
,
"total number of stuffing bytes between frames: %u
\n
"
,
len
);
vectset
(
cbuff
,
0
,
len
);
#endif
/* copy JPEG marker if present */
if
(
chunks
[
CHUNK_LEADER
].
iov_len
!=
0
)
{
len
=
chunks
[
CHUNK_LEADER
].
iov_len
;
...
...
@@ -336,6 +358,16 @@ void align_frame(camogm_state *state)
vectshrink
(
&
chunks
[
CHUNK_EXIF
],
chunks
[
CHUNK_EXIF
].
iov_len
);
}
#ifdef ALIGN_INTERFRAME
/* copy JPEG JPEG header data excluding leading marker if present */
if
(
chunks
[
CHUNK_HEADER
].
iov_len
!=
0
)
{
len
=
chunks
[
CHUNK_HEADER
].
iov_len
;
dev_dbg
(
dev
,
"copy %u bytes from LEADER to common buffer
\n
"
,
len
);
vectcpy
(
cbuff
,
chunks
[
CHUNK_HEADER
].
iov_base
,
len
);
vectshrink
(
&
chunks
[
CHUNK_HEADER
],
chunks
[
CHUNK_HEADER
].
iov_len
);
}
#else // old way with app15
if
(
chunks
[
CHUNK_HEADER
].
iov_len
!=
0
){
// only if it is not TIFF
/* align common buffer to ALIGNMENT boundary, APP15 marker should be placed before header data */
data_len
=
cbuff
->
iov_len
+
chunks
[
CHUNK_HEADER
].
iov_len
;
...
...
@@ -362,13 +394,13 @@ void align_frame(camogm_state *state)
vectshrinkhead
(
&
chunks
[
CHUNK_DATA_0
],
len
);
}
}
#endif
/* check if there is enough data to continue - JPEG data length can be too short */
len
=
get_size_from
(
chunks
,
CHUNK_DATA_0
,
0
,
EXCLUDE_REM
);
if
(
len
<
PHY_BLOCK_SIZE
)
{
size_t
num
=
align_bytes_num
(
cbuff
->
iov_len
,
PHY_BLOCK_SIZE
);
dev_dbg
(
dev
,
"jpeg data is too short, delay this frame
\n
"
);
dev_dbg
(
dev
,
"jpeg data is too short, delay this frame
\n
"
);
// never happened?
if
(
len
>=
num
)
{
/* there is enough data to align common buffer to sector boundary */
if
(
num
>=
chunks
[
CHUNK_DATA_0
].
iov_len
)
{
...
...
src/format_disk/format_disk.py
View file @
6be06d67
...
...
@@ -193,6 +193,7 @@ def get_disk_size(dev_path):
return
0
if
(
label
==
'unknown'
):
#print("unknown label, running parted -s /dev/sda mklabel msdos!")
print
(
"Disregard 'Error: /dev/sda: unrecognised disk label' above "
)
try
:
parted_print
=
subprocess
.
check_output
([
'parted'
,
'-s'
,
dev_path
,
'mklabel'
,
'msdos'
])
except
:
...
...
@@ -266,7 +267,7 @@ if __name__ == "__main__":
parser
=
argparse
.
ArgumentParser
(
description
=
"Prepare and partition new disk for fast recording from camogm"
)
parser
.
add_argument
(
'disk_path'
,
nargs
=
'?'
,
help
=
"path to a disk which should be partitioned, e.g /dev/sda"
)
parser
.
add_argument
(
'-l'
,
'--list'
,
action
=
'store_true'
,
help
=
"list attached disk(s) suitable for partitioning along "
+
"with their totals sizes and possible system partition sizes separated by colon"
)
"with their totals sizes and possible system partition sizes separated by colon
. -lf - include already partitioned.
"
)
parser
.
add_argument
(
'-e'
,
'--errno'
,
nargs
=
1
,
type
=
int
,
help
=
"convert error number returned by the script to error message"
)
parser
.
add_argument
(
'-d'
,
'--dry_run'
,
action
=
'store_true'
,
help
=
"execute the script but do not actually create partitions"
)
parser
.
add_argument
(
'-f'
,
'--force'
,
action
=
'store_true'
,
help
=
"force 'mkfs' to create a file system and re-format existing partitions"
)
...
...
@@ -295,18 +296,19 @@ if __name__ == "__main__":
disks
=
find_disks
(
True
)
if
disks
:
disk_path
=
disks
[
0
]
"""
if (disk_path != ""):
print (disk_path)
else:
print ("disk_path empty")
"""
#
if (disk_path != ""):
# print (disk_path) #first line output
#
else:
#
print ("disk_path empty")
if
(
disk_path
!=
""
):
with
open
(
"/proc/mounts"
,
"r"
)
as
file
:
content
=
file
.
read
()
if
(
content
.
find
(
disk_path
)
>
0
):
# <0 - not founed
# print (disk_path+" is mounted")
mount_point
=
content
[
content
.
find
(
disk_path
):]
.
split
()[
1
]
# print ("mount_point=",mount_point)
# try to unmount
try
:
subprocess
.
check_output
([
'umount'
,
mount_point
])
...
...
@@ -315,6 +317,8 @@ if __name__ == "__main__":
ret_code
.
err_code
=
ErrCodes
.
PART_MOUINTED
print
(
ret_code
.
err2str
())
sys
.
exit
(
ret_code
.
err_code
)
# print ("umount")
disk_name
=
disk_path
[:
8
]
# /dev/sdx
#delete MBR on this device : dd if=/dev/zero of=/dev/sda bs=512 count=1
try
:
...
...
@@ -361,6 +365,7 @@ if __name__ == "__main__":
ret_code
.
err_code
=
ErrCodes
.
WRONG_PATH
else
:
ret_code
.
err_code
=
ErrCodes
.
WRONG_PATH
if
ret_code
.
err_code
!=
ErrCodes
.
OK
:
print
(
ret_code
.
err2str
())
sys
.
exit
(
ret_code
.
err_code
)
...
...
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