Skip to content

Commit 5d38a19

Browse files
committed
Add support for Symbol quality and points
1 parent c4b7ced commit 5d38a19

File tree

3 files changed

+52
-14
lines changed

3 files changed

+52
-14
lines changed

lib/symbol.ex

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,37 @@
11
defmodule Zbar.Symbol do
2-
defstruct [:type, :data]
2+
alias __MODULE__
3+
4+
defstruct [:type, :quality, :points, :data]
35

46
def parse(string) do
5-
[type, data] = String.split(string, ": ", parts: 2)
6-
%Zbar.Symbol{
7-
type: type,
8-
data: Base.decode64!(data),
9-
}
7+
string
8+
|> String.split(" ")
9+
|> Enum.reduce(%Symbol{}, fn item, acc ->
10+
[key, value] = String.split(item, ":", parts: 2)
11+
case key do
12+
"type" ->
13+
%Symbol{acc | type: value}
14+
15+
"quality" ->
16+
%Symbol{acc | quality: String.to_integer(value)}
17+
18+
"points" ->
19+
%Symbol{acc | points: parse_points(value)}
20+
21+
"data" ->
22+
%Symbol{acc | data: Base.decode64!(value)}
23+
end
24+
end)
25+
end
26+
27+
defp parse_points(string) do
28+
string
29+
|> String.split(";")
30+
|> Enum.map(& parse_point/1)
31+
end
32+
33+
defp parse_point(string) do
34+
[x, y] = String.split(string, ",", parts: 2)
35+
{String.to_integer(x), String.to_integer(y)}
1036
end
1137
end

lib/zbar.ex

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ defmodule Zbar do
4848
defp collect_output(port, timeout, buffer \\ "") do
4949
receive do
5050
{^port, {:data, data}} ->
51-
IO.inspect(Base.encode64(to_string(data)), label: " <Received")
5251
collect_output(port, timeout, buffer <> to_string(data))
5352
{^port, {:exit_status, 0}} ->
5453
{:ok, buffer}

src/zbar_scanner.c

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,26 @@ int main (int argc, char **argv)
8282

8383
const zbar_symbol_t *symbol = zbar_image_first_symbol(image);
8484
for(; symbol; symbol = zbar_symbol_next(symbol)) {
85-
zbar_symbol_type_t typ = zbar_symbol_get_type(symbol);
86-
unsigned int length = zbar_symbol_get_data_length(symbol);
87-
const char *data = zbar_symbol_get_data(symbol);
88-
int base64_length;
89-
char * base64_data = base64(data, length, &base64_length);
90-
printf("%s: %s\n", zbar_get_symbol_name(typ), base64_data);
91-
free(base64_data);
85+
printf(
86+
"type:%s quality:%i points:",
87+
zbar_get_symbol_name(zbar_symbol_get_type(symbol)),
88+
zbar_symbol_get_quality(symbol)
89+
);
90+
unsigned int point_count = zbar_symbol_get_loc_size(symbol);
91+
for(int i = 0; i < point_count; i++) {
92+
printf(
93+
"%i,%i",
94+
zbar_symbol_get_loc_x(symbol, i),
95+
zbar_symbol_get_loc_y(symbol, i)
96+
);
97+
if (i+1 < point_count) printf(";");
98+
}
99+
const char *data = zbar_symbol_get_data(symbol);
100+
unsigned int data_length = zbar_symbol_get_data_length(symbol);
101+
int base64_length;
102+
char * base64_data = base64(data, data_length, &base64_length);
103+
printf(" data:%s\n", base64_data);
104+
free(base64_data);
92105
}
93106

94107
zbar_image_destroy(image);

0 commit comments

Comments
 (0)