ws2812 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e39a82b0bca3478139d613c71a9391f6897fe818
4
+ data.tar.gz: 93b56a48d2f0a479fb40bf899d4a6e6e10582238
5
+ SHA512:
6
+ metadata.gz: a53401e7e986463d426fcbbf403cb16bda51deaa8edb2a6d0c28f5f8f95d58166bb78fd427ea65992b6b768a1ada8c78b2523bb98964fb941b25d9b42eca33f1
7
+ data.tar.gz: e0e1198ed35a8b8a5944cff9cab294a18de8452e7022a05b3144a38c43f1b73e40046ab00f95b8107f82e6765946cd9146c270c301c501b0ffd189fa22d3f186
data/README.md CHANGED
@@ -9,10 +9,25 @@ These WS281x LEDs are sometimes also known as NeoPixels.
9
9
 
10
10
  # Installation
11
11
  As this is a published Ruby gem,
12
- ```
12
+ ```bash
13
13
  gem install ws2812
14
14
  ```
15
- should be enough.
15
+ should be enough. But the examples will be hidden in 'gems' dir.
16
+
17
+ If you want to avoid the gem route, the following works just as well:
18
+ ```bash
19
+ git clone https://github.com/wejn/ws2812
20
+ cd ws2812
21
+ # Assuming raspbian here; otherwise make sure you have 'mkmf'
22
+ # and can compile exts (failing that "rake compile" will bomb on you)
23
+ sudo apt-get update
24
+ sudo apt-get install -y ruby-full
25
+ # .
26
+ sudo gem install rake rake-compiler
27
+ rake compile
28
+ # and then, to demo it:
29
+ sudo ruby examples/digiclock.rb
30
+ ```
16
31
 
17
32
  # Examples
18
33
  See the [examples](https://github.com/wejn/ws2812/tree/master/examples)
@@ -23,7 +38,8 @@ GNU General Public License v. 2, see [LICENSE.txt](LICENSE.txt).
23
38
 
24
39
  # Authors
25
40
  This gem (all of the ruby code and some tweaks to the C extension) was
26
- created by Michal Jirků <box@wejn.org>.
41
+ originally created by Michal Jirků <box@wejn.org>, later extended by
42
+ Philip Howard <phil@gadgetoid.com> to support newer Pi-s.
27
43
 
28
44
  And it wouldn't be possible without the original UnicornHAT repo.
29
45
 
data/Rakefile CHANGED
@@ -30,10 +30,3 @@ Rake::ExtensionTask.new "ws2812" do |ext|
30
30
  ext.lib_dir = 'lib/ws2812'
31
31
  ext.gem_spec = spec
32
32
  end
33
-
34
- task :clobber => :clobber_extras
35
- task :clobber_extras do
36
- Dir.chdir('ext/ws2812/lib') do
37
- system('make', 'clean')
38
- end
39
- end
@@ -6,7 +6,7 @@ require 'ws2812'
6
6
  n = 64 # num leds
7
7
  ws = Ws2812::Basic.new(n, 18) # +n+ leds at pin 18, using defaults
8
8
  ws.open
9
- ws.brightness = 255
9
+ ws.brightness = 128
10
10
  if ARGV.first
11
11
  puts 'Using direct mode.'
12
12
  puts 'Remove all positional parameters to switch to gamma-corrected mode.'
@@ -17,14 +17,14 @@ else
17
17
  end
18
18
 
19
19
  # up...
20
- 0.upto(255) do |i|
20
+ 0.upto(128) do |i|
21
21
  ws[0..63] = Ws2812::Color.new(i, i, i)
22
22
  ws.show
23
23
  sleep 0.01
24
24
  end
25
25
 
26
26
  # and down...
27
- 255.downto(0) do |i|
27
+ 128.downto(0) do |i|
28
28
  ws[0..63] = Ws2812::Color.new(i, i, i)
29
29
  ws.show
30
30
  sleep 0.01
@@ -51,7 +51,7 @@ typedef struct {
51
51
  #define CM_PWM_DIV_PASSWD (0x5a << 24)
52
52
  #define CM_PWM_DIV_DIVI(val) ((val & 0xfff) << 12)
53
53
  #define CM_PWM_DIV_DIVF(val) ((val & 0xfff) << 0)
54
- } __attribute__ ((packed)) cm_pwm_t;
54
+ } cm_pwm_t;
55
55
 
56
56
 
57
57
  #define CM_PWM_OFFSET (0x001010a0)
@@ -46,7 +46,7 @@ typedef struct
46
46
  uint32_t stride;
47
47
  uint32_t nextconbk;
48
48
  uint32_t resvd_0x18[2];
49
- } __attribute__((packed)) dma_cb_t;
49
+ } dma_cb_t;
50
50
 
51
51
  /*
52
52
  * DMA register set
@@ -95,7 +95,7 @@ typedef struct
95
95
  #define RPI_DMA_STRIDE_S_STRIDE(val) ((val & 0xffff) << 0)
96
96
  uint32_t nextconbk;
97
97
  uint32_t debug;
98
- } __attribute__((packed)) dma_t;
98
+ } dma_t;
99
99
 
100
100
 
101
101
  #define DMA0_OFFSET (0x00007000)
@@ -59,7 +59,7 @@ typedef struct
59
59
  uint32_t pudclk[2]; // GPIO Pin Pull up/down Enable Clock
60
60
  uint32_t resvd_0xa0[4];
61
61
  uint32_t test;
62
- } __attribute__((packed)) gpio_t;
62
+ } gpio_t;
63
63
 
64
64
 
65
65
  #define GPIO_OFFSET (0x00200000)
@@ -1,11 +1,11 @@
1
1
  /* ----------------------------------------------------------------------------
2
2
  * This file was automatically generated by SWIG (http://www.swig.org).
3
- * Version 2.0.7
4
- *
5
- * This file is not intended to be easily readable and contains a number of
3
+ * Version 2.0.12
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
401
+ # define SWIG_AddCast(r) (r)
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 not equal, 1 if equal
465
+ Return 0 if equal, -1 if nb < tb, 1 if nb > tb
466
466
  */
467
467
  SWIGRUNTIME int
468
- SWIG_TypeEquiv(const char *nb, const char *tb) {
469
- int equiv = 0;
468
+ SWIG_TypeCmp(const char *nb, const char *tb) {
469
+ int equiv = 1;
470
470
  const char* te = tb + strlen(tb);
471
471
  const char* ne = nb;
472
- while (!equiv && *ne) {
472
+ while (equiv != 0 && *ne) {
473
473
  for (nb = ne; *ne; ++ne) {
474
474
  if (*ne == '|') break;
475
475
  }
476
- equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
476
+ equiv = SWIG_TypeNameComp(nb, ne, tb, te);
477
477
  if (*ne) ++ne;
478
478
  }
479
479
  return equiv;
@@ -481,24 +481,13 @@ SWIG_TypeEquiv(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 equal, -1 if nb < tb, 1 if nb > tb
484
+ Return 0 if not equal, 1 if equal
485
485
  */
486
486
  SWIGRUNTIME int
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;
487
+ SWIG_TypeEquiv(const char *nb, const char *tb) {
488
+ return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
499
489
  }
500
490
 
501
-
502
491
  /*
503
492
  Check the typename
504
493
  */
@@ -526,7 +515,7 @@ SWIG_TypeCheck(const char *c, swig_type_info *ty) {
526
515
  return 0;
527
516
  }
528
517
 
529
- /*
518
+ /*
530
519
  Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
531
520
  */
532
521
  SWIGRUNTIME swig_cast_info *
@@ -561,7 +550,7 @@ SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
561
550
  return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
562
551
  }
563
552
 
564
- /*
553
+ /*
565
554
  Dynamic pointer casting. Down an inheritance hierarchy
566
555
  */
567
556
  SWIGRUNTIME swig_type_info *
@@ -605,7 +594,7 @@ SWIG_TypePrettyName(const swig_type_info *type) {
605
594
  return type->name;
606
595
  }
607
596
 
608
- /*
597
+ /*
609
598
  Set the clientdata field for a type
610
599
  */
611
600
  SWIGRUNTIME void
@@ -613,14 +602,14 @@ SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
613
602
  swig_cast_info *cast = ti->cast;
614
603
  /* if (ti->clientdata == clientdata) return; */
615
604
  ti->clientdata = clientdata;
616
-
605
+
617
606
  while (cast) {
618
607
  if (!cast->converter) {
619
608
  swig_type_info *tc = cast->type;
620
609
  if (!tc->clientdata) {
621
610
  SWIG_TypeClientData(tc, clientdata);
622
611
  }
623
- }
612
+ }
624
613
  cast = cast->next;
625
614
  }
626
615
  }
@@ -629,18 +618,18 @@ SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
629
618
  SWIG_TypeClientData(ti, clientdata);
630
619
  ti->owndata = 1;
631
620
  }
632
-
621
+
633
622
  /*
634
623
  Search for a swig_type_info structure only by mangled name
635
624
  Search is a O(log #types)
636
-
637
- We start searching at module start, and finish searching when start == end.
625
+
626
+ We start searching at module start, and finish searching when start == end.
638
627
  Note: if start == end at the beginning of the function, we go all the way around
639
628
  the circular list.
640
629
  */
641
630
  SWIGRUNTIME swig_type_info *
642
- SWIG_MangledTypeQueryModule(swig_module_info *start,
643
- swig_module_info *end,
631
+ SWIG_MangledTypeQueryModule(swig_module_info *start,
632
+ swig_module_info *end,
644
633
  const char *name) {
645
634
  swig_module_info *iter = start;
646
635
  do {
@@ -649,11 +638,11 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
649
638
  register size_t r = iter->size - 1;
650
639
  do {
651
640
  /* since l+r >= 0, we can (>> 1) instead (/ 2) */
652
- register size_t i = (l + r) >> 1;
641
+ register size_t i = (l + r) >> 1;
653
642
  const char *iname = iter->types[i]->name;
654
643
  if (iname) {
655
644
  register int compare = strcmp(name, iname);
656
- if (compare == 0) {
645
+ if (compare == 0) {
657
646
  return iter->types[i];
658
647
  } else if (compare < 0) {
659
648
  if (i) {
@@ -678,14 +667,14 @@ SWIG_MangledTypeQueryModule(swig_module_info *start,
678
667
  Search for a swig_type_info structure for either a mangled name or a human readable name.
679
668
  It first searches the mangled names of the types, which is a O(log #types)
680
669
  If a type is not found it then searches the human readable names, which is O(#types).
681
-
682
- We start searching at module start, and finish searching when start == end.
670
+
671
+ We start searching at module start, and finish searching when start == end.
683
672
  Note: if start == end at the beginning of the function, we go all the way around
684
673
  the circular list.
685
674
  */
686
675
  SWIGRUNTIME swig_type_info *
687
- SWIG_TypeQueryModule(swig_module_info *start,
688
- swig_module_info *end,
676
+ SWIG_TypeQueryModule(swig_module_info *start,
677
+ swig_module_info *end,
689
678
  const char *name) {
690
679
  /* STEP 1: Search the name field using binary search */
691
680
  swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
@@ -704,12 +693,12 @@ SWIG_TypeQueryModule(swig_module_info *start,
704
693
  iter = iter->next;
705
694
  } while (iter != end);
706
695
  }
707
-
696
+
708
697
  /* neither found a match */
709
698
  return 0;
710
699
  }
711
700
 
712
- /*
701
+ /*
713
702
  Pack binary data into a string
714
703
  */
715
704
  SWIGRUNTIME char *
@@ -725,7 +714,7 @@ SWIG_PackData(char *c, void *ptr, size_t sz) {
725
714
  return c;
726
715
  }
727
716
 
728
- /*
717
+ /*
729
718
  Unpack binary data from a string
730
719
  */
731
720
  SWIGRUNTIME const char *
@@ -739,21 +728,21 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
739
728
  uu = ((d - '0') << 4);
740
729
  else if ((d >= 'a') && (d <= 'f'))
741
730
  uu = ((d - ('a'-10)) << 4);
742
- else
731
+ else
743
732
  return (char *) 0;
744
733
  d = *(c++);
745
734
  if ((d >= '0') && (d <= '9'))
746
735
  uu |= (d - '0');
747
736
  else if ((d >= 'a') && (d <= 'f'))
748
737
  uu |= (d - ('a'-10));
749
- else
738
+ else
750
739
  return (char *) 0;
751
740
  *u = uu;
752
741
  }
753
742
  return c;
754
743
  }
755
744
 
756
- /*
745
+ /*
757
746
  Pack 'void *' into a string buffer.
758
747
  */
759
748
  SWIGRUNTIME char *
@@ -813,18 +802,18 @@ SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
813
802
  #endif
814
803
 
815
804
  /* Errors in SWIG */
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
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
825
814
  #define SWIG_SystemError -10
826
815
  #define SWIG_AttributeError -11
827
- #define SWIG_MemoryError -12
816
+ #define SWIG_MemoryError -12
828
817
  #define SWIG_NullReferenceError -13
829
818
 
830
819
 
@@ -1374,7 +1363,7 @@ SWIG_Ruby_AppendOutput(VALUE target, VALUE o) {
1374
1363
 
1375
1364
  /* Runtime API */
1376
1365
 
1377
- #define SWIG_GetModule(clientdata) SWIG_Ruby_GetModule()
1366
+ #define SWIG_GetModule(clientdata) SWIG_Ruby_GetModule(clientdata)
1378
1367
  #define SWIG_SetModule(clientdata, pointer) SWIG_Ruby_SetModule(pointer)
1379
1368
 
1380
1369
 
@@ -1710,7 +1699,7 @@ SWIG_Ruby_ConvertPacked(VALUE obj, void *ptr, int sz, swig_type_info *ty) {
1710
1699
  }
1711
1700
 
1712
1701
  SWIGRUNTIME swig_module_info *
1713
- SWIG_Ruby_GetModule(void)
1702
+ SWIG_Ruby_GetModule(void *SWIGUNUSEDPARM(clientdata))
1714
1703
  {
1715
1704
  VALUE pointer;
1716
1705
  swig_module_info *ret = 0;
@@ -1750,7 +1739,7 @@ SWIG_Ruby_SetModule(swig_module_info *pointer)
1750
1739
  SWIGINTERN
1751
1740
  int SWIG_Ruby_isCallable( VALUE proc )
1752
1741
  {
1753
- if ( rb_respond_to( proc, swig_call_id ) == Qtrue )
1742
+ if ( rb_respond_to( proc, swig_call_id ) )
1754
1743
  return 1;
1755
1744
  return 0;
1756
1745
  }
@@ -1763,7 +1752,7 @@ int SWIG_Ruby_isCallable( VALUE proc )
1763
1752
  SWIGINTERN
1764
1753
  int SWIG_Ruby_arity( VALUE proc, int minimal )
1765
1754
  {
1766
- if ( rb_respond_to( proc, swig_arity_id ) == Qtrue )
1755
+ if ( rb_respond_to( proc, swig_arity_id ) )
1767
1756
  {
1768
1757
  VALUE num = rb_funcall( proc, swig_arity_id, 0 );
1769
1758
  int arity = NUM2INT(num);
@@ -1817,7 +1806,7 @@ static VALUE mLowlevel;
1817
1806
  #define SWIG_RUBY_THREAD_END_BLOCK
1818
1807
 
1819
1808
 
1820
- #define SWIGVERSION 0x020007
1809
+ #define SWIGVERSION 0x020012
1821
1810
  #define SWIG_VERSION SWIGVERSION
1822
1811
 
1823
1812
 
@@ -2668,31 +2657,6 @@ fail:
2668
2657
  }
2669
2658
 
2670
2659
 
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
-
2696
2660
  SWIGINTERN VALUE
2697
2661
  _wrap_ws2811_wait(int argc, VALUE *argv, VALUE self) {
2698
2662
  ws2811_t *arg1 = (ws2811_t *) 0 ;
@@ -2885,18 +2849,18 @@ static swig_cast_info *swig_cast_initial[] = {
2885
2849
 
2886
2850
  /* -----------------------------------------------------------------------------
2887
2851
  * Type initialization:
2888
- * This problem is tough by the requirement that no dynamic
2889
- * memory is used. Also, since swig_type_info structures store pointers to
2852
+ * This problem is tough by the requirement that no dynamic
2853
+ * memory is used. Also, since swig_type_info structures store pointers to
2890
2854
  * swig_cast_info structures and swig_cast_info structures store pointers back
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
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
2895
2859
  * swig_module, and does all the lookup, filling in the swig_module.types
2896
2860
  * array with the correct data and linking the correct swig_cast_info
2897
2861
  * structures together.
2898
2862
  *
2899
- * The generated swig_type_info structures are assigned staticly to an initial
2863
+ * The generated swig_type_info structures are assigned staticly to an initial
2900
2864
  * array. We just loop through that array, and handle each type individually.
2901
2865
  * First we lookup if this type has been already loaded, and if so, use the
2902
2866
  * loaded structure instead of the generated one. Then we have to fill in the
@@ -2906,17 +2870,17 @@ static swig_cast_info *swig_cast_initial[] = {
2906
2870
  * a column is one of the swig_cast_info structures for that type.
2907
2871
  * The cast_initial array is actually an array of arrays, because each row has
2908
2872
  * a variable number of columns. So to actually build the cast linked list,
2909
- * we find the array of casts associated with the type, and loop through it
2873
+ * we find the array of casts associated with the type, and loop through it
2910
2874
  * adding the casts to the list. The one last trick we need to do is making
2911
2875
  * sure the type pointer in the swig_cast_info struct is correct.
2912
2876
  *
2913
- * First off, we lookup the cast->type name to see if it is already loaded.
2877
+ * First off, we lookup the cast->type name to see if it is already loaded.
2914
2878
  * There are three cases to handle:
2915
2879
  * 1) If the cast->type has already been loaded AND the type we are adding
2916
2880
  * casting info to has not been loaded (it is in this module), THEN we
2917
2881
  * replace the cast->type pointer with the type pointer that has already
2918
2882
  * been loaded.
2919
- * 2) If BOTH types (the one we are adding casting info to, and the
2883
+ * 2) If BOTH types (the one we are adding casting info to, and the
2920
2884
  * cast->type) are loaded, THEN the cast info has already been loaded by
2921
2885
  * the previous module so we just ignore it.
2922
2886
  * 3) Finally, if cast->type has not already been loaded, then we add that
@@ -2942,8 +2906,6 @@ SWIG_InitializeModule(void *clientdata) {
2942
2906
  swig_module_info *module_head, *iter;
2943
2907
  int found, init;
2944
2908
 
2945
- clientdata = clientdata;
2946
-
2947
2909
  /* check to see if the circular list has been setup, if not, set it up */
2948
2910
  if (swig_module.next==0) {
2949
2911
  /* Initialize the swig_module */
@@ -2981,7 +2943,7 @@ SWIG_InitializeModule(void *clientdata) {
2981
2943
  module_head->next = &swig_module;
2982
2944
  }
2983
2945
 
2984
- /* When multiple interpeters are used, a module could have already been initialized in
2946
+ /* When multiple interpreters are used, a module could have already been initialized in
2985
2947
  a different interpreter, but not yet have a pointer in this interpreter.
2986
2948
  In this case, we do not want to continue adding types... everything should be
2987
2949
  set up already */
@@ -2995,7 +2957,7 @@ SWIG_InitializeModule(void *clientdata) {
2995
2957
  swig_type_info *type = 0;
2996
2958
  swig_type_info *ret;
2997
2959
  swig_cast_info *cast;
2998
-
2960
+
2999
2961
  #ifdef SWIGRUNTIME_DEBUG
3000
2962
  printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
3001
2963
  #endif
@@ -3022,7 +2984,7 @@ SWIG_InitializeModule(void *clientdata) {
3022
2984
  /* Insert casting types */
3023
2985
  cast = swig_module.cast_initial[i];
3024
2986
  while (cast->type) {
3025
-
2987
+
3026
2988
  /* Don't need to add information already in the list */
3027
2989
  ret = 0;
3028
2990
  #ifdef SWIGRUNTIME_DEBUG
@@ -3179,8 +3141,6 @@ SWIGEXPORT void Init_lowlevel(void) {
3179
3141
  rb_define_singleton_method(mLowlevel, "ws2811_direct_colors", _wrap_ws2811_direct_colors_get, 0);
3180
3142
  rb_define_singleton_method(mLowlevel, "ws2811_direct_colors=", _wrap_ws2811_direct_colors_set, 1);
3181
3143
  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);
3184
3144
  rb_define_module_function(mLowlevel, "ws2811_wait", _wrap_ws2811_wait, -1);
3185
3145
  rb_define_module_function(mLowlevel, "ws2811_led_get", _wrap_ws2811_led_get, -1);
3186
3146
  rb_define_module_function(mLowlevel, "ws2811_led_set", _wrap_ws2811_led_set, -1);
@@ -101,8 +101,7 @@ 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);
105
- // XXX: this is apparently the only error, so why would we bother anyone?
104
+ printf("ioctl_set_msg failed, errno %d: %m\n", errno);
106
105
  }
107
106
  }
108
107
  #ifdef DEBUG
@@ -268,42 +267,33 @@ unsigned execute_qpu(int file_desc, unsigned num_qpus, unsigned control, unsigne
268
267
  return p[5];
269
268
  }
270
269
 
271
- // mbox_open errors go here
272
- int mbox_errno = MBOX_ERRNO_OK;
273
-
274
270
  int mbox_open(void) {
275
271
  int file_desc;
276
- char *filename = NULL;
277
-
278
- mbox_errno = MBOX_ERRNO_OK;
272
+ char filename[64];
279
273
 
280
274
  // open a char device file used for communicating with kernel mbox driver
281
- filename = tempnam("/tmp", "mbox");
282
- if (filename == NULL) {
283
- mbox_errno = MBOX_ERRNO_CANT_TEMPNAM;
284
- goto err;
285
- }
286
- unlink(filename);
287
- if (mknod(filename, S_IFCHR|0600, makedev(100, 0)) < 0) {
288
- // printf("Failed to create mailbox device %s: %m\n", filename);
289
- mbox_errno = MBOX_ERRNO_CANT_MKNOD;
290
- goto err;
291
- }
275
+
276
+ sprintf(filename, "/dev/vcio");
292
277
  file_desc = open(filename, 0);
278
+
279
+ if( file_desc < 0 ){
280
+ printf("Failed to open %s, trying old method.\n", filename);
281
+ sprintf(filename, "/dev/mailbox-%d", getpid());
282
+ unlink(filename);
283
+ if (mknod(filename, S_IFCHR|0600, makedev(100, 0)) < 0) {
284
+ printf("Failed to create mailbox device %s: %m\n", filename);
285
+ return -1;
286
+ }
287
+ file_desc = open(filename, 0);
288
+ }
293
289
  if (file_desc < 0) {
294
- // printf("Can't open device file %s: %m\n", filename);
295
- mbox_errno = MBOX_ERRNO_CANT_OPEN;
296
- goto err;
290
+ printf("Can't open device file %s: %m\n", filename);
291
+ //unlink(filename);
292
+ return -1;
297
293
  }
298
- unlink(filename);
294
+ //unlink(filename);
299
295
 
300
296
  return file_desc;
301
- err:
302
- if (filename != NULL) {
303
- unlink(filename);
304
- free(filename);
305
- }
306
- return -1;
307
297
  }
308
298
 
309
299
  void mbox_close(int file_desc) {
@@ -30,13 +30,6 @@ 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_TEMPNAM 1
35
- #define MBOX_ERRNO_CANT_MKNOD 2
36
- #define MBOX_ERRNO_CANT_OPEN 3
37
- // mbox_open errors go here
38
- extern int mbox_errno;
39
-
40
33
  int mbox_open(void);
41
34
  void mbox_close(int file_desc);
42
35
 
@@ -97,7 +97,7 @@ typedef struct
97
97
  uint32_t resvd_0x1c;
98
98
  uint32_t rng2;
99
99
  uint32_t dat2;
100
- } __attribute__((packed)) pwm_t;
100
+ } pwm_t;
101
101
 
102
102
 
103
103
  #define PWM_OFFSET (0x0020c000)
@@ -561,11 +561,6 @@ 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
-
569
564
  /**
570
565
  * Wait for any executing DMA operation to complete before returning.
571
566
  *
@@ -585,19 +580,21 @@ int ws2811_wait(ws2811_t *ws2811)
585
580
 
586
581
  if (dma->cs & RPI_DMA_CS_ERROR)
587
582
  {
588
- // fprintf(stderr, "DMA Error: %08x\n", dma->debug);
589
- ws2811_dma_error = dma->debug;
583
+ fprintf(stderr, "DMA Error: %08x\n", dma->debug);
590
584
  return -1;
591
585
  }
592
586
 
593
587
  return 0;
594
588
  }
595
589
 
590
+
591
+
596
592
  /**
597
593
  * Setting to non-zero bypasses brightness
598
594
  */
599
595
  uint8_t ws2811_direct_colors = 0;
600
596
 
597
+
601
598
  /**
602
599
  * Render the PWM DMA buffer from the user supplied LED arrays and start the DMA
603
600
  * controller. This will update all LEDs on both PWM channels.
@@ -621,16 +618,17 @@ int ws2811_render(ws2811_t *ws2811)
621
618
  for (i = 0; i < channel->count; i++) // Led
622
619
  {
623
620
  uint8_t color[] = {0, 0, 0};
624
-
625
- color[0] = (channel->leds[i] >> 8) & 0xff; // green
626
- color[1] = (channel->leds[i] >> 16) & 0xff; // red
627
- color[2] = (channel->leds[i] >> 0) & 0xff; // blue
628
- if (ws2811_direct_colors == 0) {
629
- // apply the gamma table
630
- color[0] = (ws281x_gamma[color[0]] * scale) >> 8; // green
631
- color[1] = (ws281x_gamma[color[1]] * scale) >> 8; // red
632
- color[2] = (ws281x_gamma[color[2]] * scale) >> 8; // blue
621
+
622
+ if (ws2811_direct_colors == 0){
623
+ color[0] = (ws281x_gamma[((channel->leds[i] >> 8) & 0xff)] * scale) >> 8; // green
624
+ color[1] = (ws281x_gamma[((channel->leds[i] >> 16) & 0xff)] * scale) >> 8; // red
625
+ color[2] = (ws281x_gamma[((channel->leds[i] >> 0) & 0xff)] * scale) >> 8; // blue
633
626
  }
627
+ else {
628
+ color[0] = (channel->leds[i] >> 8) & 0xff; // green
629
+ color[1] = (channel->leds[i] >> 16) & 0xff; // red
630
+ color[2] = (channel->leds[i] >> 0) & 0xff; // blue
631
+ };
634
632
 
635
633
  for (j = 0; j < ARRAY_SIZE(color); j++) // Color
636
634
  {
@@ -59,9 +59,8 @@ typedef struct
59
59
 
60
60
  int ws2811_init(ws2811_t *ws2811); //< Initialize buffers/hardware
61
61
  void ws2811_fini(ws2811_t *ws2811); //< Tear it all down
62
- extern uint8_t ws2811_direct_colors; //< Set to non-zero to bypass "brightness" [gamma correction] altogether (default is 0)
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
65
64
  int ws2811_wait(ws2811_t *ws2811); //< Wait for DMA completion
66
65
 
67
66
 
@@ -1,5 +1,5 @@
1
1
  module Ws2812
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
4
4
 
5
5
  # to make it all less confusing
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ws2812
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Michal Jirků
@@ -17,33 +16,29 @@ dependencies:
17
16
  - !ruby/object:Gem::Dependency
18
17
  name: rake
19
18
  requirement: !ruby/object:Gem::Requirement
20
- none: false
21
19
  requirements:
22
- - - ! '>='
20
+ - - ">="
23
21
  - !ruby/object:Gem::Version
24
22
  version: '0'
25
23
  type: :development
26
24
  prerelease: false
27
25
  version_requirements: !ruby/object:Gem::Requirement
28
- none: false
29
26
  requirements:
30
- - - ! '>='
27
+ - - ">="
31
28
  - !ruby/object:Gem::Version
32
29
  version: '0'
33
30
  - !ruby/object:Gem::Dependency
34
31
  name: rake-compiler
35
32
  requirement: !ruby/object:Gem::Requirement
36
- none: false
37
33
  requirements:
38
- - - ! '>='
34
+ - - ">="
39
35
  - !ruby/object:Gem::Version
40
36
  version: '0'
41
37
  type: :development
42
38
  prerelease: false
43
39
  version_requirements: !ruby/object:Gem::Requirement
44
- none: false
45
40
  requirements:
46
- - - ! '>='
41
+ - - ">="
47
42
  - !ruby/object:Gem::Version
48
43
  version: '0'
49
44
  description: Gem that encapsulates modified RPi ws281x library from UnicornHat to
@@ -54,7 +49,7 @@ extensions:
54
49
  - ext/ws2812/extconf.rb
55
50
  extra_rdoc_files: []
56
51
  files:
57
- - .gitignore
52
+ - ".gitignore"
58
53
  - LICENSE.txt
59
54
  - README.md
60
55
  - Rakefile
@@ -89,26 +84,25 @@ files:
89
84
  homepage: https://github.com/wejn/ws2812
90
85
  licenses:
91
86
  - GPL-2.0
87
+ metadata: {}
92
88
  post_install_message:
93
89
  rdoc_options: []
94
90
  require_paths:
95
91
  - lib
96
92
  required_ruby_version: !ruby/object:Gem::Requirement
97
- none: false
98
93
  requirements:
99
- - - ! '>='
94
+ - - ">="
100
95
  - !ruby/object:Gem::Version
101
96
  version: '0'
102
97
  required_rubygems_version: !ruby/object:Gem::Requirement
103
- none: false
104
98
  requirements:
105
- - - ! '>='
99
+ - - ">="
106
100
  - !ruby/object:Gem::Version
107
101
  version: '0'
108
102
  requirements: []
109
103
  rubyforge_project:
110
- rubygems_version: 1.8.23
104
+ rubygems_version: 2.2.2
111
105
  signing_key:
112
- specification_version: 3
106
+ specification_version: 4
113
107
  summary: Ruby wrapper around WS2812 LED driver for Raspberry Pi
114
108
  test_files: []