PageRenderTime 55ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/ZirkoniumLicht/ZKMRLOSCController.mm

https://gitlab.com/BGCX261/zirkonium-git
Objective C++ | 457 lines | 196 code | 60 blank | 201 comment | 42 complexity | 252bd065d71fed3ea38719b900791b0e MD5 | raw file
  1. //
  2. // ZKMRLOSCController.m
  3. // ZirkoniumLicht
  4. //
  5. // Created by Chandrasekhar Ramakrishnan on 23.07.07.
  6. // Copyright 2007 C. Ramakrishnan/ZKM. All rights reserved.
  7. //
  8. #import "ZKMRLOSCController.h"
  9. #import "ZKMRLZirkoniumLightSystem.h"
  10. /*
  11. #include "OscReceivedElements.h"
  12. #include "OscPacketListener.h"
  13. #include "IpEndpointName.h"
  14. #include <netinet/in.h>
  15. static void ZKMRLOSCSocketCallback(CFSocketRef s, CFSocketCallBackType callbackType, CFDataRef address, const void *data, void *info)
  16. {
  17. ZKMRLOSCController* oscController = (ZKMRLOSCController *) info;
  18. [oscController processPacketAddress: address data: (CFDataRef) data];
  19. }
  20. class ZKMRLOSCListener : public osc::OscPacketListener {
  21. public:
  22. ZKMRLOSCListener(ZKMRLOSCController* controller) : OscPacketListener(), mController(controller) { }
  23. protected:
  24. // Internal Functions
  25. virtual void ProcessMessage( const osc::ReceivedMessage& m, const IpEndpointName& remoteEndpoint )
  26. {
  27. try {
  28. // example of parsing single messages. osc::OsckPacketListener
  29. // handles the bundle traversal.
  30. osc::ReceivedMessage::const_iterator arg = m.ArgumentsBegin();
  31. osc::ReceivedMessage::const_iterator end = m.ArgumentsEnd();
  32. // arguments: id az zn aspan zspan (optional: r g b) -- if not provided, rgb stays the same.
  33. // rgb may be float (0 - 1) or int (0 - 255)
  34. if (0 == strcmp(m.AddressPattern(), "/lpan/az")) PanAz(arg, end);
  35. if (0 == strcmp(m.AddressPattern(), "/lpan/xy")) PanXy(arg, end);
  36. // look for an exact match on the command name first
  37. if (0 == strcmp(m.AddressPattern(), "/lpan/lamp/az")) PanLampAz(arg, end);
  38. if (0 == strcmp(m.AddressPattern(), "/lpan/lamp/xy")) PanLampXy(arg, end);
  39. // arguments: number of ids (int)
  40. if (0 == strcmp(m.AddressPattern(), "/lconfig/numberOfIds")) SetNumberOfIds(arg, end);
  41. // arguments: id r g b
  42. if (0 == strcmp(m.AddressPattern(), "/lconfig/color")) SetColor(arg, end);
  43. } catch(osc::Exception& e) {
  44. // any parsing errors such as unexpected argument types, or
  45. // missing arguments get thrown as exceptions.
  46. ZKMORLogError(kZKMORLogSource_GUI, CFSTR("Could not parse OSC %s:%s"), m.AddressPattern(), e.what());
  47. }
  48. }
  49. int ReadOSCInt(osc::ReceivedMessage::const_iterator arg, osc::ReceivedMessage::const_iterator end, const char* name, int defaultValue)
  50. {
  51. int value = defaultValue;
  52. if (end == arg) return value;
  53. if (arg->IsInt32()) value = arg->AsInt32();
  54. else if (arg->IsFloat()) value = (int) arg->AsFloat();
  55. else ZKMORLogDebug(CFSTR("%s not sent as number -- default to %i"), name, value);
  56. return value;
  57. }
  58. float ReadOSCFloat(osc::ReceivedMessage::const_iterator arg, osc::ReceivedMessage::const_iterator end, const char* name, float defaultValue)
  59. {
  60. float value = defaultValue;
  61. if (end == arg) return value;
  62. if (arg->IsFloat()) value = arg->AsFloat();
  63. else if (arg->IsInt32()) value = (float) arg->AsInt32();
  64. else ZKMORLogDebug(CFSTR("%s not sent as number -- default to %.2f"), name, value);
  65. return value;
  66. }
  67. const char* ReadOSCString(osc::ReceivedMessage::const_iterator arg, osc::ReceivedMessage::const_iterator end, const char* name, const char* defaultValue)
  68. {
  69. const char* value = defaultValue;
  70. if (end == arg) return value;
  71. if (arg->IsString()) value = arg->AsString();
  72. else ZKMORLogDebug(CFSTR("%s not sent as string -- default to %s"), name, value);
  73. return value;
  74. }
  75. NSColor* ReadColor(osc::ReceivedMessage::const_iterator arg, osc::ReceivedMessage::const_iterator end)
  76. {
  77. if (arg == end) return nil;
  78. float r = 0.f, g = 0.f, b = 0.f;
  79. if (arg->IsFloat()) r = (arg++)->AsFloat();
  80. else if (arg->IsInt32()) r = (float) ((arg++)->AsInt32()) / 255.f;
  81. if (arg->IsFloat()) g = (arg++)->AsFloat();
  82. else if (arg->IsInt32()) g = (float) ((arg++)->AsInt32()) / 255.f;
  83. if (arg->IsFloat()) b = (arg++)->AsFloat();
  84. else if (arg->IsInt32()) b = (float) ((arg++)->AsInt32()) / 255.f;
  85. return [NSColor colorWithCalibratedRed: r green: g blue: b alpha: 1.];
  86. }
  87. void PanAz(osc::ReceivedMessage::const_iterator& arg, osc::ReceivedMessage::const_iterator end)
  88. {
  89. int lightId;
  90. ZKMNRSphericalCoordinate center;
  91. ZKMNRSphericalCoordinateSpan span;
  92. lightId = ReadOSCInt(arg++, end, "Id", 0);
  93. center.azimuth = ReadOSCFloat(arg++, end, "Azimuth", 0.f);
  94. center.zenith = ReadOSCFloat(arg++, end, "Zenith", 0.f);
  95. center.radius = 1.f;
  96. span.azimuthSpan = ReadOSCFloat(arg++, end, "Azimuth span", 0.f);
  97. span.zenithSpan = ReadOSCFloat(arg++, end, "Zenith span", 0.f);
  98. if (span.azimuthSpan < 0.f) span.azimuthSpan = 0.f;
  99. if (span.azimuthSpan > 2.f) span.azimuthSpan = 2.f;
  100. if (span.zenithSpan < 0.f) span.zenithSpan = 0.f;
  101. if (span.zenithSpan > 0.5f) span.zenithSpan = 0.5f;
  102. NSColor* color = ReadColor(arg, end);
  103. [mController->_system panId: lightId az: center span: span color: color];
  104. }
  105. void PanXy(osc::ReceivedMessage::const_iterator& arg, osc::ReceivedMessage::const_iterator end)
  106. {
  107. int lightId;
  108. ZKMNRRectangularCoordinate center;
  109. ZKMNRRectangularCoordinateSpan span;
  110. lightId = ReadOSCInt(arg++, end, "Id", 0);
  111. center.x = ReadOSCFloat(arg++, end, "X", 0.f);
  112. center.y = ReadOSCFloat(arg++, end, "Y", 0.f);
  113. center.z = 0.f;
  114. span.xSpan = ReadOSCFloat(arg++, end, "X span", 0.f);
  115. span.ySpan = ReadOSCFloat(arg++, end, "Y span", 0.f);
  116. span.zSpan = 0.f;
  117. if (span.xSpan < 0.f) span.xSpan = 0.f;
  118. if (span.xSpan > 2.f) span.xSpan = 2.f;
  119. if (span.ySpan < 0.f) span.ySpan = 0.f;
  120. if (span.ySpan > 2.f) span.ySpan = 2.f;
  121. NSColor* color = ReadColor(arg, end);
  122. [mController->_system panId: lightId xy: center span: span color: color];
  123. }
  124. void PanLampAz(osc::ReceivedMessage::const_iterator& arg, osc::ReceivedMessage::const_iterator end)
  125. {
  126. int lightId;
  127. ZKMNRSphericalCoordinate center;
  128. lightId = ReadOSCInt(arg++, end, "Id", 0);
  129. center.azimuth = ReadOSCFloat(arg++, end, "Azimuth", 0.f);
  130. center.zenith = ReadOSCFloat(arg++, end, "Zenith", 0.f);
  131. center.radius = 1.f;
  132. NSColor* color = ReadColor(arg, end);
  133. [mController->_system panId: lightId lampAz: center color: color];
  134. }
  135. void PanLampXy(osc::ReceivedMessage::const_iterator& arg, osc::ReceivedMessage::const_iterator end)
  136. {
  137. int lightId;
  138. ZKMNRRectangularCoordinate center;
  139. lightId = ReadOSCInt(arg++, end, "Id", 0);
  140. center.x = ReadOSCFloat(arg++, end, "X", 0.f);
  141. center.y = ReadOSCFloat(arg++, end, "Y", 0.f);
  142. center.z = 0.f;
  143. NSColor* color = ReadColor(arg, end);
  144. [mController->_system panId: lightId lampXy: center color: color];
  145. }
  146. void SetNumberOfIds(osc::ReceivedMessage::const_iterator& arg, osc::ReceivedMessage::const_iterator end)
  147. {
  148. int numberOfIds;
  149. numberOfIds = ReadOSCInt(arg++, end, "Number of Ids", 0);
  150. [mController->_system setNumberOfLightIds: numberOfIds];
  151. }
  152. void SetColor(osc::ReceivedMessage::const_iterator& arg, osc::ReceivedMessage::const_iterator end)
  153. {
  154. int lightId;
  155. lightId = ReadOSCInt(arg++, end, "Id", 0);
  156. NSColor* color = ReadColor(arg, end);
  157. [mController->_system setColor: color forId: lightId];
  158. }
  159. // State
  160. ZKMRLOSCController* mController;
  161. };
  162. */
  163. @interface ZKMRLOSCController (ZKMRLOSCControllerPrivate)
  164. -(void)panAz:(OSCMessage *)m;
  165. -(void)panXy:(OSCMessage *)m;
  166. -(void)panLampAz:(OSCMessage *)m;
  167. -(void)panLampXy:(OSCMessage *)m;
  168. -(void)setNumberOfIds:(OSCMessage *)m;
  169. -(void)setColor:(OSCMessage *)m;
  170. -(NSColor*)colorFromOSCRed:(OSCValue*)red green:(OSCValue*)green blue:(OSCValue*)blue;
  171. @end
  172. @implementation ZKMRLOSCController
  173. - (void)dealloc
  174. {
  175. _system = nil;
  176. [self destroyOSC];
  177. [super dealloc];
  178. }
  179. - (id)init
  180. {
  181. if (!(self = [super init])) return nil;
  182. _system = [ZKMRLZirkoniumLightSystem sharedZirkoniumLightSystem];
  183. [self createOSC];
  184. return self;
  185. }
  186. #pragma mark -
  187. #pragma mark OSC Manager
  188. #pragma mark -
  189. -(void)destroyOSC
  190. {
  191. if(_oscManager) {
  192. [_oscManager setDelegate:nil];
  193. [_oscManager deleteAllInputs];
  194. [_oscManager deleteAllOutputs];
  195. [_oscManager release];
  196. _oscManager = nil;
  197. }
  198. if(_inPort)
  199. [_inPort release];
  200. }
  201. -(void)createOSC
  202. {
  203. [self destroyOSC];
  204. _oscManager = [[OSCManager alloc] init];
  205. [_oscManager setDelegate:self];
  206. _inPort = [_oscManager createNewInputForPort:50808];
  207. if(_inPort==nil)
  208. NSLog(@"Error: OSC Input Port could not be created.");
  209. [_inPort retain];
  210. }
  211. #pragma mark -
  212. #pragma mark Receive
  213. #pragma mark -
  214. // Callback for received Messages ...
  215. - (void) receivedOSCMessage:(OSCMessage *)m
  216. {
  217. NSString* address = [m address];
  218. // arguments: id az zn aspan zspan (optional: r g b) -- if not provided, rgb stays the same.
  219. // rgb may be float (0 - 1) or int (0 - 255)
  220. if([address isEqualToString:@"/lpan/az"]) {
  221. [self panAz:m];
  222. } else if([address isEqualToString:@"/lpan/xy"]) {
  223. [self panXy:m];
  224. } else if([address isEqualToString:@"/lpan/lamp/az"]) {
  225. [self panLampAz:m];
  226. } else if([address isEqualToString:@"/lpan/lamp/xy"]) {
  227. [self panLampXy:m];
  228. } else if([address isEqualToString:@"/lconfig/numberOfIds"]) {
  229. // arguments: number of ids (int)
  230. [self setNumberOfIds:m];
  231. } else if([address isEqualToString:@"/lconfig/color"]) {
  232. // arguments: id r g b
  233. [self setColor:m];
  234. }
  235. }
  236. #pragma mark -
  237. #pragma mark Processing
  238. #pragma mark -
  239. -(void)panAz:(OSCMessage *)m
  240. {
  241. int lightId;
  242. ZKMNRSphericalCoordinate center;
  243. ZKMNRSphericalCoordinateSpan span;
  244. lightId = [[m valueAtIndex:0] intValue];
  245. center.azimuth = [[m valueAtIndex:1] floatValue];
  246. center.zenith = [[m valueAtIndex:2] floatValue];
  247. center.radius = 1.f;
  248. span.azimuthSpan = [[m valueAtIndex:3] floatValue];
  249. span.zenithSpan = [[m valueAtIndex:4] floatValue];
  250. if (span.azimuthSpan < 0.f) span.azimuthSpan = 0.f;
  251. if (span.azimuthSpan > 2.f) span.azimuthSpan = 2.f;
  252. if (span.zenithSpan < 0.f) span.zenithSpan = 0.f;
  253. if (span.zenithSpan > 0.5f) span.zenithSpan = 0.5f;
  254. NSColor* color = nil;
  255. if([m valueCount] > 5) {
  256. OSCValue* red = [m valueAtIndex:5];
  257. OSCValue* green = [m valueAtIndex:6];
  258. OSCValue* blue = [m valueAtIndex:7];
  259. color = [self colorFromOSCRed:red green:green blue:blue];
  260. }
  261. [_system panId: lightId az: center span: span color: color];
  262. }
  263. -(void)panXy:(OSCMessage *)m
  264. {
  265. int lightId;
  266. ZKMNRRectangularCoordinate center;
  267. ZKMNRRectangularCoordinateSpan span;
  268. lightId = [[m valueAtIndex:0] intValue];
  269. center.x = [[m valueAtIndex:1] floatValue];
  270. center.y = [[m valueAtIndex:2] floatValue];
  271. center.z = 0.f;
  272. span.xSpan = [[m valueAtIndex:3] floatValue];
  273. span.ySpan = [[m valueAtIndex:4] floatValue];
  274. span.zSpan = 0.f;
  275. if (span.xSpan < 0.f) span.xSpan = 0.f;
  276. if (span.xSpan > 2.f) span.xSpan = 2.f;
  277. if (span.ySpan < 0.f) span.ySpan = 0.f;
  278. if (span.ySpan > 2.f) span.ySpan = 2.f;
  279. NSColor* color = nil;
  280. if([m valueCount] > 5) {
  281. OSCValue* red = [m valueAtIndex:5];
  282. OSCValue* green = [m valueAtIndex:6];
  283. OSCValue* blue = [m valueAtIndex:7];
  284. color = [self colorFromOSCRed:red green:green blue:blue];
  285. }
  286. [_system panId: lightId xy: center span: span color: color];
  287. }
  288. -(void)panLampAz:(OSCMessage *)m
  289. {
  290. int lightId;
  291. ZKMNRSphericalCoordinate center;
  292. lightId = [[m valueAtIndex:0] intValue];
  293. center.azimuth = [[m valueAtIndex:1] floatValue];
  294. center.zenith = [[m valueAtIndex:2] floatValue];
  295. center.radius = 1.f;
  296. NSColor* color = nil;
  297. if([m valueCount] > 3) {
  298. OSCValue* red = [m valueAtIndex:3];
  299. OSCValue* green = [m valueAtIndex:4];
  300. OSCValue* blue = [m valueAtIndex:5];
  301. color = [self colorFromOSCRed:red green:green blue:blue];
  302. }
  303. [_system panId: lightId lampAz: center color: color];
  304. }
  305. -(void)panLampXy:(OSCMessage *)m
  306. {
  307. int lightId;
  308. ZKMNRRectangularCoordinate center;
  309. lightId = [[m valueAtIndex:0] intValue];
  310. center.x = [[m valueAtIndex:1] floatValue];
  311. center.y = [[m valueAtIndex:2] floatValue];
  312. center.z = 0.f;
  313. NSColor* color = nil;
  314. if([m valueCount] > 3) {
  315. OSCValue* red = [m valueAtIndex:3];
  316. OSCValue* green = [m valueAtIndex:4];
  317. OSCValue* blue = [m valueAtIndex:5];
  318. color = [self colorFromOSCRed:red green:green blue:blue];
  319. }
  320. [_system panId: lightId lampXy: center color: color];
  321. }
  322. -(void)setNumberOfIds:(OSCMessage *)m
  323. {
  324. int numberOfIds;
  325. numberOfIds = [[m valueAtIndex:0] intValue];
  326. [_system setNumberOfLightIds: numberOfIds];
  327. }
  328. -(void)setColor:(OSCMessage *)m
  329. {
  330. int lightId;
  331. lightId = [[m valueAtIndex:0] intValue];
  332. OSCValue* red = [m valueAtIndex:1];
  333. OSCValue* green = [m valueAtIndex:2];
  334. OSCValue* blue = [m valueAtIndex:3];
  335. NSColor* color = [self colorFromOSCRed:red green:green blue:blue];
  336. [_system setColor: color forId: lightId];
  337. }
  338. #pragma mark -
  339. #pragma mark Helper
  340. #pragma mark -
  341. -(NSColor*)colorFromOSCRed:(OSCValue*)red green:(OSCValue*)green blue:(OSCValue*)blue
  342. {
  343. float r, g, b;
  344. if([red type] == OSCValFloat)
  345. r = [red floatValue];
  346. else if ([red type] == OSCValInt)
  347. r = [red intValue] / 255.f;
  348. if([green type] == OSCValFloat)
  349. g = [green floatValue];
  350. else if ([green type] == OSCValInt)
  351. g = [green intValue] / 255.f;
  352. if([blue type] == OSCValFloat)
  353. b = [blue floatValue];
  354. else if ([blue type] == OSCValInt)
  355. b = [blue intValue] / 255.f;
  356. r = MAX(0.0, MIN(1.0, r));
  357. g = MAX(0.0, MIN(1.0, g));
  358. b = MAX(0.0, MIN(1.0, b));
  359. return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:1.0];
  360. }
  361. @end