ws2812 0.0.4 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 33e056d181d674eb617983c076efe0a2fcb0d1f1
4
- data.tar.gz: 29c20024fe8447dce4aa087127f9cce4287327c6
3
+ metadata.gz: 7a2138c68a351d27224a3858e46fdba32ed1d880
4
+ data.tar.gz: 782eaa7080c172cb1070b8f082e63b61ab0a0f41
5
5
  SHA512:
6
- metadata.gz: 3bb434f734bfcf81cdfd04487eaa4e0e8f8f904632864834ebb045a1aca613dc2529f4372813f50597b4e2726f71756830806ba2701604bf6fdbe3b01e02855c
7
- data.tar.gz: 268aae00f8fb6fe46708691a738d1c1ea39dd5810dc67b38906d8930eb442eec9eb425b952cb67fd733f2d4ebebe0f166f0b030855704e795c53f2fc300bb28c
6
+ metadata.gz: f6b90b4d822e6c904ddd44a1505d06647cd3c65ffa90d2fdfc5aa335671efbe4b5e0207b72367841da454ebbba7fdc56eddf82d61dfa20a616ab4c89293fe396
7
+ data.tar.gz: 49c2fa315148cf9c1c933ef1c459fd6abc7a030f91e272a7e722a337ddba5a0df31fbbea6576f5cd451dee67693dc66c8049dae22f311e1bf6c55367f543c07b
data/Rakefile CHANGED
@@ -12,7 +12,7 @@ spec = Gem::Specification.new do |s|
12
12
  s.date = '2015-05-03'
13
13
  s.summary = 'Ruby wrapper around WS2812 LED driver for Raspberry Pi'
14
14
  s.description = 'Gem that encapsulates modified RPi ws281x library from UnicornHat to help drive your WS2812 led chain (or matrix) from RaspberryPi'
15
- s.authors = ['Michal Jirků', 'Pimoroni', 'Richard Hirst', 'Jeremy Garff', 'Philip Howard']
15
+ s.authors = ['Michal Jirků', 'Pimoroni', 'Richard Hirst', 'Jeremy Garff', 'Philip Howard', 'Daniel Hollands']
16
16
  s.email = 'box@wejn.org'
17
17
  s.files = `git ls-files -z`.split("\x0")
18
18
  s.homepage = 'https://github.com/wejn/ws2812'
data/examples/cat.rb ADDED
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Author: Daniel Hollands
4
+ # Source: https://gist.github.com/LimeBlast/74db06b0123fa70ba6d2
5
+ #
6
+ $:.unshift(File.expand_path('../../lib', __FILE__))
7
+ require 'ws2812'
8
+
9
+ def display(array, colours)
10
+ $hat.clear false
11
+ array.each_with_index do |row, x|
12
+ row.each_with_index do |value, y|
13
+ $hat[x, y] = colours[value]
14
+ end
15
+ end
16
+ $hat.show
17
+ end
18
+
19
+ # Init
20
+ $hat = Ws2812::UnicornHAT.new
21
+
22
+ $hat.rotation = 90
23
+ $hat.clear
24
+
25
+ # sourced from http://atariage.com/forums/topic/169238-free-sprites-for-the-taking/
26
+ cat = [
27
+ [
28
+ [0, 1, 1, 1, 0, 0, 0, 0], #1
29
+ [1, 0, 0, 0, 0, 0, 0, 0], #0
30
+ [0, 1, 1, 0, 0, 0, 1, 0], #2
31
+ [0, 0, 1, 1, 1, 0, 1, 1], #3
32
+ [0, 0, 1, 1, 1, 1, 1, 1], #4
33
+ [0, 1, 1, 1, 1, 1, 0, 0], #5
34
+ [1, 0, 1, 0, 1, 1, 1, 1], #6
35
+ [0, 0, 0, 1, 0, 0, 1, 0], #7
36
+ ].reverse,
37
+ [
38
+ [0, 0, 1, 1, 0, 0, 0, 0], #1
39
+ [0, 1, 0, 0, 1, 0, 0, 0], #0
40
+ [0, 1, 0, 0, 0, 0, 0, 0], #2
41
+ [0, 0, 1, 1, 1, 0, 1, 0], #3
42
+ [0, 0, 1, 1, 1, 1, 1, 1], #4
43
+ [0, 1, 1, 1, 1, 1, 1, 1], #5
44
+ [0, 1, 0, 1, 0, 1, 0, 0], #6
45
+ [0, 0, 1, 0, 1, 1, 0, 0], #7
46
+ ].reverse,
47
+ [
48
+ [0, 0, 0, 0, 0, 0, 0, 0], #1
49
+ [0, 1, 1, 0, 0, 0, 0, 0], #0
50
+ [1, 0, 0, 1, 0, 0, 1, 0], #2
51
+ [0, 1, 1, 1, 1, 0, 1, 1], #3
52
+ [0, 0, 1, 1, 1, 1, 1, 1], #4
53
+ [0, 0, 1, 1, 1, 1, 1, 0], #5
54
+ [0, 1, 1, 0, 1, 1, 0, 1], #6
55
+ [0, 1, 0, 0, 0, 0, 0, 0], #7
56
+ ].reverse,
57
+ [
58
+ [0, 0, 0, 1, 0, 0, 0, 0], #1
59
+ [0, 1, 1, 0, 0, 0, 1, 0], #0
60
+ [1, 0, 0, 1, 0, 0, 1, 1], #2
61
+ [0, 1, 1, 1, 1, 1, 1, 1], #3
62
+ [0, 0, 1, 1, 1, 1, 0, 0], #4
63
+ [0, 1, 1, 1, 1, 1, 1, 1], #5
64
+ [0, 1, 0, 1, 0, 1, 1, 0], #6
65
+ [1, 0, 0, 0, 0, 0, 0, 1], #7
66
+ ].reverse
67
+ ]
68
+
69
+ colours = [
70
+ Ws2812::Color.new(0, 0, 0),
71
+ Ws2812::Color.new(214, 135, 23)
72
+ ]
73
+
74
+ puts "Hit ^C to terminate"
75
+
76
+ begin
77
+ cat.cycle do |frame|
78
+ display frame, colours
79
+ sleep 0.1
80
+ end
81
+ rescue Interrupt
82
+ # ignored
83
+ end
84
+
85
+ $hat.clear
@@ -9,16 +9,3 @@ unless FileTest.exists?(File.dirname(__FILE__) + '/lowlevel_wrap.c')
9
9
  end
