Stefan Schuermans commited on 2011-09-11 17:17:58
Showing 31 changed files, with 607 additions and 173 deletions.
... | ... |
@@ -1,5 +1,5 @@ |
1 | 1 |
# FlexiPix library |
2 |
-# !version: 1.0.5! !date: 2010-12-22! |
|
2 |
+# !version: 1.0.6! !date: 2010-12-30! |
|
3 | 3 |
# |
4 | 4 |
# Copyright 2010 Stefan Schuermans <stefan schuermans info> |
5 | 5 |
# |
... | ... |
@@ -16,83 +16,108 @@ |
16 | 16 |
# You should have received a copy of the GNU Lesser General Public License |
17 | 17 |
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
18 | 18 |
|
19 |
-LIBTARGET=libflexipix |
|
20 |
-VER=1 |
|
21 |
-VERMIN=0 |
|
22 |
-VERREV=5 |
|
23 |
- |
|
24 |
-OS:=$(shell uname -s) |
|
25 |
-ifeq ($(OS),Linux) |
|
26 |
- SED_I=sed -i |
|
27 |
- CC=gcc |
|
28 |
- AR=ar |
|
29 |
- SHLIBFLAGS=-shared -Wl,-soname,$(LIBTARGET).so.$(VER) |
|
30 |
- SHLIBEXT=so |
|
31 |
- RANLIB=ranlib |
|
32 |
- INSTALL=install |
|
33 |
- STOW_DIR=/usr/local/stow |
|
34 |
- DEF_PREFIX=/usr/local |
|
35 |
-else |
|
36 |
- ifeq ($(OS),Darwin) |
|
37 |
- SED_I=sed -i "" |
|
38 |
- CC=gcc |
|
39 |
- AR=ar |
|
40 |
- SHLIBFLAGS=-dynamiclib |
|
41 |
- SHLIBEXT=dylib |
|
42 |
- RANLIB=ranlib |
|
43 |
- INSTALL=install |
|
44 |
- STOW_DIR=/usr/local/stow |
|
45 |
- DEF_PREFIX=/usr/local |
|
46 |
- else |
|
47 |
- $(error unsupported OS) |
|
48 |
- endif |
|
49 |
-endif |
|
19 |
+LIBTARGET := libflexipix |
|
20 |
+VER_MAJ := 1 |
|
21 |
+VER_MIN := 0 |
|
22 |
+VER_REV := 6 |
|
23 |
+ |
|
24 |
+SRCS := $(wildcard src/*.c) |
|
25 |
+EX_SRCS := $(wildcard examples/src/*.c) |
|
50 | 26 |
|
51 |
-SRCS=$(wildcard src/*.c) |
|
52 |
-EX_SRCS=$(wildcard examples/src/*.c) |
|
53 |
- |
|
54 |
-CFLAGS=-W -Wall -fPIC -O3 |
|
55 |
-DEFINES=-DFLP_VER_MAJ=$(VER) -DFLP_VER_MIN=$(VERMIN) -DFLP_VER_REV=$(VERREV) |
|
56 |
-INCLUDES=-Iinclude |
|
57 |
-LDFLAGS=-Llib |
|
58 |
-LIBS=-lm -lpthread -lflexipix |
|
59 |
- |
|
60 |
-SRCS_BASE=$(patsubst %.c,%,$(SRCS)) |
|
61 |
-DEPS=$(addsuffix .d,$(SRCS_BASE)) |
|
62 |
-OBJS=$(addsuffix .o,$(SRCS_BASE)) |
|
63 |
-EX_SRCS_BASE=$(patsubst %.c,%,$(EX_SRCS)) |
|
64 |
-EX_DEPS=$(addsuffix .d,$(EX_SRCS_BASE)) |
|
65 |
-EX_OBJS=$(addsuffix .o,$(EX_SRCS_BASE)) |
|
66 |
-EX_TARGETS=$(EX_SRCS_BASE) |
|
67 |
- |
|
68 |
-LIBTGA = lib/$(LIBTARGET).a |
|
69 |
-LIBTGSO = lib/$(LIBTARGET).$(SHLIBEXT).$(VER) |
|
70 |
-LIBTGSOM = $(LIBTGSO).$(VERMIN) |
|
71 |
-LIBTGSOR = $(LIBTGSOM).$(VERREV) |
|
72 |
- |
|
73 |
-VERSION = $(VER).$(VERMIN).$(VERREV) |
|
27 |
+VERSION := $(VER_MAJ).$(VER_MIN).$(VER_REV) |
|
74 | 28 |
DATE := $(shell date +%Y-%m-%d) |
75 |
-PACKNAME = $(LIBTARGET)-$(VERSION)_$(DATE) |
|
76 |
-PACKDATA = ChangeLog COPYING COPYING.LESSER Makefile \ |
|
29 |
+PACKNAME := $(LIBTARGET)-$(VERSION)_$(DATE) |
|
30 |
+PACKDATA := ChangeLog COPYING COPYING.LESSER Makefile \ |
|
77 | 31 |
examples include README src |
78 | 32 |
|
79 |
-ENV_PREFIX=$(shell echo $$PREFIX) |
|
80 |
-STOW_PREFIX=$(STOW_DIR)/libflexipix-$(VERSION) |
|
33 |
+CFLAGS := -W -Wall -O3 |
|
34 |
+DEFINES := -DFLP_VER_MAJ=$(VER_MAJ) -DFLP_VER_MIN=$(VER_MIN) \ |
|
35 |
+ -DFLP_VER_REV=$(VER_REV) |
|
36 |
+INCLUDES := -Iinclude |
|
37 |
+SH_LDFLAGS := |
|
38 |
+SH_LIBS := |
|
39 |
+EX_LDFLAGS := -Llib |
|
40 |
+EX_LIBS := -lm -lflexipix |
|
41 |
+STOW_DIR := /usr/local/stow |
|
42 |
+DEF_PREFIX := /usr/local |
|
43 |
+ |
|
44 |
+OS_RAW := $(shell uname -s) |
|
45 |
+ifeq ($(OS_RAW),Linux) |
|
46 |
+ OS := linux |
|
47 |
+ CC := gcc |
|
48 |
+ AR := ar |
|
49 |
+ RANLIB := ranlib |
|
50 |
+ LEXT := so |
|
51 |
+ LEXTSUF := .$(VERSION) |
|
52 |
+ BSUF := |
|
53 |
+ INSTALL := install |
|
54 |
+ CFLAGS += -fPIC |
|
55 |
+ SH_LDFLAGS += -shared -Wl,-soname,$(LIBTARGET).so.$(VER_MAJ) |
|
56 |
+ EX_LDFLAGS += -Wl,-rpath,\$$ORIGIN/../../lib |
|
57 |
+ EX_LIBS += -lpthread |
|
58 |
+endif |
|
59 |
+ |
|
60 |
+ifeq ($(OS_RAW),Darwin) |
|
61 |
+ OS := darwin |
|
62 |
+ CC := gcc |
|
63 |
+ AR := ar |
|
64 |
+ RANLIB := ranlib |
|
65 |
+ LEXT := dylib |
|
66 |
+ LEXTSUF := |
|
67 |
+ BSUF := |
|
68 |
+ INSTALL := install |
|
69 |
+ CFLAGS += -fPIC |
|
70 |
+ SH_LDFLAGS += -dynamiclib |
|
71 |
+ EX_LIBS += -lpthread |
|
72 |
+endif |
|
73 |
+ |
|
74 |
+ifeq ($(patsubst MINGW32%,MINGW32,$(OS_RAW)),MINGW32) |
|
75 |
+ OS := mingw32 |
|
76 |
+ CC := gcc |
|
77 |
+ AR := ar |
|
78 |
+ RANLIB := ranlib |
|
79 |
+ LEXT := dll |
|
80 |
+ LEXTSUF := |
|
81 |
+ BSUF := .exe |
|
82 |
+ INSTALL := install |
|
83 |
+ DEFINES += -DWINDOWS |
|
84 |
+ SH_LDFLAGS += -shared |
|
85 |
+ SH_LIBS += -lwsock32 |
|
86 |
+ EX_LIBS += -lwsock32 |
|
87 |
+endif |
|
88 |
+ |
|
89 |
+ifeq ($(OS),) |
|
90 |
+ $(error unsupported operating system $(OS_RAW)) |
|
91 |
+endif |
|
92 |
+ |
|
93 |
+SRCS_BASE := $(patsubst %.c,%,$(SRCS)) |
|
94 |
+DEPS := $(addsuffix .d,$(SRCS_BASE)) |
|
95 |
+OBJS := $(addsuffix .o,$(SRCS_BASE)) |
|
96 |
+EX_SRCS_BASE := $(patsubst %.c,%,$(EX_SRCS)) |
|
97 |
+EX_DEPS := $(addsuffix .d,$(EX_SRCS_BASE)) |
|
98 |
+EX_OBJS := $(addsuffix .o,$(EX_SRCS_BASE)) |
|
99 |
+EX_TARGETS := $(addsuffix $(BSUF),$(EX_SRCS_BASE)) |
|
100 |
+ |
|
101 |
+TARGET := lib/$(LIBTARGET).a |
|
102 |
+SH_TARGET := lib/$(LIBTARGET).$(LEXT)$(LEXTSUF) |
|
103 |
+ |
|
104 |
+ENV_PREFIX := $(shell echo $$PREFIX) |
|
105 |
+STOW_PREFIX := $(STOW_DIR)/libflexipix-$(VERSION) |
|
81 | 106 |
ifneq ($(ENV_PREFIX),) |
82 |
- PREFIX=$(ENV_PREFIX) |
|
107 |
+ PREFIX := $(ENV_PREFIX) |
|
83 | 108 |
else |
84 | 109 |
ifeq ($(shell if [ -d $(STOW_DIR) ]; then echo stow; fi),stow) |
85 |
- PREFIX=$(STOW_PREFIX) |
|
110 |
+ PREFIX := $(STOW_PREFIX) |
|
86 | 111 |
else |
87 |
- PREFIX=$(DEF_PREFIX) |
|
112 |
+ PREFIX := $(DEF_PREFIX) |
|
88 | 113 |
endif |
89 | 114 |
endif |
90 | 115 |
|
91 |
-.PHONY: all clean pack install uninstall |
|
116 |
+.PHONY: all clean install uninstall ver pack |
|
92 | 117 |
.SECONDARY: |
93 | 118 |
.SUFFIXES: |
94 | 119 |
|
95 |
-all: deps $(LIBTGA) $(LIBTGSO) $(EX_TARGETS) |
|
120 |
+all: deps $(TARGET) $(SH_TARGET) $(EX_TARGETS) |
|
96 | 121 |
|
97 | 122 |
ifneq ($(MAKECMDGOALS),clean) |
98 | 123 |
include deps |
... | ... |
@@ -103,40 +128,69 @@ deps: $(DEPS) $(EX_DEPS) |
103 | 128 |
|
104 | 129 |
%.d: %.c |
105 | 130 |
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -M -o $@ $< |
106 |
- $(SED_I) 's!^$(basename $(notdir $<))!$(dir $<)&!' $@ |
|
131 |
+ sed 's!^$(basename $(notdir $<))!$(dir $<)&!' <$@ >$@.tmp |
|
132 |
+ mv $@.tmp $@ |
|
107 | 133 |
|
108 | 134 |
%.o: %.c |
109 | 135 |
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -c -o $@ $< |
110 | 136 |
|
111 |
-%: %.o $(LIBTGA) $(LIBTGSO) |
|
112 |
- $(CC) $(LDFLAGS) -o $@ $< $(LIBS) |
|
137 |
+%$(BSUF): %.o $(LTA) $(LTSO) |
|
138 |
+ $(CC) $(EX_LDFLAGS) -o $@ $< $(EX_LIBS) |
|
113 | 139 |
|
114 | 140 |
lib: |
115 | 141 |
mkdir -p lib |
116 | 142 |
|
117 |
-$(LIBTGA): $(OBJS) lib |
|
143 |
+$(TARGET): $(OBJS) | lib |
|
118 | 144 |
$(AR) cr $@ $(filter-out lib,$+) |
119 | 145 |
$(RANLIB) $@ |
120 | 146 |
|
121 |
-$(LIBTGSOR): $(OBJS) |
|
122 |
- $(CC) $(SHLIBFLAGS) $(LDFLAGS) -o $@ $+ |
|
123 |
- |
|
124 |
-$(LIBTGSOM): $(LIBTGSOR) |
|
125 |
- rm -f $@ |
|
126 |
- ln -s $(notdir $<) $@ |
|
127 |
- |
|
128 |
-$(LIBTGSO): $(LIBTGSOM) |
|
129 |
- rm -f $@ |
|
130 |
- ln -s $(notdir $<) $@ |
|
147 |
+$(SH_TARGET): $(OBJS) | lib |
|
148 |
+ $(CC) $(SH_LDFLAGS) -o $@ $+ $(SH_LIBS) |
|
149 |
+ifeq ($(OS),linux) |
|
150 |
+ cd $(dir $@); \ |
|
151 |
+ ln -s $(notdir $@) \ |
|
152 |
+ $(patsubst %.$(VER_REV),%,$(notdir $@)) |
|
153 |
+ cd $(dir $@); \ |
|
154 |
+ ln -s $(patsubst %.$(VER_REV),%,$(notdir $@)) \ |
|
155 |
+ $(patsubst %.$(VER_MIN).$(VER_REV),%,$(notdir $@)) |
|
156 |
+ cd $(dir $@); \ |
|
157 |
+ ln -s $(patsubst %.$(VER_MIN).(VER_REV),%,$(notdir $@)) \ |
|
158 |
+ $(patsubst %.$(VER_MAJ).$(VER_MIN).$(VER_REV),%,$(notdir $@)) |
|
159 |
+endif |
|
131 | 160 |
|
132 | 161 |
clean: |
133 | 162 |
rm -rf deps $(DEPS) $(OBJS) lib \ |
134 | 163 |
$(EX_DEPS) $(EX_OBJS) $(EX_TARGETS) |
135 | 164 |
|
165 |
+install: all |
|
166 |
+ $(INSTALL) -d $(PREFIX)/include/flexipix |
|
167 |
+ $(INSTALL) -m 644 -t $(PREFIX)/include/flexipix $(wildcard include/flexipix/*.h) |
|
168 |
+ $(INSTALL) -d $(PREFIX)/lib |
|
169 |
+ $(INSTALL) -m 644 -t $(PREFIX)/lib $(TARGET) $(SH_TARGET) |
|
170 |
+ifeq ($(OS),linux) |
|
171 |
+ ln -s $(LIBTARGET).$(LEXT).$(VER_MAJ).$(VER_MIN).$(VER_REV) \ |
|
172 |
+ $(PREFIX)/lib/$(LIBTARGET).$(LEXT).$(VER_MAJ).$(VER_MIN) |
|
173 |
+ ln -s $(LIBTARGET).$(LEXT).$(VER_MAJ).$(VER_MIN) \ |
|
174 |
+ $(PREFIX)/lib/$(LIBTARGET).$(LEXT).$(VER_MAJ) |
|
175 |
+endif |
|
176 |
+ |
|
177 |
+uninstall: |
|
178 |
+ rm -f $(PREFIX)/lib/$(notdir $(SH_TARGET)) |
|
179 |
+ rm -f $(PREFIX)/lib/$(notdir $(TARGET)) |
|
180 |
+ rm -rf $(PREFIX)/include/flexipix |
|
181 |
+ |
|
182 |
+ver: |
|
183 |
+ $(MAKE) clean |
|
184 |
+ for FILE in $$(find $(PACKDATA) -type f); \ |
|
185 |
+ do \ |
|
186 |
+ <$$FILE sed 's/!version: [0-9.]*!/!version: $(VERSION)!/g' \ |
|
187 |
+ | sed 's/!date: [0-9-]*!/!date: $(DATE)!/g' >$$FILE.tmp; \ |
|
188 |
+ mv $$FILE.tmp $$FILE; \ |
|
189 |
+ done |
|
190 |
+ |
|
136 | 191 |
pack: |
137 | 192 |
$(MAKE) clean |
138 |
- $(SED_I) 's/!version: [0-9.]*!/!version: $(VERSION)!/g' $$(find $(PACKDATA) -type f) |
|
139 |
- $(SED_I) 's/!date: [0-9-]*!/!date: $(DATE)!/g' $$(find $(PACKDATA) -type f) |
|
193 |
+ $(MAKE) ver |
|
140 | 194 |
$(MAKE) |
141 | 195 |
$(MAKE) clean |
142 | 196 |
mkdir -p pack/$(PACKNAME) |
... | ... |
@@ -145,18 +199,3 @@ pack: |
145 | 199 |
rm -rf pack/$(PACKNAME) |
146 | 200 |
$(MAKE) clean |
147 | 201 |
|
148 |
-install: all |
|
149 |
- $(INSTALL) -d $(PREFIX)/include/flexipix |
|
150 |
- $(INSTALL) -m 644 -t $(PREFIX)/include/flexipix $(wildcard include/flexipix/*.h) |
|
151 |
- $(INSTALL) -d $(PREFIX)/lib |
|
152 |
- $(INSTALL) -m 644 -t $(PREFIX)/lib $(LIBTGA) $(LIBTGSO) |
|
153 |
- ln -sf $(notdir $(LIBTGSO)) $(PREFIX)/lib/$(notdir $(LIBTGSOM)) |
|
154 |
- ln -sf $(notdir $(LIBTGSOM)) $(PREFIX)/lib/$(notdir $(LIBTGSOR)) |
|
155 |
- |
|
156 |
-uninstall: |
|
157 |
- rm -f $(PREFIX)/lib/$(notdir $(LIBTGA)) |
|
158 |
- rm -f $(PREFIX)/lib/$(notdir $(LIBTGSOR)) |
|
159 |
- rm -f $(PREFIX)/lib/$(notdir $(LIBTGSOM)) |
|
160 |
- rm -f $(PREFIX)/lib/$(notdir $(LIBTGSO)) |
|
161 |
- rm -rf $(PREFIX)/include/flexipix |
|
162 |
- |
... | ... |
@@ -4,6 +4,10 @@ |
4 | 4 |
|
5 | 5 |
#include <flexipix/flexipix.h> |
6 | 6 |
|
7 |
+#ifdef WINDOWS |
|
8 |
+#include <winsock.h> |
|
9 |
+#endif |
|
10 |
+ |
|
7 | 11 |
/* just an example for some data */ |
8 | 12 |
typedef struct userdata_s { |
9 | 13 |
int i; |
... | ... |
@@ -57,6 +61,13 @@ int main(int argc, char *argv[]) |
57 | 61 |
} |
58 | 62 |
config = argv[1]; |
59 | 63 |
|
64 |
+#ifdef WINDOWS |
|
65 |
+ { |
|
66 |
+ WSADATA data; |
|
67 |
+ WSAStartup(MAKEWORD(1,1), &data); |
|
68 |
+ } |
|
69 |
+#endif |
|
70 |
+ |
|
60 | 71 |
/* create a display, take the configuration from a file, |
61 | 72 |
deliver messages to the callback function msg(), |
62 | 73 |
the last parameter is passed as first parameter to msg() |
... | ... |
@@ -87,6 +98,11 @@ int main(int argc, char *argv[]) |
87 | 98 |
printf("done\n"); |
88 | 99 |
|
89 | 100 |
flp_display_free(p_display); |
101 |
+ |
|
102 |
+#ifdef WINDOWS |
|
103 |
+ WSACleanup(); |
|
104 |
+#endif |
|
105 |
+ |
|
90 | 106 |
return 0; |
91 | 107 |
} |
92 | 108 |
|
... | ... |
@@ -4,6 +4,10 @@ |
4 | 4 |
|
5 | 5 |
#include <flexipix/flexipix.h> |
6 | 6 |
|
7 |
+#ifdef WINDOWS |
|
8 |
+#include <winsock.h> |
|
9 |
+#endif |
|
10 |
+ |
|
7 | 11 |
/* just an example for some data */ |
8 | 12 |
typedef struct userdata_s { |
9 | 13 |
int i; |
... | ... |
@@ -58,6 +62,13 @@ int main(int argc, char *argv[]) |
58 | 62 |
} |
59 | 63 |
config = argv[1]; |
60 | 64 |
|
65 |
+#ifdef WINDOWS |
|
66 |
+ { |
|
67 |
+ WSADATA data; |
|
68 |
+ WSAStartup(MAKEWORD(1,1), &data); |
|
69 |
+ } |
|
70 |
+#endif |
|
71 |
+ |
|
61 | 72 |
/* create a displayer that manages a display in the background |
62 | 73 |
and takes care that data is sent periodically to the distributors |
63 | 74 |
to prevent that the pixels turn off after a timeout, |
... | ... |
@@ -125,6 +136,11 @@ int main(int argc, char *argv[]) |
125 | 136 |
|
126 | 137 |
free(p_image); |
127 | 138 |
flp_displayer_free(p_displayer); |
139 |
+ |
|
140 |
+#ifdef WINDOWS |
|
141 |
+ WSACleanup(); |
|
142 |
+#endif |
|
143 |
+ |
|
128 | 144 |
return 0; |
129 | 145 |
} |
130 | 146 |
|
... | ... |
@@ -4,6 +4,10 @@ |
4 | 4 |
|
5 | 5 |
#include <flexipix/flexipix.h> |
6 | 6 |
|
7 |
+#ifdef WINDOWS |
|
8 |
+#include <winsock.h> |
|
9 |
+#endif |
|
10 |
+ |
|
7 | 11 |
/* just an example for some data */ |
8 | 12 |
typedef struct userdata_s { |
9 | 13 |
int i; |
... | ... |
@@ -57,6 +61,13 @@ int main(int argc, char *argv[]) |
57 | 61 |
} |
58 | 62 |
config = argv[1]; |
59 | 63 |
|
64 |
+#ifdef WINDOWS |
|
65 |
+ { |
|
66 |
+ WSADATA data; |
|
67 |
+ WSAStartup(MAKEWORD(1,1), &data); |
|
68 |
+ } |
|
69 |
+#endif |
|
70 |
+ |
|
60 | 71 |
/* create a display, take the configuration from a file, |
61 | 72 |
deliver messages to the callback function msg(), |
62 | 73 |
the last parameter is passed as first parameter to msg() |
... | ... |
@@ -97,6 +108,11 @@ int main(int argc, char *argv[]) |
97 | 108 |
|
98 | 109 |
free(p_image); |
99 | 110 |
flp_display_free(p_display); |
111 |
+ |
|
112 |
+#ifdef WINDOWS |
|
113 |
+ WSACleanup(); |
|
114 |
+#endif |
|
115 |
+ |
|
100 | 116 |
return 0; |
101 | 117 |
} |
102 | 118 |
|
... | ... |
@@ -1,6 +1,6 @@ |
1 | 1 |
/* |
2 | 2 |
* FlexiPix library |
3 |
- * !version: 1.0.5! !date: 2010-12-22! |
|
3 |
+ * !version: 1.0.6! !date: 2010-12-30! |
|
4 | 4 |
* |
5 | 5 |
* Copyright 2010 Stefan Schuermans <stefan schuermans info> |
6 | 6 |
* |
... | ... |
@@ -21,13 +21,15 @@ |
21 | 21 |
#ifndef FLP_DISPLAYER_H |
22 | 22 |
#define FLP_DISPLAYER_H |
23 | 23 |
|
24 |
+#include <intern/thread.h> |
|
25 |
+ |
|
24 | 26 |
/** |
25 | 27 |
* \brief output thread of displayer object |
26 | 28 |
* |
27 | 29 |
* \param[in] vp_displayer pointer to displayer object |
28 | 30 |
* \return unused, always NULL |
29 | 31 |
*/ |
30 |
-void * flp_displayer_thread(void *vp_displayer); |
|
32 |
+FLP_THREAD_FUNC(flp_displayer_thread); |
|
31 | 33 |
|
32 | 34 |
#endif /* #ifndef FLP_DISPLAYER_H */ |
33 | 35 |
|
... | ... |
@@ -0,0 +1,37 @@ |
1 |
+/* |
|
2 |
+ * FlexiPix library |
|
3 |
+ * !version: 1.0.6! !date: 2010-12-30! |
|
4 |
+ * |
|
5 |
+ * Copyright 2010 Stefan Schuermans <stefan schuermans info> |
|
6 |
+ * |
|
7 |
+ * This program is free software: you can redistribute it and/or modify |
|
8 |
+ * it under the terms of the GNU General Public License as published by |
|
9 |
+ * the Free Software Foundation, version 3 of the License. |
|
10 |
+ * |
|
11 |
+ * |
|
12 |
+ * This program is distributed in the hope that it will be useful, |
|
13 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
14 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
15 |
+ * GNU General Public License for more details. |
|
16 |
+ * |
|
17 |
+ * You should have received a copy of the GNU Lesser General Public License |
|
18 |
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
19 |
+ */ |
|
20 |
+ |
|
21 |
+#ifndef FLP_MISSING_H |
|
22 |
+#define FLP_MISSING_H |
|
23 |
+ |
|
24 |
+#include <string.h> |
|
25 |
+ |
|
26 |
+#ifdef WINDOWS |
|
27 |
+extern inline char * strerror_r(int errnum, char *buf, size_t buflen) |
|
28 |
+{ |
|
29 |
+ strncpy(buf, strerror(errnum), buflen); |
|
30 |
+ if (buflen >= 1) |
|
31 |
+ buf[buflen - 1] = 0; |
|
32 |
+ return buf; |
|
33 |
+} |
|
34 |
+#endif |
|
35 |
+ |
|
36 |
+#endif /* #ifndef FLP_MISSING_H */ |
|
37 |
+ |
... | ... |
@@ -1,6 +1,6 @@ |
1 | 1 |
/* |
2 | 2 |
* FlexiPix library |
3 |
- * !version: 1.0.5! !date: 2010-12-22! |
|
3 |
+ * !version: 1.0.6! !date: 2010-12-30! |
|
4 | 4 |
* |
5 | 5 |
* Copyright 2010 Stefan Schuermans <stefan schuermans info> |
6 | 6 |
* |
... | ... |
@@ -22,15 +22,72 @@ |
22 | 22 |
#define FLP_NET_H |
23 | 23 |
|
24 | 24 |
#ifdef WINDOWS |
25 |
+# include <stdint.h> |
|
25 | 26 |
# include <winsock2.h> |
26 | 27 |
#else |
27 |
-#define closesocket close |
|
28 | 28 |
# include <arpa/inet.h> |
29 |
+# include <errno.h> |
|
29 | 30 |
# include <netdb.h> |
30 | 31 |
# include <netinet/in.h> |
32 |
+# include <string.h> |
|
31 | 33 |
# include <sys/socket.h> |
32 | 34 |
# include <unistd.h> |
33 | 35 |
#endif |
34 | 36 |
|
37 |
+/** type of socket descriptor */ |
|
38 |
+#ifdef WINDOWS |
|
39 |
+typedef SOCKET flp_sock_t; |
|
40 |
+#else |
|
41 |
+typedef int flp_sock_t; |
|
42 |
+#endif |
|
43 |
+ |
|
44 |
+#ifdef WINDOWS |
|
45 |
+/** IP address type missing on Windows */ |
|
46 |
+typedef uint32_t in_addr_t; |
|
47 |
+#endif |
|
48 |
+ |
|
49 |
+#ifdef WINDOWS |
|
50 |
+/** port type missing on Windows */ |
|
51 |
+typedef uint16_t in_port_t; |
|
52 |
+#endif |
|
53 |
+ |
|
54 |
+#ifndef WINDOWS |
|
55 |
+/** closesocket() only exists for Windows,other OSes just use close() */ |
|
56 |
+extern inline int closesocket(int fd) |
|
57 |
+{ |
|
58 |
+ return close(fd); |
|
59 |
+} |
|
60 |
+#endif |
|
61 |
+ |
|
62 |
+/** |
|
63 |
+ * \brief check a socket descriptor |
|
64 |
+ * \param[in] sock socket descriptor to check |
|
65 |
+ * \return 1 if valid, 0 if not valid |
|
66 |
+ */ |
|
67 |
+extern inline int flp_sock_is_valid(flp_sock_t sock) |
|
68 |
+{ |
|
69 |
+#ifdef WINDOWS |
|
70 |
+ return sock != INVALID_SOCKET; |
|
71 |
+#else |
|
72 |
+ return sock >= 0; |
|
73 |
+#endif |
|
74 |
+} |
|
75 |
+ |
|
76 |
+/** |
|
77 |
+ * \brief get error of last socket call as text |
|
78 |
+ * \param[in] buf pointer to buffer to place text into |
|
79 |
+ * \param[in] buflen size of buffer |
|
80 |
+ */ |
|
81 |
+extern inline void flp_sock_get_last_error(char *buf, size_t buflen) |
|
82 |
+{ |
|
83 |
+#ifdef WINDOWS |
|
84 |
+ int err = WSAGetLastError(); |
|
85 |
+ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, |
|
86 |
+ NULL, err, 0, buf, buflen, NULL); |
|
87 |
+#else |
|
88 |
+ strerror_r(errno, buf, buflen); |
|
89 |
+#endif |
|
90 |
+} |
|
91 |
+ |
|
35 | 92 |
#endif /* #ifndef FLP_NET_H */ |
36 | 93 |
|
... | ... |
@@ -0,0 +1,256 @@ |
1 |
+/* |
|
2 |
+ * FlexiPix library |
|
3 |
+ * !version: 1.0.6! !date: 2010-12-30! |
|
4 |
+ * |
|
5 |
+ * Copyright 2010 Stefan Schuermans <stefan schuermans info> |
|
6 |
+ * |
|
7 |
+ * This program is free software: you can redistribute it and/or modify |
|
8 |
+ * it under the terms of the GNU General Public License as published by |
|
9 |
+ * the Free Software Foundation, version 3 of the License. |
|
10 |
+ * |
|
11 |
+ * |
|
12 |
+ * This program is distributed in the hope that it will be useful, |
|
13 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
14 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
15 |
+ * GNU General Public License for more details. |
|
16 |
+ * |
|
17 |
+ * You should have received a copy of the GNU Lesser General Public License |
|
18 |
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
19 |
+ */ |
|
20 |
+ |
|
21 |
+#ifndef FLP_THREAD_H |
|
22 |
+#define FLP_THREAD_H |
|
23 |
+ |
|
24 |
+#ifdef WINDOWS |
|
25 |
+# include <windows.h> |
|
26 |
+#else |
|
27 |
+# include <errno.h> |
|
28 |
+# include <pthread.h> |
|
29 |
+# include <sys/time.h> |
|
30 |
+# include <stdlib.h> |
|
31 |
+#endif |
|
32 |
+ |
|
33 |
+/** signature to define or declare thread function */ |
|
34 |
+#ifdef WINDOWS |
|
35 |
+# define FLP_THREAD_FUNC(func) DWORD (__stdcall func)(LPVOID vp_displayer) |
|
36 |
+#else |
|
37 |
+# define FLP_THREAD_FUNC(func) void * (func)(void *vp_displayer) |
|
38 |
+#endif |
|
39 |
+ |
|
40 |
+/** return a void pointer from a thread function */ |
|
41 |
+#ifdef WINDOWS |
|
42 |
+# define FLP_THREAD_RETURN(vp) return (DWORD)(vp); |
|
43 |
+#else |
|
44 |
+# define FLP_THREAD_RETURN(vp) return (vp); |
|
45 |
+#endif |
|
46 |
+ |
|
47 |
+/** type for a thread ID */ |
|
48 |
+#ifdef WINDOWS |
|
49 |
+typedef HANDLE flp_thread_id_t; |
|
50 |
+#else |
|
51 |
+typedef pthread_t flp_thread_id_t; |
|
52 |
+#endif |
|
53 |
+ |
|
54 |
+/** type for a mutex */ |
|
55 |
+#ifdef WINDOWS |
|
56 |
+typedef HANDLE flp_thread_mutex_t; |
|
57 |
+#else |
|
58 |
+typedef pthread_mutex_t flp_thread_mutex_t; |
|
59 |
+#endif |
|
60 |
+ |
|
61 |
+/** type for a condition */ |
|
62 |
+#ifdef WINDOWS |
|
63 |
+typedef HANDLE flp_thread_cond_t; |
|
64 |
+#else |
|
65 |
+typedef pthread_cond_t flp_thread_cond_t; |
|
66 |
+#endif |
|
67 |
+ |
|
68 |
+/** |
|
69 |
+ * \brief create a thread |
|
70 |
+ * \param[out] *p_tid thread ID |
|
71 |
+ * \param[in] func thread function |
|
72 |
+ * \param[in] p_data user data pointer |
|
73 |
+ * \return 1 if successful, 0 on error |
|
74 |
+ */ |
|
75 |
+extern inline int flp_thread_create(flp_thread_id_t *p_tid, |
|
76 |
+ FLP_THREAD_FUNC(*func), |
|
77 |
+ void * p_data) |
|
78 |
+{ |
|
79 |
+#ifdef WINDOWS |
|
80 |
+ HANDLE h = CreateThread(NULL, 0, func, (LPVOID)p_data, 0, NULL); |
|
81 |
+ if (h != NULL) |
|
82 |
+ *p_tid = h; |
|
83 |
+ return h != NULL; |
|
84 |
+#else |
|
85 |
+ return pthread_create(p_tid, NULL, func, p_data) == 0; |
|
86 |
+#endif |
|
87 |
+} |
|
88 |
+ |
|
89 |
+/** |
|
90 |
+ * \brief join a thread |
|
91 |
+ * \param[in] tid thread ID |
|
92 |
+ */ |
|
93 |
+extern inline void flp_thread_join(flp_thread_id_t tid) |
|
94 |
+{ |
|
95 |
+#ifdef WINDOWS |
|
96 |
+ WaitForSingleObject(tid, INFINITE); |
|
97 |
+ CloseHandle(tid); |
|
98 |
+#else |
|
99 |
+ pthread_join(tid, NULL); |
|
100 |
+#endif |
|
101 |
+} |
|
102 |
+ |
|
103 |
+/** |
|
104 |
+ * \brief initialize mutex |
|
105 |
+ * \param[in] *p_mtx mutex variable |
|
106 |
+ * \return 1 if successful, 0 on error |
|
107 |
+ */ |
|
108 |
+extern inline int flp_thread_mutex_init(flp_thread_mutex_t *p_mtx) |
|
109 |
+{ |
|
110 |
+#ifdef WINDOWS |
|
111 |
+ HANDLE h = CreateMutex(NULL, FALSE, NULL); |
|
112 |
+ if (h != NULL) |
|
113 |
+ *p_mtx = h; |
|
114 |
+ return h != NULL; |
|
115 |
+#else |
|
116 |
+ return pthread_mutex_init(p_mtx, NULL) == 0; |
|
117 |
+#endif |
|
118 |
+} |
|
119 |
+ |
|
120 |
+/** |
|
121 |
+ * \brief destroy mutex |
|
122 |
+ * \param[in] *p_mtx mutex variable |
|
123 |
+ */ |
|
124 |
+extern inline void flp_thread_mutex_destroy(flp_thread_mutex_t *p_mtx) |
|
125 |
+{ |
|
126 |
+#ifdef WINDOWS |
|
127 |
+ CloseHandle(*p_mtx); |
|
128 |
+#else |
|
129 |
+ pthread_mutex_destroy(p_mtx); |
|
130 |
+#endif |
|
131 |
+} |
|
132 |
+ |
|
133 |
+/** |
|
134 |
+ * \brief lock mutex |
|
135 |
+ * \param[in] *p_mtx mutex variable |
|
136 |
+ */ |
|
137 |
+extern inline void flp_thread_mutex_lock(flp_thread_mutex_t *p_mtx) |
|
138 |
+{ |
|
139 |
+#ifdef WINDOWS |
|
140 |
+ WaitForSingleObject(*p_mtx, INFINITE); |
|
141 |
+#else |
|
142 |
+ pthread_mutex_lock(p_mtx); |
|
143 |
+#endif |
|
144 |
+} |
|
145 |
+ |
|
146 |
+/** |
|
147 |
+ * \brief unlock mutex |
|
148 |
+ * \param[in] *p_mtx mutex variable |
|
149 |
+ */ |
|
150 |
+extern inline void flp_thread_mutex_unlock(flp_thread_mutex_t *p_mtx) |
|
151 |
+{ |
|
152 |
+#ifdef WINDOWS |
|
153 |
+ ReleaseMutex(*p_mtx); |
|
154 |
+#else |
|
155 |
+ pthread_mutex_unlock(p_mtx); |
|
156 |
+#endif |
|
157 |
+} |
|
158 |
+ |
|
159 |
+/** |
|
160 |
+ * \brief initialize condition |
|
161 |
+ * \param[in] *p_cond conition variable |
|
162 |
+ * \return 1 if successful, 0 on error |
|
163 |
+ */ |
|
164 |
+extern inline int flp_thread_cond_init(flp_thread_cond_t *p_cond) |
|
165 |
+{ |
|
166 |
+#ifdef WINDOWS |
|
167 |
+ HANDLE h = CreateEvent(NULL, FALSE, FALSE, NULL); |
|
168 |
+ if (h != NULL) |
|
169 |
+ *p_cond = h; |
|
170 |
+ return h != NULL; |
|
171 |
+#else |
|
172 |
+ return pthread_cond_init(p_cond, NULL) == 0; |
|
173 |
+#endif |
|
174 |
+} |
|
175 |
+ |
|
176 |
+/** |
|
177 |
+ * \brief destroy condition |
|
178 |
+ * \param[in] *p_cond condition variable |
|
179 |
+ */ |
|
180 |
+extern inline void flp_thread_cond_destroy(flp_thread_cond_t *p_cond) |
|
181 |
+{ |
|
182 |
+#ifdef WINDOWS |
|
183 |
+ CloseHandle(*p_cond); |
|
184 |
+#else |
|
185 |
+ pthread_cond_destroy(p_cond); |
|
186 |
+#endif |
|
187 |
+} |
|
188 |
+ |
|
189 |
+/** |
|
190 |
+ * \brief signal condition |
|
191 |
+ * \param[in] *p_cond condition variable |
|
192 |
+ */ |
|
193 |
+extern inline void flp_thread_cond_signal(flp_thread_cond_t *p_cond) |
|
194 |
+{ |
|
195 |
+#ifdef WINDOWS |
|
196 |
+ SetEvent(*p_cond); |
|
197 |
+#else |
|
198 |
+ pthread_cond_signal(p_cond); |
|
199 |
+#endif |
|
200 |
+} |
|
201 |
+ |
|
202 |
+/** |
|
203 |
+ * \brief wait for condition |
|
204 |
+ * \param[in] *p_cond condition variable |
|
205 |
+ * \param[in] *p_mtx mutex variable to unlock while waiting |
|
206 |
+ */ |
|
207 |
+extern inline void flp_thread_cond_wait(flp_thread_cond_t *p_cond, |
|
208 |
+ flp_thread_mutex_t *p_mtx) |
|
209 |
+{ |
|
210 |
+#ifdef WINDOWS |
|
211 |
+ /* the unlock/wait-begin and wait-end/lock are atomic for pthread, |
|
212 |
+ but this is not needed for libflexipix... */ |
|
213 |
+ ReleaseMutex(*p_mtx); /* unlock mutex */ |
|
214 |
+ WaitForSingleObject(*p_cond, INFINITE); /* wait for condition */ |
|
215 |
+ WaitForSingleObject(*p_mtx, INFINITE); /* lock mutex again */ |
|
216 |
+#else |
|
217 |
+ pthread_cond_wait(p_cond, p_mtx); |
|
218 |
+#endif |
|
219 |
+} |
|
220 |
+ |
|
221 |
+/** |
|
222 |
+ * \brief wait for condition with timeout |
|
223 |
+ * \param[in] *p_cond condition variable |
|
224 |
+ * \param[in] *p_mtx mutex variable to unlock while waiting |
|
225 |
+ * \param[in] *p_now current time |
|
226 |
+ * \param[in] millisecs number of milliseconds to wait at most |
|
227 |
+ * \return 0 for condition singnaled, 1 for timeout |
|
228 |
+ */ |
|
229 |
+extern inline int flp_thread_cond_timedwait(flp_thread_cond_t *p_cond, |
|
230 |
+ flp_thread_mutex_t *p_mtx, |
|
231 |
+ struct timeval *p_now, |
|
232 |
+ unsigned int millisecs) |
|
233 |
+{ |
|
234 |
+#ifdef WINDOWS |
|
235 |
+ int ret; |
|
236 |
+ /* the unlock/wait-begin and wait-end/lock are atomic for pthread, |
|
237 |
+ but this is not needed for libflexipix... */ |
|
238 |
+ ReleaseMutex(*p_mtx); /* unlock mutex */ |
|
239 |
+ ret = WaitForSingleObject(*p_cond, millisecs); /* wait for condition */ |
|
240 |
+ WaitForSingleObject(*p_mtx, INFINITE); /* lock mutex again */ |
|
241 |
+ return ret == WAIT_TIMEOUT; |
|
242 |
+ (void)p_now; |
|
243 |
+#else |
|
244 |
+ struct timespec until; |
|
245 |
+ until.tv_sec = p_now->tv_sec + millisecs / 1000; |
|
246 |
+ until.tv_nsec = p_now->tv_usec * 1000 + (millisecs % 1000) * 1000000; |
|
247 |
+ if (until.tv_nsec > 1000000000) { |
|
248 |
+ until.tv_nsec -= 1000000000; |
|
249 |
+ until.tv_sec++; |
|
250 |
+ } |
|
251 |
+ return pthread_cond_timedwait(p_cond, p_mtx, &until) == ETIMEDOUT; |
|
252 |
+#endif |
|
253 |
+} |
|
254 |
+ |
|
255 |
+#endif /* #ifndef FLP_THREAD_H */ |
|
256 |
+ |
... | ... |
@@ -1,6 +1,6 @@ |
1 | 1 |
/* |
2 | 2 |
* FlexiPix library |
3 |
- * !version: 1.0.5! !date: 2010-12-22! |
|
3 |
+ * !version: 1.0.6! !date: 2010-12-30! |
|
4 | 4 |
* |
5 | 5 |
* Copyright 2010 Stefan Schuermans <stefan schuermans info> |
6 | 6 |
* |
... | ... |
@@ -21,11 +21,10 @@ |
21 | 21 |
#ifndef FLP_TYPES_H |
22 | 22 |
#define FLP_TYPES_H |
23 | 23 |
|
24 |
-#include <pthread.h> |
|
25 |
- |
|
26 | 24 |
#include <flexipix/types.h> |
27 | 25 |
#include <intern/constants.h> |
28 | 26 |
#include <intern/net.h> |
27 |
+#include <intern/thread.h> |
|
29 | 28 |
|
30 | 29 |
/** mapping information |
31 | 30 |
* |
... | ... |
@@ -73,7 +72,7 @@ struct flp_display_s { |
73 | 72 |
unsigned int distri_cnt; /**< total number of distris */ |
74 | 73 |
unsigned int output_cnt; /**< total number of outputs */ |
75 | 74 |
unsigned long pixel_cnt; /**< total number of pixels */ |
76 |
- int sock; /**< socket to send UDP packets */ |
|
75 |
+ flp_sock_t sock; /**< socket to send UDP packets */ |
|
77 | 76 |
}; |
78 | 77 |
|
79 | 78 |
/** a displayer |
... | ... |
@@ -82,9 +81,9 @@ struct flp_display_s { |
82 | 81 |
*/ |
83 | 82 |
struct flp_displayer_s { |
84 | 83 |
flp_display_t *p_display; /**< display managed by this displayer */ |
85 |
- pthread_mutex_t mtx; /**< mutex to lock msg_buf of distris */ |
|
86 |
- pthread_cond_t cond; /**< condition to wake up thread on new frame */ |
|
87 |
- pthread_t tid; /**< id of output thread */ |
|
84 |
+ flp_thread_mutex_t mtx; /**< mutex to lock msg_buf of distris */ |
|
85 |
+ flp_thread_cond_t cond; /**< condition to wake up thread on new frame */ |
|
86 |
+ flp_thread_id_t tid; /**< id of output thread */ |
|
88 | 87 |
volatile int active; /**< if to output to distris */ |
89 | 88 |
volatile int send; /**< set to force immediate sending to distris */ |
90 | 89 |
volatile int end; /**< set to signal end to thread */ |
... | ... |
@@ -1,6 +1,6 @@ |
1 | 1 |
/* |
2 | 2 |
* FlexiPix library |
3 |
- * !version: 1.0.5! !date: 2010-12-22! |
|
3 |
+ * !version: 1.0.6! !date: 2010-12-30! |
|
4 | 4 |
* |
5 | 5 |
* Copyright 2010 Stefan Schuermans <stefan schuermans info> |
6 | 6 |
* |
... | ... |
@@ -29,6 +29,7 @@ |
29 | 29 |
#include <intern/constants.h> |
30 | 30 |
#include <intern/config.h> |
31 | 31 |
#include <intern/mapping.h> |
32 |
+#include <intern/missing.h> |
|
32 | 33 |
#include <intern/net.h> |
33 | 34 |
#include <intern/parse.h> |
34 | 35 |
#include <intern/strtod_noloc.h> |
... | ... |
@@ -1,6 +1,6 @@ |
1 | 1 |
/* |
2 | 2 |
* FlexiPix library |
3 |
- * !version: 1.0.5! !date: 2010-12-22! |
|
3 |
+ * !version: 1.0.6! !date: 2010-12-30! |
|
4 | 4 |
* |
5 | 5 |
* Copyright 2010 Stefan Schuermans <stefan schuermans info> |
6 | 6 |
* |
... | ... |
@@ -79,11 +79,11 @@ flp_display_t *flp_display_create(const char *sz_config_file, |
79 | 79 |
|
80 | 80 |
/* create socket */ |
81 | 81 |
p_display->sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); |
82 |
- if (p_display->sock < 0) { |
|
82 |
+ if (!flp_sock_is_valid(p_display->sock)) { |
|
83 | 83 |
flp_display_free(p_display); |
84 | 84 |
if (p_msg_func) { |
85 | 85 |
char errmsg[256]; |
86 |
- strerror_r(errno, errmsg, sizeof(errmsg)); |
|
86 |
+ flp_sock_get_last_error(errmsg, sizeof(errmsg)); |
|
87 | 87 |
p_msg_func(p_msg_ctx, flp_msg_type_err, |
88 | 88 |
"could not create UDP socket: %s\n", errmsg); |
89 | 89 |
} |
... | ... |
@@ -96,7 +96,7 @@ flp_display_t *flp_display_create(const char *sz_config_file, |
96 | 96 |
flp_display_free(p_display); |
97 | 97 |
if (p_msg_func) { |
98 | 98 |
char errmsg[256]; |
99 |
- strerror_r(errno, errmsg, sizeof(errmsg)); |
|
99 |
+ flp_sock_get_last_error(errmsg, sizeof(errmsg)); |
|
100 | 100 |
p_msg_func(p_msg_ctx, flp_msg_type_err, |
101 | 101 |
"could not bind UDP socket to \"%s:%u\": %s\n", |
102 | 102 |
inet_ntoa(p_display->bind_addr.sin_addr), |
... | ... |
@@ -134,7 +134,7 @@ void flp_display_free(flp_display_t *p_display) |
134 | 134 |
} |
135 | 135 |
|
136 | 136 |
/* close network connection */ |
137 |
- if (p_display->sock >= 0) |
|
137 |
+ if (flp_sock_is_valid(p_display->sock)) |
|
138 | 138 |
closesocket(p_display->sock); |
139 | 139 |
|
140 | 140 |
/* free display structutre */ |
... | ... |
@@ -260,8 +260,8 @@ void flp_display_send(flp_display_t *p_display) |
260 | 260 |
htonl(FLP_DEST_IP_BASE + p_distri->distri * FLP_DEST_IP_STEP); |
261 | 261 |
|
262 | 262 |
/* send message as UDP packet */ |
263 |
- sendto(p_display->sock, p_distri->p_msg_buf, p_distri->msg_len, 0, |
|
264 |
- (struct sockaddr *)&dest_addr, sizeof (dest_addr)); |
|
263 |
+ sendto(p_display->sock, (char *)p_distri->p_msg_buf, p_distri->msg_len, |
|
264 |
+ 0, (struct sockaddr *)&dest_addr, sizeof (dest_addr)); |
|
265 | 265 |
|
266 | 266 |
} /* if (p_distri) */ |
267 | 267 |
} /* for (distri ...) */ |
... | ... |
@@ -1,6 +1,6 @@ |
1 | 1 |
/* |
2 | 2 |
* FlexiPix library |
3 |
- * !version: 1.0.5! !date: 2010-12-22! |
|
3 |
+ * !version: 1.0.6! !date: 2010-12-30! |
|
4 | 4 |
* |
5 | 5 |
* Copyright 2010 Stefan Schuermans <stefan schuermans info> |
6 | 6 |
* |
... | ... |
@@ -18,7 +18,6 @@ |
18 | 18 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 | 19 |
*/ |
20 | 20 |
|
21 |
-#include <pthread.h> |
|
22 | 21 |
#include <sys/time.h> |
23 | 22 |
#include <stdlib.h> |
24 | 23 |
|
... | ... |
@@ -27,6 +26,7 @@ |
27 | 26 |
#include <flexipix/msg.h> |
28 | 27 |
#include <flexipix/types.h> |
29 | 28 |
#include <intern/displayer.h> |
29 |
+#include <intern/thread.h> |
|
30 | 30 |
#include <intern/types.h> |
31 | 31 |
|
32 | 32 |
/** |
... | ... |
@@ -81,7 +81,7 @@ flp_displayer_t *flp_displayer_create(const char *sz_config_file, |
81 | 81 |
/* set up output thread */ |
82 | 82 |
|
83 | 83 |
/* initialize mutex */ |
84 |
- if (pthread_mutex_init(&p_displayer->mtx, NULL)) { |
|
84 |
+ if (!flp_thread_mutex_init(&p_displayer->mtx)) { |
|
85 | 85 |
flp_display_free(p_displayer->p_display); |
86 | 86 |
free(p_displayer); |
87 | 87 |
if (p_msg_func) |
... | ... |
@@ -91,8 +91,8 @@ flp_displayer_t *flp_displayer_create(const char *sz_config_file, |
91 | 91 |
} |
92 | 92 |
|
93 | 93 |
/* initialize condition */ |
94 |
- if (pthread_cond_init(&p_displayer->cond, NULL)) { |
|
95 |
- pthread_mutex_destroy(&p_displayer->mtx); |
|
94 |
+ if (!flp_thread_cond_init(&p_displayer->cond)) { |
|
95 |
+ flp_thread_mutex_destroy(&p_displayer->mtx); |
|
96 | 96 |
flp_display_free(p_displayer->p_display); |
97 | 97 |
free(p_displayer); |
98 | 98 |
if (p_msg_func) |
... | ... |
@@ -102,10 +102,10 @@ flp_displayer_t *flp_displayer_create(const char *sz_config_file, |
102 | 102 |
} |
103 | 103 |
|
104 | 104 |
/* create thread */ |
105 |
- if (pthread_create(&p_displayer->tid, NULL, |
|
106 |
- flp_displayer_thread, (void *)p_displayer)) { |
|
107 |
- pthread_cond_destroy(&p_displayer->cond); |
|
108 |
- pthread_mutex_destroy(&p_displayer->mtx); |
|
105 |
+ if (!flp_thread_create(&p_displayer->tid, flp_displayer_thread, |
|
106 |
+ (void *)p_displayer)) { |
|
107 |
+ flp_thread_cond_destroy(&p_displayer->cond); |
|
108 |
+ flp_thread_mutex_destroy(&p_displayer->mtx); |
|
109 | 109 |
flp_display_free(p_displayer->p_display); |
110 | 110 |
free(p_displayer); |
111 | 111 |
if (p_msg_func) |
... | ... |
@@ -126,10 +126,10 @@ void flp_displayer_free(flp_displayer_t *p_displayer) |
126 | 126 |
{ |
127 | 127 |
/* tear down thread */ |
128 | 128 |
p_displayer->end = 1; |
129 |
- pthread_cond_signal(&p_displayer->cond); |
|
130 |
- pthread_join(p_displayer->tid, NULL); |
|
131 |
- pthread_cond_destroy(&p_displayer->cond); |
|
132 |
- pthread_mutex_destroy(&p_displayer->mtx); |
|
129 |
+ flp_thread_cond_signal(&p_displayer->cond); |
|
130 |
+ flp_thread_join(p_displayer->tid); |
|
131 |
+ flp_thread_cond_destroy(&p_displayer->cond); |
|
132 |
+ flp_thread_mutex_destroy(&p_displayer->mtx); |
|
133 | 133 |
|
134 | 134 |
/* free managed display */ |
135 | 135 |
flp_display_free(p_displayer->p_display); |
... | ... |
@@ -148,9 +148,9 @@ void flp_displayer_free(flp_displayer_t *p_displayer) |
148 | 148 |
void flp_displayer_get_size(flp_displayer_t *p_displayer, |
149 | 149 |
unsigned int *p_width, unsigned int *p_height) |
150 | 150 |
{ |
151 |
- pthread_mutex_lock(&p_displayer->mtx); |
|
151 |
+ flp_thread_mutex_lock(&p_displayer->mtx); |
|
152 | 152 |
flp_display_get_size(p_displayer->p_display, p_width, p_height); |
153 |
- pthread_mutex_unlock(&p_displayer->mtx); |
|
153 |
+ flp_thread_mutex_unlock(&p_displayer->mtx); |
|
154 | 154 |
} |
155 | 155 |
|
156 | 156 |
/** |
... | ... |
@@ -166,7 +166,7 @@ void flp_displayer_get_size(flp_displayer_t *p_displayer, |
166 | 166 |
void flp_displayer_activate(flp_displayer_t *p_displayer) |
167 | 167 |
{ |
168 | 168 |
p_displayer->active = 1; |
169 |
- pthread_cond_signal(&p_displayer->cond); |
|
169 |
+ flp_thread_cond_signal(&p_displayer->cond); |
|
170 | 170 |
} |
171 | 171 |
|
172 | 172 |
/** |
... | ... |
@@ -192,9 +192,9 @@ void flp_displayer_deactivate(flp_displayer_t *p_displayer) |
192 | 192 |
*/ |
193 | 193 |
void flp_displayer_data_clear(flp_displayer_t *p_displayer) |
194 | 194 |
{ |
195 |
- pthread_mutex_lock(&p_displayer->mtx); |
|
195 |
+ flp_thread_mutex_lock(&p_displayer->mtx); |
|
196 | 196 |
flp_display_data_clear(p_displayer->p_display); |
197 |
- pthread_mutex_unlock(&p_displayer->mtx); |
|
197 |
+ flp_thread_mutex_unlock(&p_displayer->mtx); |
|
198 | 198 |
} |
199 | 199 |
|
200 | 200 |
/** |
... | ... |
@@ -217,10 +217,10 @@ void flp_displayer_data(flp_displayer_t *p_displayer, flp_u8_t *p_data, |
217 | 217 |
unsigned int x, unsigned int y, |
218 | 218 |
unsigned int width, unsigned int height) |
219 | 219 |
{ |
220 |
- pthread_mutex_lock(&p_displayer->mtx); |
|
220 |
+ flp_thread_mutex_lock(&p_displayer->mtx); |
|
221 | 221 |
flp_display_data(p_displayer->p_display, p_data, stride_x, stride_y, |
222 | 222 |
x, y, width, height); |
223 |
- pthread_mutex_unlock(&p_displayer->mtx); |
|
223 |
+ flp_thread_mutex_unlock(&p_displayer->mtx); |
|
224 | 224 |
} |
225 | 225 |
|
226 | 226 |
/** |
... | ... |
@@ -233,27 +233,23 @@ void flp_displayer_data(flp_displayer_t *p_displayer, flp_u8_t *p_data, |
233 | 233 |
void flp_displayer_send(flp_displayer_t *p_displayer) |
234 | 234 |
{ |
235 | 235 |
p_displayer->send = 1; |
236 |
- pthread_cond_signal(&p_displayer->cond); |
|
236 |
+ flp_thread_cond_signal(&p_displayer->cond); |
|
237 | 237 |
} |
238 | 238 |
|
239 |
-#define FLP_MMFI_MS_S (FLP_MCUF_MAX_FRAME_INTERVAL_MS / 1000) |
|
240 |
-#define FLP_MMFI_MS_US ((FLP_MCUF_MAX_FRAME_INTERVAL_MS % 1000) * 1000) |
|
241 |
-#define FLP_MMFI_MS_NS ((FLP_MCUF_MAX_FRAME_INTERVAL_MS % 1000) * 1000000) |
|
242 |
- |
|
243 | 239 |
/** |
244 | 240 |
* \brief output thread of displayer object |
245 | 241 |
* |
246 | 242 |
* \param[in] vp_displayer pointer to displayer object |
247 | 243 |
* \return unused, always NULL |
248 | 244 |
*/ |
249 |
-void * flp_displayer_thread(void *vp_displayer) |
|
245 |
+FLP_THREAD_FUNC(flp_displayer_thread) |
|
250 | 246 |
{ |
251 | 247 |
flp_displayer_t *p_displayer = (flp_displayer_t *)vp_displayer; |
252 | 248 |
struct timeval last, now, delta; |
253 |
- struct timespec until; |
|
254 | 249 |
int timed_send; |
250 |
+ int interval_ms = FLP_MCUF_MAX_FRAME_INTERVAL_MS; |
|
255 | 251 |
|
256 |
- pthread_mutex_lock(&p_displayer->mtx); |
|
252 |
+ flp_thread_mutex_lock(&p_displayer->mtx); |
|
257 | 253 |
|
258 | 254 |
gettimeofday(&last, NULL); /* initialize last to some valid time */ |
259 | 255 |
|
... | ... |
@@ -273,9 +269,9 @@ void * flp_displayer_thread(void *vp_displayer) |
273 | 269 |
++delta.tv_sec; |
274 | 270 |
} |
275 | 271 |
/* check if late enough for timed send */ |
276 |
- timed_send = delta.tv_sec > FLP_MMFI_MS_S |
|
277 |
- || (delta.tv_sec == FLP_MMFI_MS_S |
|
278 |
- && delta.tv_usec >= FLP_MMFI_MS_US); |
|
272 |
+ timed_send = delta.tv_sec > interval_ms / 1000 |
|
273 |
+ || (delta.tv_sec == interval_ms / 1000 |
|
274 |
+ && delta.tv_usec >= (interval_ms % 1000) * 1000); |
|
279 | 275 |
|
280 | 276 |
/* send if send requested or late enough */ |
281 | 277 |
if (p_displayer->send || timed_send) { |
... | ... |
@@ -285,13 +281,8 @@ void * flp_displayer_thread(void *vp_displayer) |
285 | 281 |
} |
286 | 282 |
|
287 | 283 |
/* sleep until next frame has to be sent */ |
288 |
- until.tv_sec = last.tv_sec + FLP_MMFI_MS_S; |
|
289 |
- until.tv_nsec = last.tv_usec * 1000 + FLP_MMFI_MS_NS; |
|
290 |
- if (until.tv_nsec > 1000000000) { |
|
291 |
- until.tv_nsec -= 1000000000; |
|
292 |
- until.tv_sec++; |
|
293 |
- } |
|
294 |
- pthread_cond_timedwait(&p_displayer->cond, &p_displayer->mtx, &until); |
|
284 |
+ flp_thread_cond_timedwait(&p_displayer->cond, &p_displayer->mtx, |
|
285 |
+ &last, interval_ms); |
|
295 | 286 |
|
296 | 287 |
} /* if (p_displayer->active) */ |
297 | 288 |
|
... | ... |
@@ -299,14 +290,14 @@ void * flp_displayer_thread(void *vp_displayer) |
299 | 290 |
else { |
300 | 291 |
|
301 | 292 |
/* sleep */ |
302 |
- pthread_cond_wait(&p_displayer->cond, &p_displayer->mtx); |
|
293 |
+ flp_thread_cond_wait(&p_displayer->cond, &p_displayer->mtx); |
|
303 | 294 |
|
304 | 295 |
} /* if (p_displayer->active) ... else */ |
305 | 296 |
|
306 | 297 |
} /* while(!p_displayer->end) */ |
307 | 298 |
|
308 |
- pthread_mutex_unlock(&p_displayer->mtx); |
|
299 |
+ flp_thread_mutex_unlock(&p_displayer->mtx); |
|
309 | 300 |
|
310 |
- return NULL; |
|
301 |
+ FLP_THREAD_RETURN(NULL); |
|
311 | 302 |
} |
312 | 303 |
|