uca-kiro-camera.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. /* Copyright (C) 2011, 2012 Matthias Vogelgesang <matthias.vogelgesang@kit.edu>
  2. (Karlsruhe Institute of Technology)
  3. This library is free software; you can redistribute it and/or modify it
  4. under the terms of the GNU Lesser General Public License as published by the
  5. Free Software Foundation; either version 2.1 of the License, or (at your
  6. option) any later version.
  7. This library is distributed in the hope that it will be useful, but WITHOUT
  8. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  10. details.
  11. You should have received a copy of the GNU Lesser General Public License along
  12. with this library; if not, write to the Free Software Foundation, Inc., 51
  13. Franklin St, Fifth Floor, Boston, MA 02110, USA */
  14. #ifndef __UCA_KIRO_CAMERA_H
  15. #define __UCA_KIRO_CAMERA_H
  16. #include <glib-object.h>
  17. #include "uca/uca-camera.h"
  18. #include "kiro/kiro-messenger.h"
  19. G_BEGIN_DECLS
  20. #define UCA_TYPE_KIRO_CAMERA (uca_kiro_camera_get_type())
  21. #define UCA_KIRO_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), UCA_TYPE_KIRO_CAMERA, UcaKiroCamera))
  22. #define UCA_IS_KIRO_CAMERA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), UCA_TYPE_KIRO_CAMERA))
  23. #define UCA_KIRO_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), UCA_TYPE_KIRO_CAMERA, UcaKiroCameraClass))
  24. #define UCA_IS_KIRO_CAMERA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), UCA_TYPE_KIRO_CAMERA))
  25. #define UCA_KIRO_CAMERA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), UCA_TYPE_KIRO_CAMERA, UcaKiroCameraClass))
  26. #define UCA_KIRO_CAMERA_ERROR uca_kiro_camera_error_quark()
  27. GQuark uca_kiro_camera_error_quark(void);
  28. typedef enum {
  29. UCA_KIRO_CAMERA_ERROR_MISSING_ADDRESS = UCA_CAMERA_ERROR_END_OF_STREAM,
  30. UCA_KIRO_CAMERA_ERROR_ADDRESS_WRONG_FORMAT,
  31. UCA_KIRO_CAMERA_ERROR_KIRO_CONNECTION_FAILED
  32. } UcaKiroCameraError;
  33. typedef struct _UcaKiroCamera UcaKiroCamera;
  34. typedef struct _UcaKiroCameraClass UcaKiroCameraClass;
  35. typedef struct _UcaKiroCameraPrivate UcaKiroCameraPrivate;
  36. /**
  37. * UcaKiroCamera:
  38. *
  39. * Creates #UcaKiroCamera instances by loading corresponding shared objects. The
  40. * contents of the #UcaKiroCamera structure are private and should only be
  41. * accessed via the provided API.
  42. */
  43. struct _UcaKiroCamera {
  44. /*< private >*/
  45. UcaCamera parent;
  46. UcaKiroCameraPrivate *priv;
  47. };
  48. /**
  49. * UcaKiroCameraClass:
  50. *
  51. * #UcaKiroCamera class
  52. */
  53. struct _UcaKiroCameraClass {
  54. /*< private >*/
  55. UcaCameraClass parent;
  56. };
  57. G_END_DECLS
  58. //HELPER FUNCTIONS AND CONSTRUCTS FOR SERVER AND CAMERA PLUGIN
  59. typedef enum {
  60. KIROCS_UPDATE,
  61. KIROCS_FETCH,
  62. KIROCS_INSTALL,
  63. KIROCS_READY,
  64. KIROCS_RPC,
  65. KIROCS_EXIT
  66. } KiroCsCommands;
  67. typedef enum {
  68. KIROCS_RPC_START_RECORDING,
  69. KIROCS_RPC_STOP_RECORDING,
  70. KIROCS_RPC_START_READOUT,
  71. KIROCS_RPC_STOP_READOUT,
  72. KIROCS_RPC_TRIGGER,
  73. KIROCS_RPC_GRAB,
  74. KIROCS_RPC_READOUT
  75. // KIROCS_RPC_WRITE is currently not supported
  76. } KiroCsRPC;
  77. typedef struct {
  78. guint32 id;
  79. guint32 size;
  80. gboolean scalar;
  81. } PropUpdate;
  82. typedef struct {
  83. PropUpdate base;
  84. guint64 prop_raw;
  85. } PropUpdateScalar;
  86. typedef struct {
  87. PropUpdate base;
  88. gchar str[1];
  89. } PropUpdateString;
  90. typedef struct {
  91. guint32 id;
  92. GType value_type;
  93. union PSpecs {
  94. GParamSpecBoolean bool_spec;
  95. GParamSpecChar char_spec;
  96. GParamSpecInt int_spec;
  97. GParamSpecUInt uint_spec;
  98. GParamSpecLong long_spec;
  99. GParamSpecULong ulong_spec;
  100. GParamSpecInt64 int64_spec;
  101. GParamSpecUInt64 uint64_spec;
  102. GParamSpecFloat float_spec;
  103. GParamSpecDouble double_spec;
  104. } spec;
  105. gchar name[1];
  106. } PropertyRequisition;
  107. //Forward declaration of the trigger enums for type handling
  108. GType uca_camera_trigger_source_get_type (void) G_GNUC_CONST;
  109. #define UCA_TYPE_CAMERA_TRIGGER_SOURCE (uca_camera_trigger_source_get_type ())
  110. GType uca_camera_trigger_type_get_type (void) G_GNUC_CONST;
  111. #define UCA_TYPE_CAMERA_TRIGGER_TYPE (uca_camera_trigger_type_get_type ())
  112. gchar
  113. gtype_to_gvariant_class (GType type)
  114. {
  115. gchar ret = '*';
  116. switch (type) {
  117. case G_TYPE_BOOLEAN:
  118. ret = G_VARIANT_CLASS_BOOLEAN;
  119. break;
  120. case G_TYPE_CHAR:
  121. ret = G_VARIANT_CLASS_BYTE;
  122. break;
  123. case G_TYPE_INT:
  124. ret = G_VARIANT_CLASS_INT32;
  125. break;
  126. case G_TYPE_ENUM:
  127. ret = G_VARIANT_CLASS_INT32;
  128. break;
  129. case G_TYPE_UINT:
  130. ret = G_VARIANT_CLASS_UINT32;
  131. break;
  132. case G_TYPE_LONG:
  133. ret = G_VARIANT_CLASS_INT64;
  134. break;
  135. case G_TYPE_ULONG:
  136. ret = G_VARIANT_CLASS_UINT64;
  137. break;
  138. case G_TYPE_INT64:
  139. ret = G_VARIANT_CLASS_INT64;
  140. break;
  141. case G_TYPE_UINT64:
  142. ret = G_VARIANT_CLASS_UINT64;
  143. break;
  144. case G_TYPE_FLOAT:
  145. ret = G_VARIANT_CLASS_DOUBLE;
  146. break;
  147. case G_TYPE_DOUBLE:
  148. ret = G_VARIANT_CLASS_DOUBLE;
  149. break;
  150. default:
  151. //ERROR
  152. break;
  153. }
  154. return ret;
  155. }
  156. #define GOBJECT_SET(OBJ, PROP, TYPE, DATA) { \
  157. g_object_set (OBJ, \
  158. PROP, *(TYPE *)DATA, \
  159. NULL); \
  160. }
  161. void
  162. update_property_scalar (GObject *cam, const gchar *prop, GType type, gulong handler, gpointer data)
  163. {
  164. g_debug ("Updating %s, with handler %lu", prop, handler);
  165. g_signal_handler_block (cam, handler);
  166. switch (type) {
  167. case G_TYPE_BOOLEAN:
  168. GOBJECT_SET (cam, prop, gboolean, data);
  169. break;
  170. case G_TYPE_CHAR:
  171. GOBJECT_SET (cam, prop, gchar, data);
  172. break;
  173. case G_TYPE_INT:
  174. GOBJECT_SET (cam, prop, gint, data);
  175. break;
  176. case G_TYPE_ENUM:
  177. GOBJECT_SET (cam, prop, gint, data);
  178. break;
  179. case G_TYPE_UINT:
  180. GOBJECT_SET (cam, prop, guint, data);
  181. break;
  182. case G_TYPE_LONG:
  183. GOBJECT_SET (cam, prop, glong, data);
  184. break;
  185. case G_TYPE_ULONG:
  186. GOBJECT_SET (cam, prop, gulong, data);
  187. break;
  188. case G_TYPE_INT64:
  189. GOBJECT_SET (cam, prop, gint64, data);
  190. break;
  191. case G_TYPE_UINT64:
  192. GOBJECT_SET (cam, prop, guint64, data);
  193. break;
  194. case G_TYPE_FLOAT:
  195. GOBJECT_SET (cam, prop, gfloat, data);
  196. break;
  197. case G_TYPE_DOUBLE:
  198. GOBJECT_SET (cam, prop, gdouble, data);
  199. break;
  200. default:
  201. //TRIGGER_TYPE and TRIGGER_SOURCE are not statically typed and can
  202. //not be used in a switch statement...
  203. if (type == UCA_TYPE_CAMERA_TRIGGER_SOURCE) {
  204. GOBJECT_SET (cam, prop, gint, data);
  205. break;
  206. }
  207. if (type == UCA_TYPE_CAMERA_TRIGGER_TYPE) {
  208. GOBJECT_SET (cam, prop, gint, data);
  209. break;
  210. }
  211. g_critical ("Type %s not handled! (SET)", g_type_name (type));
  212. break;
  213. }
  214. g_signal_handler_unblock (cam, handler);
  215. }
  216. #define GOBJECT_GET(OBJ, PROP, TYPE, GTYPE) { \
  217. TYPE tmp; \
  218. gchar *gvclass = g_malloc0 (2); \
  219. gvclass[0] = gtype_to_gvariant_class (GTYPE); \
  220. g_object_get (OBJ, \
  221. PROP, &tmp, \
  222. NULL); \
  223. ret = g_variant_new (gvclass, tmp); \
  224. g_free (gvclass); \
  225. }
  226. GVariant*
  227. read_property_scalar (GObject *cam, const gchar *prop, GType type)
  228. {
  229. GVariant *ret = NULL;
  230. switch (type) {
  231. case G_TYPE_BOOLEAN:
  232. GOBJECT_GET (cam, prop, gboolean, type);
  233. break;
  234. case G_TYPE_CHAR:
  235. GOBJECT_GET (cam, prop, gchar, type);
  236. break;
  237. case G_TYPE_INT:
  238. GOBJECT_GET (cam, prop, gint, type);
  239. break;
  240. case G_TYPE_ENUM:
  241. GOBJECT_GET (cam, prop, gint, type);
  242. break;
  243. case G_TYPE_UINT:
  244. GOBJECT_GET (cam, prop, guint, type);
  245. break;
  246. case G_TYPE_LONG:
  247. GOBJECT_GET (cam, prop, glong, type);
  248. break;
  249. case G_TYPE_ULONG:
  250. GOBJECT_GET (cam, prop, gulong, type);
  251. break;
  252. case G_TYPE_INT64:
  253. GOBJECT_GET (cam, prop, gint64, type);
  254. break;
  255. case G_TYPE_UINT64:
  256. GOBJECT_GET (cam, prop, guint64, type);
  257. break;
  258. case G_TYPE_FLOAT:
  259. GOBJECT_GET (cam, prop, gfloat, type);
  260. break;
  261. case G_TYPE_DOUBLE:
  262. GOBJECT_GET (cam, prop, gdouble, type);
  263. break;
  264. default:
  265. //TRIGGER_TYPE and TRIGGER_SOURCE are not statically typed and can
  266. //not be used in a switch statement...
  267. if (type == UCA_TYPE_CAMERA_TRIGGER_SOURCE) {
  268. GOBJECT_GET (cam, prop, gint, type);
  269. break;
  270. }
  271. if (type == UCA_TYPE_CAMERA_TRIGGER_TYPE) {
  272. GOBJECT_GET (cam, prop, gint, type);
  273. break;
  274. }
  275. g_critical ("Type %s not handled! (GET)", g_type_name (type));
  276. break;
  277. }
  278. return ret;
  279. }
  280. #define GVALUE_TO_GVARIANT(VALUE, FUNC, TYPE, GTYPE) { \
  281. TYPE tmp; \
  282. gchar *gvclass = g_malloc0 (2); \
  283. gvclass[0] = gtype_to_gvariant_class (GTYPE); \
  284. tmp = FUNC (VALUE); \
  285. ret = g_variant_new (gvclass, tmp); \
  286. g_free (gvclass); \
  287. }
  288. GVariant*
  289. variant_from_scalar (GValue *value)
  290. {
  291. GVariant *ret = NULL;
  292. GType type = G_VALUE_TYPE (value);
  293. switch (type) {
  294. case G_TYPE_BOOLEAN:
  295. GVALUE_TO_GVARIANT (value, g_value_get_boolean, gboolean, type);
  296. break;
  297. case G_TYPE_CHAR:
  298. GVALUE_TO_GVARIANT (value, g_value_get_char, gchar, type);
  299. break;
  300. case G_TYPE_INT:
  301. GVALUE_TO_GVARIANT (value, g_value_get_int, gint, type);
  302. break;
  303. case G_TYPE_ENUM:
  304. GVALUE_TO_GVARIANT (value, g_value_get_int, gint, type);
  305. break;
  306. case G_TYPE_UINT:
  307. GVALUE_TO_GVARIANT (value, g_value_get_uint, guint, type);
  308. break;
  309. case G_TYPE_LONG:
  310. GVALUE_TO_GVARIANT (value, g_value_get_long, glong, type);
  311. break;
  312. case G_TYPE_ULONG:
  313. GVALUE_TO_GVARIANT (value, g_value_get_ulong, gulong, type);
  314. break;
  315. case G_TYPE_INT64:
  316. GVALUE_TO_GVARIANT (value, g_value_get_int64, gint64, type);
  317. break;
  318. case G_TYPE_UINT64:
  319. GVALUE_TO_GVARIANT (value, g_value_get_uint64, guint64, type);
  320. break;
  321. case G_TYPE_FLOAT:
  322. GVALUE_TO_GVARIANT (value, g_value_get_float, gfloat, type);
  323. break;
  324. case G_TYPE_DOUBLE:
  325. GVALUE_TO_GVARIANT (value, g_value_get_double, gdouble, type);
  326. break;
  327. default:
  328. //TRIGGER_TYPE and TRIGGER_SOURCE are not statically typed and can
  329. //not be used in a switch statement...
  330. if (type == UCA_TYPE_CAMERA_TRIGGER_SOURCE) {
  331. GVALUE_TO_GVARIANT (value, g_value_get_int, gint, type);
  332. break;
  333. }
  334. if (type == UCA_TYPE_CAMERA_TRIGGER_TYPE) {
  335. GVALUE_TO_GVARIANT (value, g_value_get_int, gint, type);
  336. break;
  337. }
  338. g_critical ("Type %s not handled! (GET)", g_type_name (type));
  339. break;
  340. }
  341. return ret;
  342. }
  343. guint
  344. property_id_from_name(const gchar* name, guint n_props, GParamSpec **props)
  345. {
  346. guint idx = 0;
  347. gboolean found = FALSE;
  348. for (;idx < n_props; ++idx) {
  349. if (0 == g_strcmp0(name, props[idx]->name)) {
  350. found = TRUE;
  351. break;
  352. }
  353. }
  354. return found ? (idx + 1) : 0;
  355. }
  356. void
  357. g_value_write_to_raw_data (const GValue *value, gpointer raw)
  358. {
  359. GType type = G_VALUE_TYPE (value);
  360. switch (type) {
  361. case G_TYPE_BOOLEAN:
  362. *(gboolean *)raw = g_value_get_boolean (value);
  363. break;
  364. case G_TYPE_CHAR:
  365. *(gchar *)raw = g_value_get_char (value);
  366. break;
  367. case G_TYPE_INT:
  368. *(gint *)raw = g_value_get_int (value);
  369. break;
  370. case G_TYPE_ENUM:
  371. *(gint *)raw = g_value_get_enum (value);
  372. break;
  373. case G_TYPE_UINT:
  374. *(guint *)raw = g_value_get_uint (value);
  375. break;
  376. case G_TYPE_LONG:
  377. *(glong *)raw = g_value_get_long (value);
  378. break;
  379. case G_TYPE_ULONG:
  380. *(gulong *)raw = g_value_get_ulong (value);
  381. break;
  382. case G_TYPE_INT64:
  383. *(gint64 *)raw = g_value_get_int64 (value);
  384. break;
  385. case G_TYPE_UINT64:
  386. *(guint64 *)raw = g_value_get_uint64 (value);
  387. break;
  388. case G_TYPE_FLOAT:
  389. *(gfloat *)raw = g_value_get_float (value);
  390. break;
  391. case G_TYPE_DOUBLE:
  392. *(gdouble *)raw = g_value_get_double (value);
  393. break;
  394. default:
  395. //TRIGGER_TYPE and TRIGGER_SOURCE are not statically typed and can
  396. //not be used in a switch statement...
  397. if (type == UCA_TYPE_CAMERA_TRIGGER_SOURCE) {
  398. *(gint *)raw = g_value_get_int (value);
  399. break;
  400. }
  401. if (type == UCA_TYPE_CAMERA_TRIGGER_TYPE) {
  402. *(gint *)raw = g_value_get_int (value);
  403. break;
  404. }
  405. g_critical ("Type %s not handled! (GET)", g_type_name (type));
  406. break;
  407. }
  408. }
  409. void
  410. g_value_set_from_raw_data (GValue *value, gpointer raw)
  411. {
  412. GType type = G_VALUE_TYPE (value);
  413. switch (type) {
  414. case G_TYPE_BOOLEAN:
  415. g_value_set_boolean (value, *(gboolean *)raw);
  416. break;
  417. case G_TYPE_CHAR:
  418. g_value_set_char (value, *(gchar *)raw);
  419. break;
  420. case G_TYPE_INT:
  421. g_value_set_int (value, *(gint *)raw);
  422. break;
  423. case G_TYPE_ENUM:
  424. g_value_set_enum (value, *(gint *)raw);
  425. break;
  426. case G_TYPE_UINT:
  427. g_value_set_uint (value, *(guint *)raw);
  428. break;
  429. case G_TYPE_LONG:
  430. g_value_set_long (value, *(glong *)raw);
  431. break;
  432. case G_TYPE_ULONG:
  433. g_value_set_ulong (value, *(gulong *)raw);
  434. break;
  435. case G_TYPE_INT64:
  436. g_value_set_int64 (value, *(gint64 *)raw);
  437. break;
  438. case G_TYPE_UINT64:
  439. g_value_set_uint64 (value, *(guint64 *)raw);
  440. break;
  441. case G_TYPE_FLOAT:
  442. g_value_set_float (value, *(gfloat *)raw);
  443. break;
  444. case G_TYPE_DOUBLE:
  445. g_value_set_double (value, *(gdouble *)raw);
  446. break;
  447. default:
  448. //TRIGGER_TYPE and TRIGGER_SOURCE are not statically typed and can
  449. //not be used in a switch statement...
  450. if (type == UCA_TYPE_CAMERA_TRIGGER_SOURCE) {
  451. g_value_set_enum (value, *(gint *)raw);
  452. break;
  453. }
  454. if (type == UCA_TYPE_CAMERA_TRIGGER_TYPE) {
  455. g_value_set_enum (value, *(gint *)raw);
  456. break;
  457. }
  458. g_critical ("Type %s not handled! (SET)", g_type_name (type));
  459. break;
  460. }
  461. }
  462. #endif