10
10
 
11
11
  create_makefile 'ws2812/lowlevel'
12
-
13
- File.open('Makefile', 'at') do |mk|
14
- mk.puts <<EOF
15
- clean: clean-rpilowlevel
16
- distclean: distclean-rpilowlevel
17
-
18
- clean-rpilowlevel:
19
- rm -f Makefile
20
-
21
- distclean-rpilowlevel:
22
- rm -f *_wrap.c
23
- EOF
24
- end
@@ -1,11 +1,11 @@
1
1
  /* ----------------------------------------------------------------------------
2
2
  * This file was automatically generated by SWIG (http://www.swig.org).
3
- * Version 2.0.12
4
- *
5
- * This file is not intended to be easily readable and contains a number of
3
+ * Version 2.0.7
4
+ *
5
+ * This file is not intended to be easily readable and contains a number of
6
6
  * coding conventions designed to improve portability and efficiency. Do not make
7
- * changes to this file unless you know what you are doing--modify the SWIG
8
- * interface file instead.
7
+ * changes to this file unless you know what you are doing--modify the SWIG
8
+ * interface file instead.
9
9
  * ----------------------------------------------------------------------------- */
10
10
 
11
11
  #define SWIGRUBY
@@ -41,28 +41,28 @@
41
41
  #ifndef SWIGUNUSED
42
42
  # if defined(__GNUC__)
43
43
  # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
44
- # define SWIGUNUSED __attribute__ ((__unused__))
44
+ # define SWIGUNUSED __attribute__ ((__unused__))
45
45
  # else
46
46
  # define SWIGUNUSED
47
47
  # endif
48
48
  # elif defined(__ICC)
49
- # define SWIGUNUSED __attribute__ ((__unused__))
49
+ # define SWIGUNUSED __attribute__ ((__unused__))
50
50
  # else
51
- # define SWIGUNUSED
51
+ # define SWIGUNUSED
52
52
  # endif
53
53
  #endif
54
54
 
55
55
  #ifndef SWIG_MSC_UNSUPPRESS_4505
56
56
  # if defined(_MSC_VER)
57
57
  # pragma warning(disable : 4505) /* unreferenced local function has been removed */
58
- # endif
58
+ # endif
59
59
  #endif
60
60
 
61
61
  #ifndef SWIGUNUSEDPARM
62
62
  # ifdef __cplusplus
63
63
  # define SWIGUNUSEDPARM(p)
64
64
  # else
65
- # define SWIGUNUSEDPARM(p) p SWIGUNUSED
65
+ # define SWIGUNUSEDPARM(p) p SWIGUNUSED
66
66
  # endif
67
67
  #endif
68
68
 
@@ -105,7 +105,7 @@
105
105
  # define SWIGSTDCALL __stdcall
106
106
  # else
107
107
  # define SWIGSTDCALL
108
- # endif
108
+ # endif
109
109
  #endif
110
110
 
