kiro-camera-server.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #include "uca/uca-camera.h"
  2. #include "kiro/kiro-messenger.h"
  3. typedef enum {
  4. KIROCS_UPDATE,
  5. KIROCS_INSTALL,
  6. KIROCS_READY,
  7. KIROCS_RPC,
  8. KIROCS_EXIT
  9. }KiroCsCommands;
  10. typedef struct {
  11. guint32 id;
  12. guint32 size;
  13. gboolean scalar;
  14. gchar type[2];
  15. gchar val[1];
  16. } PropUpdate;
  17. typedef struct {
  18. guint32 str_len;
  19. gchar str[1];
  20. }StrProp;
  21. typedef struct {
  22. GType value_type;
  23. guint32 name_len;
  24. union PSpecs {
  25. GParamSpecBoolean bool_spec;
  26. GParamSpecChar char_spec;
  27. GParamSpecInt int_spec;
  28. GParamSpecUInt uint_spec;
  29. GParamSpecLong long_spec;
  30. GParamSpecULong ulong_spec;
  31. GParamSpecInt64 int64_spec;
  32. GParamSpecUInt64 uint64_spec;
  33. GParamSpecFloat float_spec;
  34. GParamSpecDouble double_spec;
  35. StrProp str_spec;
  36. } spec;
  37. gchar name[1];
  38. } PropertyRequisition;
  39. //Forward declaration of the trigger enums for type handling
  40. GType uca_camera_trigger_source_get_type (void) G_GNUC_CONST;
  41. #define UCA_TYPE_CAMERA_TRIGGER_SOURCE (uca_camera_trigger_source_get_type ())
  42. GType uca_camera_trigger_type_get_type (void) G_GNUC_CONST;
  43. #define UCA_TYPE_CAMERA_TRIGGER_TYPE (uca_camera_trigger_type_get_type ())
  44. gchar
  45. gtype_to_gvariant_class (GType type)
  46. {
  47. gchar ret = '*';
  48. switch (type) {
  49. case G_TYPE_BOOLEAN:
  50. ret = G_VARIANT_CLASS_BOOLEAN;
  51. break;
  52. case G_TYPE_CHAR:
  53. ret = G_VARIANT_CLASS_BYTE;
  54. break;
  55. case G_TYPE_INT:
  56. ret = G_VARIANT_CLASS_INT32;
  57. break;
  58. case G_TYPE_ENUM:
  59. ret = G_VARIANT_CLASS_INT32;
  60. break;
  61. case G_TYPE_UINT:
  62. ret = G_VARIANT_CLASS_UINT32;
  63. break;
  64. case G_TYPE_LONG:
  65. ret = G_VARIANT_CLASS_INT64;
  66. break;
  67. case G_TYPE_ULONG:
  68. ret = G_VARIANT_CLASS_UINT64;
  69. break;
  70. case G_TYPE_INT64:
  71. ret = G_VARIANT_CLASS_INT64;
  72. break;
  73. case G_TYPE_UINT64:
  74. ret = G_VARIANT_CLASS_UINT64;
  75. break;
  76. case G_TYPE_FLOAT:
  77. ret = G_VARIANT_CLASS_DOUBLE;
  78. break;
  79. case G_TYPE_DOUBLE:
  80. ret = G_VARIANT_CLASS_DOUBLE;
  81. break;
  82. default:
  83. //ERROR
  84. break;
  85. }
  86. return ret;
  87. }
  88. #define GOBJECT_SET(OBJ, PROP, TYPE, DATA) { \
  89. g_object_set (OBJ, \
  90. PROP, *(TYPE *)DATA, \
  91. NULL); \
  92. }
  93. void
  94. update_property_scalar (GObject *cam, const gchar *prop, GType type, gulong handler, gpointer data)
  95. {
  96. g_debug ("Updating %s, with handler %lu", prop, handler);
  97. g_signal_handler_block (cam, handler);
  98. switch (type) {
  99. case G_TYPE_BOOLEAN:
  100. GOBJECT_SET (cam, prop, gboolean, data);
  101. break;
  102. case G_TYPE_CHAR:
  103. GOBJECT_SET (cam, prop, gchar, data);
  104. break;
  105. case G_TYPE_INT:
  106. GOBJECT_SET (cam, prop, gint, data);
  107. break;
  108. case G_TYPE_ENUM:
  109. GOBJECT_SET (cam, prop, gint, data);
  110. break;
  111. case G_TYPE_UINT:
  112. GOBJECT_SET (cam, prop, guint, data);
  113. break;
  114. case G_TYPE_LONG:
  115. GOBJECT_SET (cam, prop, glong, data);
  116. break;
  117. case G_TYPE_ULONG:
  118. GOBJECT_SET (cam, prop, gulong, data);
  119. break;
  120. case G_TYPE_INT64:
  121. GOBJECT_SET (cam, prop, gint64, data);
  122. break;
  123. case G_TYPE_UINT64:
  124. GOBJECT_SET (cam, prop, guint64, data);
  125. break;
  126. case G_TYPE_FLOAT:
  127. GOBJECT_SET (cam, prop, gfloat, data);
  128. break;
  129. case G_TYPE_DOUBLE:
  130. GOBJECT_SET (cam, prop, gdouble, data);
  131. break;
  132. default:
  133. //TRIGGER_TYPE and TRIGGER_SOURCE are not statically typed and can
  134. //not be used in a switch statement...
  135. if (type == UCA_TYPE_CAMERA_TRIGGER_SOURCE) {
  136. GOBJECT_SET (cam, prop, gint, data);
  137. break;
  138. }
  139. if (type == UCA_TYPE_CAMERA_TRIGGER_TYPE) {
  140. GOBJECT_SET (cam, prop, gint, data);
  141. break;
  142. }
  143. g_critical ("Type %s not handled! (SET)", g_type_name (type));
  144. break;
  145. }
  146. g_signal_handler_unblock (cam, handler);
  147. }
  148. #define GOBJECT_GET(OBJ, PROP, TYPE, GTYPE) { \
  149. TYPE tmp; \
  150. gchar *gvclass = g_malloc0 (2); \
  151. gvclass[0] = gtype_to_gvariant_class (GTYPE); \
  152. g_object_get (OBJ, \
  153. PROP, &tmp, \
  154. NULL); \
  155. ret = g_variant_new (gvclass, tmp); \
  156. g_free (gvclass); \
  157. }
  158. GVariant*
  159. read_property_scalar (GObject *cam, const gchar *prop, GType type)
  160. {
  161. GVariant *ret = NULL;
  162. switch (type) {
  163. case G_TYPE_BOOLEAN:
  164. GOBJECT_GET (cam, prop, gboolean, type);
  165. break;
  166. case G_TYPE_CHAR:
  167. GOBJECT_GET (cam, prop, gchar, type);
  168. break;
  169. case G_TYPE_INT:
  170. GOBJECT_GET (cam, prop, gint, type);
  171. break;
  172. case G_TYPE_ENUM:
  173. GOBJECT_GET (cam, prop, gint, type);
  174. break;
  175. case G_TYPE_UINT:
  176. GOBJECT_GET (cam, prop, guint, type);
  177. break;
  178. case G_TYPE_LONG:
  179. GOBJECT_GET (cam, prop, glong, type);
  180. break;
  181. case G_TYPE_ULONG:
  182. GOBJECT_GET (cam, prop, gulong, type);
  183. break;
  184. case G_TYPE_INT64:
  185. GOBJECT_GET (cam, prop, gint64, type);
  186. break;
  187. case G_TYPE_UINT64:
  188. GOBJECT_GET (cam, prop, guint64, type);
  189. break;
  190. case G_TYPE_FLOAT:
  191. GOBJECT_GET (cam, prop, gfloat, type);
  192. break;
  193. case G_TYPE_DOUBLE:
  194. GOBJECT_GET (cam, prop, gdouble, type);
  195. break;
  196. default:
  197. //TRIGGER_TYPE and TRIGGER_SOURCE are not statically typed and can
  198. //not be used in a switch statement...
  199. if (type == UCA_TYPE_CAMERA_TRIGGER_SOURCE) {
  200. GOBJECT_GET (cam, prop, gint, type);
  201. break;
  202. }
  203. if (type == UCA_TYPE_CAMERA_TRIGGER_TYPE) {
  204. GOBJECT_GET (cam, prop, gint, type);
  205. break;
  206. }
  207. g_critical ("Type %s not handled! (GET)", g_type_name (type));
  208. break;
  209. }
  210. return ret;
  211. }