v1.1.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Groups Pages
cube.h
1 /* -*- mode: C; c-basic-offset: 4; intent-tabs-mode: nil -*-
2  *
3  * This file is part of the public interface to the Sifteo SDK.
4  * Copyright <c> 2012 Sifteo, Inc. All rights reserved.
5  */
6 
7 #pragma once
8 #ifdef NOT_USERSPACE
9 # error This is a userspace-only header, not allowed by the current build.
10 #endif
11 
12 #include <sifteo/limits.h>
13 #include <sifteo/macros.h>
14 #include <sifteo/math.h>
15 #include <sifteo/array.h>
16 
17 namespace Sifteo {
18 
35 enum Side {
36  TOP = 0,
37  LEFT,
41  NO_SIDE = -1
42 };
43 
51 typedef _SYSCubeID PCubeID;
52 
66 struct CubeID {
67  _SYSCubeID sys;
68 
70  static const _SYSCubeID NUM_SLOTS = _SYS_NUM_CUBE_SLOTS;
71 
73  static const _SYSCubeID UNDEFINED = _SYS_CUBE_ID_INVALID;
74 
80  CubeID() : sys(UNDEFINED) {}
81 
86  CubeID(_SYSCubeID sys) : sys(sys) {}
87 
91  operator _SYSCubeID() const {
92  return sys;
93  }
94 
102  _SYSCubeIDVector bit() const {
103  return 0x80000000 >> sys;
104  }
105 
110  bool isDefined() const {
111  return sys != UNDEFINED;
112  }
113 
125  Byte3 accel() const {
126  ASSERT(sys < NUM_SLOTS);
127  _SYSByte4 v;
128  v.value = _SYS_getAccel(*this);
129  return vec(v.x, v.y, v.z);
130  }
131 
136  bool isTouching() const {
137  ASSERT(sys < NUM_SLOTS);
138  return _SYS_isTouching(*this);
139  }
140 
149  uint64_t hwID() const {
150  ASSERT(sys < NUM_SLOTS);
151  return _SYS_getCubeHWID(*this);
152  }
153 
162  void detachVideoBuffer() const {
163  ASSERT(sys < NUM_SLOTS);
164  _SYS_finish();
165  _SYS_setVideoBuffer(*this, 0);
166  }
167 
175  void detachMotionBuffer() const {
176  ASSERT(sys < NUM_SLOTS);
177  _SYS_setMotionBuffer(*this, 0);
178  }
179 
194  float batteryLevel() const {
195  ASSERT(sys < NUM_SLOTS);
196  return _SYS_cubeBatteryLevel(*this) / float(_SYS_BATTERY_MAX);
197  }
198 
204  void unpair() const {
205  ASSERT(sys < NUM_SLOTS);
206  _SYS_unpair(*this);
207  }
208 
209  CubeID operator ++() { return ++sys; }
210  CubeID operator ++(int) { return sys++; }
211  CubeID operator --() { return --sys; }
212  CubeID operator --(int) { return sys--; }
213 };
214 
215 
223 class CubeSet : public BitArray<_SYS_NUM_CUBE_SLOTS> {
224 public:
226  operator _SYSCubeIDVector() const {
227  return words[0];
228  }
229 
231  CubeSet(const BitArray<_SYS_NUM_CUBE_SLOTS> &bits) : BitArray<_SYS_NUM_CUBE_SLOTS>(bits) {}
232 
234  explicit CubeSet() : BitArray<_SYS_NUM_CUBE_SLOTS>() {}
235 
237  explicit CubeSet(CubeID cube) : BitArray<_SYS_NUM_CUBE_SLOTS>(cube) {}
238 
244  explicit CubeSet(CubeID begin, CubeID end) : BitArray<_SYS_NUM_CUBE_SLOTS>(begin, end) {}
245 
251  uint32_t mask() const {
252  return words[0];
253  }
254 
261  void setMask(uint32_t mask) {
262  ASSERT( (mask & ((1<<(32-CUBE_ALLOCATION))-1)) == 0 );
263  words[0] = mask;
264  }
265 
279  static CubeSet connected() {
280  CubeSet result;
281  result.words[0] = _SYS_getConnectedCubes();
282  return result;
283  }
284 };
285 
286 
295 struct NeighborID {
296  _SYSNeighborID sys;
297 
301  NeighborID() : sys(_SYS_NEIGHBOR_NONE) {}
302 
306  NeighborID(_SYSNeighborID sys) : sys(sys) {}
307 
311  operator _SYSNeighborID() const {
312  return sys;
313  }
314 
316  bool isCube() const {
317  return sys < _SYS_NUM_CUBE_SLOTS;
318  }
319 
321  bool isBase() const {
322  return (sys & _SYS_NEIGHBOR_TYPE_MASK) == _SYS_NEIGHBOR_BASE;
323  }
324 
326  bool isEmpty() const {
327  return sys == _SYS_NEIGHBOR_NONE;
328  }
329 
335  CubeID cube() const {
336  return isCube() ? CubeID(sys) : CubeID();
337  }
338 };
339 
340 
349 struct Neighborhood {
350  _SYSNeighborState sys;
351 
356 
360  Neighborhood(_SYSNeighborState sys) : sys(sys) {}
361 
366  operator _SYSNeighborState& () {
367  return sys;
368  }
369 
378  ASSERT(cube < cube.NUM_SLOTS);
379  sys.value = _SYS_getNeighbors(cube);
380  }
381 
385  NeighborID neighborAt(Side side) const {
386  ASSERT(side >= 0 && side < NUM_SIDES);
387  return sys.sides[side];
388  }
389 
396  CubeID cubeAt(Side side) const {
397  return neighborAt(side).cube();
398  }
399 
404  bool hasNeighborAt(Side side) const {
405  return !neighborAt(side).isEmpty();
406  }
407 
412  bool hasCubeAt(Side side) const {
413  return neighborAt(side).isCube();
414  }
415 
423  Side sideOf(CubeID cube) const {
424  for (Side side = (Side)0; side < NUM_SIDES; ++side)
425  if (sys.sides[side] == cube)
426  return side;
427  return NO_SIDE;
428  }
429 };
430 
435 }; // namespace Sifteo