111
111
  /* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -150,28 +150,28 @@
150
150
  #ifndef SWIGUNUSED
151
151
  # if defined(__GNUC__)
152
152
  # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
153
- # define SWIGUNUSED __attribute__ ((__unused__))
153
+ # define SWIGUNUSED __attribute__ ((__unused__))
154
154
  # else
155
155
  # define SWIGUNUSED
156
156
  # endif
157
157
  # elif defined(__ICC)
158
- # define SWIGUNUSED __attribute__ ((__unused__))
158
+ # define SWIGUNUSED __attribute__ ((__unused__))
159
159
  # else
160
- # define SWIGUNUSED
160
+ # define SWIGUNUSED
161
161
  # endif
162
162
  #endif
163
163
 
164
164
  #ifndef SWIG_MSC_UNSUPPRESS_4505
165
165
  # if defined(_MSC_VER)
166
166
  # pragma warning(disable : 4505) /* unreferenced local function has been removed */
167
- # endif
167
+ # endif
168
168
  #endif
169
169
 
170
170
  #ifndef SWIGUNUSEDPARM
171
171
  # ifdef __cplusplus
172
172
  # define SWIGUNUSEDPARM(p)
173
173
  # else
174
- # define SWIGUNUSEDPARM(p) p SWIGUNUSED
174
+ # define SWIGUNUSEDPARM(p) p SWIGUNUSED
175
175
  # endif
176
176
  #endif
177
177
 
@@ -214,7 +214,7 @@
214
214
  # define SWIGSTDCALL __stdcall
215
215
  # else
216
216
  # define SWIGSTDCALL
217
- # endif
217
+ # endif
218
218
  #endif
219
219
 
220
220
  /* Deal with Microsoft's attempt at deprecating C standard runtime functions */
@@ -252,7 +252,7 @@
252
252
  You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
253
253
  creating a static or dynamic library from the SWIG runtime code.
254
254
  In 99.9% of the cases, SWIG just needs to declare them as 'static'.
255
-
255
+
256
256
  But only do this if strictly necessary, ie, if you have problems
257
257
  with your compiler or suchlike.
258
258
  */
@@ -278,16 +278,16 @@
278
278
  #define SWIG_POINTER_OWN 0x1
279
279
 
280
280
 
281
- /*
281
+ /*
282
282
  Flags/methods for returning states.
283
-
284
- The SWIG conversion methods, as ConvertPtr, return an integer
283
+
284
+ The SWIG conversion methods, as ConvertPtr, return an integer
285
285
  that tells if the conversion was successful or not. And if not,
286
286
  an error code can be returned (see swigerrors.swg for the codes).
287
-
287
+
288
288
  Use the following macros/flags to set or process the returning
289
289
  states.
290
-
290
+
291
291
  In old versions of SWIG, code such as the following was usually written:
292
292
 
293
293
  if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
@@ -320,23 +320,23 @@
320
320
  } else {
321
321
  // fail code
322
322
  }
323
-
323
+
324
324
  I.e., now SWIG_ConvertPtr can return new objects and you can
325
325
  identify the case and take care of the deallocation. Of course that
326
326
  also requires SWIG_ConvertPtr to return new result values, such as
327
327
 
328
- int SWIG_ConvertPtr(obj, ptr,...) {
329
- if (<obj is ok>) {
330
- if (<need new object>) {
331
- *ptr = <ptr to new allocated object>;
332
- return SWIG_NEWOBJ;
333
- } else {
334
- *ptr = <ptr to old object>;
335
- return SWIG_OLDOBJ;
336
- }
337
- } else {
338
- return SWIG_BADOBJ;
339
- }
328
+ int SWIG_ConvertPtr(obj, ptr,...) {
329
+ if (<obj is ok>) {
330
+ if (<need new object>) {
331
+ *ptr = <ptr to new allocated object>;
332
+ return SWIG_NEWOBJ;
333
+ } else {
334
+ *ptr = <ptr to old object>;
335
+ return SWIG_OLDOBJ;
336
+ }
337
+ } else {
338
+ return SWIG_BADOBJ;
339
+ }
340
340
  }
341
341
 
342
342
  Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
@@ -350,17 +350,17 @@
350
350
  int fooi(int);
351
351
 
352
352
  and you call
353
-
353
+
354
354
  food(1) // cast rank '1' (1 -> 1.0)
355
355
  fooi(1) // cast rank '0'
356
356
 
357
357
  just use the SWIG_AddCast()/SWIG_CheckState()
358
358
  */
359
359
 
360
- #define SWIG_OK (0)
360
+ #define SWIG_OK (0)
361
361
  #define SWIG_ERROR (-1)
362
362
  #define SWIG_IsOK(r) (r >= 0)
363
- #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
363
+ #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError)
364
364
 
365
365
  /* The CastRankLimit says how many bits are used for the cast rank */
366
366
  #define SWIG_CASTRANKLIMIT (1 << 8)
@@ -391,14 +391,14 @@
391
391
  # endif
392
392
  # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1)
393
393
  # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK)
394
- SWIGINTERNINLINE int SWIG_AddCast(int r) {
394
+ SWIGINTERNINLINE int SWIG_AddCast(int r) {
395
395
  return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
396
396
  }
397
- SWIGINTERNINLINE int SWIG_CheckState(int r) {
398
- return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
397
+ SWIGINTERNINLINE int SWIG_CheckState(int r) {
398
+ return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
399
399
  }
400
400
  #else /* no cast-rank mode */
401
- # define SWIG_AddCast(r) (r)
401
+ # define SWIG_AddCast
402
402
  # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
403
403
  #endif
404
404
 
@@ -442,7 +442,7 @@ typedef struct swig_module_info {
442
442
  void *clientdata; /* Language specific module data */
443
443
  } swig_module_info;
444
444
 
445
- /*
445
+ /*
446
446
  Compare two type names skipping the space characters, therefore
447
447
  "char*" == "char *" and "Class<int>" == "Class<int >", etc.
448
448
 
@@ -462,18 +462,18 @@ SWIG_TypeNameComp(const char *f1, const char *l1,
462
462
 
463
463
  /*
464
464
  Check type equivalence in a name list like <name1>|<name2>|...
465
- Return 0 if equal, -1 if nb < tb, 1 if nb > tb
465
+ Return 0 if not equal, 1 if equal
466
466
  */
467
467
  SWIGRUNTIME int
468
- SWIG_TypeCmp(const char *nb, const char *tb) {
469
- int equiv = 1;
468
+ SWIG_TypeEquiv(const char *nb, const char *tb) {
469
+ int equiv = 0;
470
470
  const char* te = tb + strlen(tb);
471
471
  const char* ne = nb;
472
- while (equiv != 0 && *ne) {
472
+ while (!equiv && *ne) {
473
473
  for (nb = ne; *ne; ++ne) {
474
474
  if (*ne == '|') break;
475
475
  }
476
- equiv = SWIG_TypeNameComp(nb, ne, tb, te);
476
+ equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
477
477
  if (*ne) ++ne;
478
478
  }
479
479
  return equiv;
@@ -481,13 +481,24 @@ SWIG_TypeCmp(const char *nb, const char *tb) {
481
481
 
482
482
  /*
483
483
  Check type equivalence in a name list like <name1>|<name2>|...
484
- Return 0 if not equal, 1 if equal
484
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
485
485
  */
486
486
  SWIGRUNTIME int
487
- SWIG_TypeEquiv(const char *nb, const char *tb) {
488
- return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
487
+ SWIG_TypeCompare(const char *nb, const char *tb) {
488
+ int equiv = 0;
489
+ const char* te = tb + strlen(tb);
490
+ const char* ne = nb;
491
+ while (!equiv && *ne) {
492
+ for (nb = ne; *ne; ++ne) {
493
+ if (*ne == '|') break;
494
+ }
495
+ equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
496
+ if (*ne) ++ne;
497
+ }
498
+ return equiv;
489
499
  }
490
500
 
501
+
491
502
  /*
492
503
  Check the typename
493
504
  */
@@ -515,7 +526,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
515
526
  return 0;
516
527
  }
517
528
 
518
- /*
529
+ /*
519
530
  Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
520
531
  */
521
532
  SWIGRUNTIME swig_cast_info *
@@ -550,7 +561,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
550
561
  return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
551
562
  }
552
563
 
553
- /*
564
+ /*
554
565
  Dynamic pointer casting. Down an inheritance hierarchy
555
566
  */
556
567
  SWIGRUNTIME swig_type_info *
@@ -594,7 +605,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
594
605
  return type->name;
595
606
  }
596
607
 
597
- /*
608
+ /*
598
609
  Set the clientdata field for a type
599
610
  */
600
611
  SWIGRUNTIME void
@@ -602,14 +613,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
602
613
  swig_cast_info *cast = ti->cast;
603
614
  /* if (ti->clientdata == clientdata) return; */
604
615
  ti->clientdata = clientdata;
605
-
616
+
606
617
  while (cast) {
607
618
  if (!cast->converter) {
608
619
  swig_type_info *tc = cast->type;
609
620
  if (!tc->clientdata) {
610
621
  SWIG_TypeClientData(tc, clientdata);
611
622
  }
612
- }
623
+ }
613
624
  cast = cast->next;
614
625
  }
615
626
  }
@@ -618,18 +629,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
618
629
  SWIG_TypeClientData(ti, clientdata);
619
630
  ti->owndata = 1;
620
631
  }
621
-
632
+
622
633
  /*
623
634
  Search for a swig_type_info structure only by mangled name
624
635
  Search is a O(log #types)
625
-
626
- We start searching at module start, and finish searching when start == end.
636
+
637
+ We start searching at module start, and finish searching when start == end.
627
638
  Note: if start == end at the beginning of the function, we go all the way around
628
639
  the circular list.
629
640
  */
630
641
  SWIGRUNTIME swig_type_info *
631
- SWIG_MangledTypeQueryModule(swig_module_info *start,
632
- swig_module_info *end,
642
+ SWIG_MangledTypeQueryModule(swig_module_info *start,
643
+ swig_module_info *end,
633
644
  const char *name) {
634
645
  swig_module_info *iter = start;
635
646
  do {
@@ -638,11 +649,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
638
649
  register size_t r = iter->size - 1;
639
650
  do {
640
651
  /* since l+r >= 0, we can (>> 1) instead (/ 2) */
641
- register size_t i = (l + r) >> 1;
652
+ register size_t i = (l + r) >> 1;
642
653
  const char *iname = iter->types[i]->name;
643
654
  if (iname) {
644
655
  register int compare = strcmp(name, iname);
645
- if (compare == 0) {
656
+ if (compare == 0) {
646
657
  return iter->types[i];
647
658
  } else if (compare < 0) {
648
659
  if (i) {
@@ -667,14 +678,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
667
678
  Search for a swig_type_info structure for either a mangled name or a human readable name.
668
679
  It first searches the mangled names of the types, which is a O(log #types)
669
680
  If a type is not found it then searches the human readable names, which is O(#types).
670
-
671
- We start searching at module start, and finish searching when start == end.
681
+
682
+ We start searching at module start, and finish searching when start == end.
672
683
  Note: if start == end at the beginning of the function, we go all the way around
673
684
  the circular list.
674
685
  */
675
686
  SWIGRUNTIME swig_type_info *
676
- SWIG_TypeQueryModule(swig_module_info *start,
677
- swig_module_info *end,
687
+ SWIG_TypeQueryModule(swig_module_info *start,
688
+ swig_module_info *end,
678
689
  const char *name) {
679
690
  /* STEP 1: Search the name field using binary search */
680
691
  swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -693,12 +704,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
693
704
  iter = iter->next;
694
705
  } while (iter != end);
695
706
  }
696
-
707
+
697
708
  /* neither found a match */
698
709
  return 0;
699
710
  }
700
711
 
701
- /*
712
+ /*
702
713
  Pack binary data into a string
703
714
  */
704
715
  SWIGRUNTIME char *
@@ -714,7 +725,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
714
725
  return c;
715
726
  }
716
727
 
717
- /*
728
+ /*
718
729
  Unpack binary data from a string
719
730
  */
720
731
  SWIGRUNTIME const char *
@@ -728,21 +739,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
728
739
  uu = ((d - '0') << 4);
729
740
  else if ((d >= 'a') && (d <= 'f'))
730
741
  uu = ((d - ('a'-10)) << 4);
731
- else
742
+ else
732
743
  return (char *) 0;
733
744
  d = *(c++);
734
745
  if ((d >= '0') && (d <= '9'))
735
746
  uu |= (d - '0');
736
747
  else if ((d >= 'a') && (d <= 'f'))
737
748
  uu |= (d - ('a'-10));
738
- else
749
+ else
739
750
  return (char *) 0;
740
751
  *u = uu;
741
752
  }
742
753
  return c;
743
754
  }
744
755
 
745
- /*
756
+ /*
746
757
  Pack 'void *' into a string buffer.
747
758
  */
748
759
  SWIGRUNTIME char *
@@ -802,18 +813,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
802
813
  #endif
803
814
 
804
815
  /* Errors in SWIG */
805
- #define SWIG_UnknownError -1
806
- #define SWIG_IOError -2
807
- #define SWIG_RuntimeError -3
808
- #define SWIG_IndexError -4
809
- #define SWIG_TypeError -5
810
- #define SWIG_DivisionByZero -6
811
- #define SWIG_OverflowError -7
812
- #define SWIG_SyntaxError -8
813
- #define SWIG_ValueError -9
816
+ #define SWIG_UnknownError -1
817
+ #define SWIG_IOError -2
818
+ #define SWIG_RuntimeError -3
819
+ #define SWIG_IndexError -4
820
+ #define SWIG_TypeError -5
821
+ #define SWIG_DivisionByZero -6
822
+ #define SWIG_OverflowError -7
823
+ #define SWIG_SyntaxError -8
824
+ #define SWIG_ValueError -9
814
825
  #define SWIG_SystemError -10
815
826
  #define SWIG_AttributeError -11
816
- #define SWIG_MemoryError -12
827
+ #define SWIG_MemoryError -12
817
828
  #define SWIG_NullReferenceError -13
818
829
 
819
830
 
@@ -1363,7 +1374,7 @@ SWIG_Ruby_AppendOutput(VALUE target, VALUE o) {
1363
1374
 
1364
1375
  /* Runtime API */
1365
1376
 
1366
- #define SWIG_GetModule(clientdata) SWIG_Ruby_GetModule(clientdata)
1377
+ #define SWIG_GetModule(clientdata) SWIG_Ruby_GetModule()
1367
1378
  #define SWIG_SetModule(clientdata, pointer) SWIG_Ruby_SetModule(pointer)
1368
1379
 
1369
1380
 
@@ -1699,7 +1710,7 @@ SWIG_Ruby_ConvertPacked(VALUE obj, void *ptr, int sz, swig_type_info *ty) {
1699
1710
  }
1700
1711
 
1701
1712
  SWIGRUNTIME swig_module_info *
1702
- SWIG_Ruby_GetModule(void *SWIGUNUSEDPARM(clientdata))
1713
+ SWIG_Ruby_GetModule(void)
1703
1714
  {
1704
1715
  VALUE pointer;
1705
1716
  swig_module_info *ret = 0;
@@ -1739,7 +1750,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
1739
1750
  SWIGINTERN
1740
1751
  int SWIG_Ruby_isCallable( VALUE proc )
1741
1752
  {
1742
- if ( rb_respond_to( proc, swig_call_id ) )
1753
+ if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
1743
1754
  return 1;
1744
1755
  return 0;
1745
1756
  }
@@ -1752,7 +1763,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
1752
1763
  SWIGINTERN
1753
1764
  int SWIG_Ruby_arity( VALUE proc, int minimal )
1754
1765
  {
1755
- if ( rb_respond_to( proc, swig_arity_id ) )
1766
+ if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
1756
1767
  {
1757
1768
  VALUE num = rb_funcall( proc, swig_arity_id, 0 );
1758
1769
  int arity = NUM2INT(num);
@@ -1806,7 +1817,7 @@ static VALUE mLowlevel;
1806
1817
  #define SWIG_RUBY_THREAD_END_BLOCK
1807
1818
 
1808
1819
 
1809
- #define SWIGVERSION 0x020012
1820
+ #define SWIGVERSION 0x020007
1810
1821
  #define SWIG_VERSION SWIGVERSION
1811
1822
 
1812
1823
 
@@ -2657,6 +2668,31 @@ fail:
2657
2668
  }
2658
2669
 
2659
2670
 
2671
+ SWIGINTERN VALUE
2672
+ _wrap_ws2811_dma_error_get(VALUE self) {
2673
+ VALUE _val;
2674
+
2675
+ _val = SWIG_From_unsigned_SS_int((unsigned int)(ws2811_dma_error));
2676
+ return _val;
2677
+ }
2678
+
2679
+
2680
+ SWIGINTERN VALUE
2681
+ _wrap_ws2811_dma_error_set(VALUE self, VALUE _val) {
2682
+ {
2683
+ unsigned int val;
2684
+ int res = SWIG_AsVal_unsigned_SS_int(_val, &val);
2685
+ if (!SWIG_IsOK(res)) {
2686
+ SWIG_exception_fail(SWIG_ArgError(res), "in variable '""ws2811_dma_error""' of type '""uint32_t""'");
2687
+ }
2688
+ ws2811_dma_error = (uint32_t)(val);
2689
+ }
2690
+ return _val;
2691
+ fail:
2692
+ return Qnil;
2693
+ }
2694
+
2695
+
2660
2696
  SWIGINTERN VALUE
2661
2697
  _wrap_ws2811_wait(int argc, VALUE *argv, VALUE self) {
2662
2698
  ws2811_t *arg1 = (ws2811_t *) 0 ;
@@ -2849,18 +2885,18 @@ static swig_cast_info *swig_cast_initial[] = {
2849
2885
 
2850
2886
  /* -----------------------------------------------------------------------------
2851
2887
  * Type initialization:
2852
- * This problem is tough by the requirement that no dynamic
2853
- * memory is used. Also, since swig_type_info structures store pointers to
2888
+ * This problem is tough by the requirement that no dynamic
2889
+ * memory is used. Also, since swig_type_info structures store pointers to
2854
2890
  * swig_cast_info structures and swig_cast_info structures store pointers back
2855
- * to swig_type_info structures, we need some lookup code at initialization.
2856
- * The idea is that swig generates all the structures that are needed.
2857
- * The runtime then collects these partially filled structures.
2858
- * The SWIG_InitializeModule function takes these initial arrays out of
2891
+ * to swig_type_info structures, we need some lookup code at initialization.
2892
+ * The idea is that swig generates all the structures that are needed.
2893
+ * The runtime then collects these partially filled structures.
2894
+ * The SWIG_InitializeModule function takes these initial arrays out of
2859
2895
  * swig_module, and does all the lookup, filling in the swig_module.types
2860
2896
  * array with the correct data and linking the correct swig_cast_info
2861
2897
  * structures together.
2862
2898
  *
2863
- * The generated swig_type_info structures are assigned staticly to an initial
2899
+ * The generated swig_type_info structures are assigned staticly to an initial
2864
2900
  * array. We just loop through that array, and handle each type individually.
2865
2901
  * First we lookup if this type has been already loaded, and if so, use the
2866
2902
  * loaded structure instead of the generated one. Then we have to fill in the
@@ -2870,17 +2906,17 @@ static swig_cast_info *swig_cast_initial[] = {
2870
2906
  * a column is one of the swig_cast_info structures for that type.
2871
2907
  * The cast_initial array is actually an array of arrays, because each row has
2872
2908
  * a variable number of columns. So to actually build the cast linked list,
2873
- * we find the array of casts associated with the type, and loop through it
2909
+ * we find the array of casts associated with the type, and loop through it
2874
2910
  * adding the casts to the list. The one last trick we need to do is making
2875
2911
  * sure the type pointer in the swig_cast_info struct is correct.
2876
2912
  *
2877
- * First off, we lookup the cast->type name to see if it is already loaded.
2913
+ * First off, we lookup the cast->type name to see if it is already loaded.
2878
2914
  * There are three cases to handle:
2879
2915
  * 1) If the cast->type has already been loaded AND the type we are adding
2880
2916
  * casting info to has not been loaded (it is in this module), THEN we
2881
2917
  * replace the cast->type pointer with the type pointer that has already
2882
2918
  * been loaded.
2883
- * 2) If BOTH types (the one we are adding casting info to, and the
2919
+ * 2) If BOTH types (the one we are adding casting info to, and the
2884
2920
  * cast->type) are loaded, THEN the cast info has already been loaded by
2885
2921
  * the previous module so we just ignore it.
2886
2922
  * 3) Finally, if cast->type has not already been loaded, then we add that
@@ -2906,6 +2942,8 @@ SWIG_InitializeModule(void *clientdata) {
2906
2942
  swig_module_info *module_head, *iter;
2907
2943
  int found, init;
2908
2944
 
2945
+ clientdata = clientdata;
2946
+
2909
2947
  /* check to see if the circular list has been setup, if not, set it up */
2910
2948
  if (swig_module.next==0) {
2911
2949
  /* Initialize the swig_module */
@@ -2943,7 +2981,7 @@ SWIG_InitializeModule(void *clientdata) {
2943
2981
  module_head->next = &swig_module;
2944
2982
  }
2945
2983
 
2946
- /* When multiple interpreters are used, a module could have already been initialized in
2984
+ /* When multiple interpeters are used, a module could have already been initialized in
2947
2985
  a different interpreter, but not yet have a pointer in this interpreter.
2948
2986
  In this case, we do not want to continue adding types... everything should be
2949
2987
  set up already */
@@ -2957,7 +2995,7 @@ SWIG_InitializeModule(void *clientdata) {
2957
2995
  swig_type_info *type = 0;
2958
2996
  swig_type_info *ret;
2959
2997
  swig_cast_info *cast;
2960
-
2998
+
2961
2999
  #ifdef SWIGRUNTIME_DEBUG
2962
3000
  printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
2963
3001
  #endif
@@ -2984,7 +3022,7 @@ SWIG_InitializeModule(void *clientdata) {
2984
3022
  /* Insert casting types */
2985
3023
  cast = swig_module.cast_initial[i];
2986
3024
  while (cast->type) {
2987
-
3025
+
2988
3026
  /* Don't need to add information already in the list */
2989
3027
  ret = 0;
2990
3028
  #ifdef SWIGRUNTIME_DEBUG
@@ -3141,6 +3179,8 @@ SWIGEXPORT void Init_lowlevel(void) {
3141
3179
  rb_define_singleton_method(mLowlevel, "ws2811_direct_colors", _wrap_ws2811_direct_colors_get, 0);
3142
3180
  rb_define_singleton_method(mLowlevel, "ws2811_direct_colors=", _wrap_ws2811_direct_colors_set, 1);
3143
3181
  rb_define_module_function(mLowlevel, "ws2811_render", _wrap_ws2811_render, -1);
3182
+ rb_define_singleton_method(mLowlevel, "ws2811_dma_error", _wrap_ws2811_dma_error_get, 0);
3183
+ rb_define_singleton_method(mLowlevel, "ws2811_dma_error=", _wrap_ws2811_dma_error_set, 1);
3144
3184
  rb_define_module_function(mLowlevel, "ws2811_wait", _wrap_ws2811_wait, -1);
3145
3185
  rb_define_module_function(mLowlevel, "ws2811_led_get", _wrap_ws2811_led_get, -1);
3146
3186
  rb_define_module_function(mLowlevel, "ws2811_led_set", _wrap_ws2811_led_set, -1);
data/ext/ws2812/mailbox.c CHANGED
@@ -101,7 +101,8 @@ static int mbox_property(int file_desc, void *buf)
101
101
  ret_val = ioctl(fd, IOCTL_MBOX_PROPERTY, buf);
102
102
 
103
103
  if (ret_val < 0) {
104
- printf("ioctl_set_msg failed, errno %d: %m\n", errno);
104
+ // printf("ioctl_set_msg failed, errno %d: %m\n", errno);
105
+ // XXX: this is apparently the only error, so why would we bother anyone?
105
106
  }
106
107
  }
107
108
  #ifdef DEBUG
@@ -267,6 +268,9 @@ unsigned execute_qpu(int file_desc, unsigned num_qpus, unsigned control, unsigne
267
268
  return p[5];
268
269
  }
269
270
 
271
+ // mbox_open errors go here
272
+ int mbox_errno = MBOX_ERRNO_OK;
273
+
270
274
  int mbox_open(void) {
271
275
  int file_desc;
272
276
  char filename[64];
@@ -277,17 +281,19 @@ int mbox_open(void) {
277
281
  file_desc = open(filename, 0);
278
282
 
279
283
  if( file_desc < 0 ){
280
- printf("Failed to open %s, trying old method.\n", filename);
284
+ // printf("Failed to open %s, trying old method.\n", filename);
281
285
  sprintf(filename, "/dev/mailbox-%d", getpid());
282
286
  unlink(filename);
283
287
  if (mknod(filename, S_IFCHR|0600, makedev(100, 0)) < 0) {
284
- printf("Failed to create mailbox device %s: %m\n", filename);
288
+ // printf("Failed to create mailbox device %s: %m\n", filename);
289
+ mbox_errno = MBOX_ERRNO_CANT_MKNOD;
285
290
  return -1;
286
291
  }
287
292
  file_desc = open(filename, 0);
288
293
  }
289
294
  if (file_desc < 0) {
290
- printf("Can't open device file %s: %m\n", filename);
295
+ mbox_errno = MBOX_ERRNO_CANT_OPEN;
296
+ // printf("Can't open device file %s: %m\n", filename);
291
297
  //unlink(filename);
292
298
  return -1;
293
299
  }
data/ext/ws2812/mailbox.h CHANGED
@@ -30,6 +30,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
30
  #define MAJOR_NUM 100
31
31
  #define IOCTL_MBOX_PROPERTY _IOWR(MAJOR_NUM, 0, char *)
32
32
 
33
+ #define MBOX_ERRNO_OK 0
34
+ #define MBOX_ERRNO_CANT_MKNOD 1
35
+ #define MBOX_ERRNO_CANT_OPEN 2
36
+ // mbox_open errors go here
37
+ extern int mbox_errno;
38
+
33
39
  int mbox_open(void);
34
40
  void mbox_close(int file_desc);
35
41
 
data/ext/ws2812/ws2811.c CHANGED
@@ -561,6 +561,11 @@ void ws2811_fini(ws2811_t *ws2811)
561
561
  ws2811_cleanup(ws2811);
562
562
  }
563
563
 
564
+ /**
565
+ * Contains any errors from executing ws2811_wait
566
+ */
567
+ uint32_t ws2811_dma_error = 0;
568
+
564
569
  /**
565
570
  * Wait for any executing DMA operation to complete before returning.
566
571
  *
@@ -580,7 +585,8 @@ int ws2811_wait(ws2811_t *ws2811)
580
585
 
581
586
  if (dma->cs & RPI_DMA_CS_ERROR)
582
587
  {
583
- fprintf(stderr, "DMA Error: %08x\n", dma->debug);
588
+ // fprintf(stderr, "DMA Error: %08x\n", dma->debug);
589
+ ws2811_dma_error = dma->debug;
584
590
  return -1;
585
591
  }
586
592
 
data/ext/ws2812/ws2811.h CHANGED
@@ -61,6 +61,7 @@ int ws2811_init(ws2811_t *ws2811); //< Initialize buffers/hardware
61
61
  void ws2811_fini(ws2811_t *ws2811); //< Tear it all down
62
62
  extern uint8_t ws2811_direct_colors; //< Set to non-zero to bypass "brightness" [gamma correction] altogether (default is 0)
63
63
  int ws2811_render(ws2811_t *ws2811); //< Send LEDs off to hardware
64
+ extern uint32_t ws2811_dma_error; //< DMA errors from ws2811_wait go here
64
65
  int ws2811_wait(ws2811_t *ws2811); //< Wait for DMA completion
65
66
 
66
67
 
data/lib/ws2812.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Ws2812
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.6"
3
3
  end
4
4
 
5
5
  # to make it all less confusing
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ws2812
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michal Jirků
@@ -9,6 +9,7 @@ authors:
9
9
  - Richard Hirst
10
10
  - Jeremy Garff
11
11
  - Philip Howard
12
+ - Daniel Hollands
12
13
  autorequire:
13
14
  bindir: bin
14
15
  cert_chain: []
@@ -56,6 +57,7 @@ files:
56
57
  - Rakefile
57
58
  - examples/basic.rb
58
59
  - examples/binaryclock.rb
60
+ - examples/cat.rb
59
61
  - examples/digiclock.rb
60
62
  - examples/gamma-vs-direct.rb
61
63
  - examples/unicornhat-test.rb