new_remote 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,173 @@
1
+ #include <ruby.h>
2
+ #include <iostream>
3
+ #include <csignal>
4
+
5
+ #include "NewRemoteReceiver.h"
6
+ #include "NewRemoteTransmitter.h"
7
+
8
+ typedef void (*sighandler_t)(int);
9
+
10
+ static sighandler_t old_sig_int_handler, old_sig_term_handler;
11
+ static bool signal_received = false;
12
+
13
+ static void wrap_receiver_callback(NewRemoteCode);
14
+ static VALUE wrap_receiver_receive(VALUE, VALUE, VALUE);
15
+
16
+ static void wrap_transmitter_free(NewRemoteTransmitter *);
17
+ static VALUE wrap_transmitter_allocate(VALUE);
18
+ static VALUE wrap_transmitter_initialize(int, VALUE *, VALUE);
19
+ static VALUE wrap_transmitter_send_group(VALUE, VALUE);
20
+ static VALUE wrap_transmitter_send_unit(VALUE, VALUE, VALUE);
21
+ static VALUE wrap_transmitter_send_group_dim(VALUE, VALUE);
22
+ static VALUE wrap_transmitter_send_unit_dim(VALUE, VALUE, VALUE);
23
+
24
+ static void new_remote_signal_handler(int s) {
25
+ /* Restore previous signal handler on a SIGINT/SIGTERM. */
26
+ signal(SIGINT, old_sig_int_handler);
27
+ signal(SIGTERM, old_sig_term_handler);
28
+
29
+ signal_received = true;
30
+ }
31
+
32
+ static void wrap_receiver_callback(NewRemoteCode code) {
33
+ std::cout << "Address: " << code.address << ", ";
34
+
35
+ if (code.groupBit) {
36
+ std::cout << "group, ";
37
+ } else {
38
+ std::cout << "unit: " << static_cast<int>(code.unit) << ", ";
39
+ }
40
+
41
+ switch (code.switchType) {
42
+ case NewRemoteCode::off:
43
+ std::cout << "off, ";
44
+ break;
45
+ case NewRemoteCode::on:
46
+ std::cout << "on, ";
47
+ break;
48
+ case NewRemoteCode::dim:
49
+ std::cout << "dim, ";
50
+ break;
51
+ }
52
+
53
+ if (code.dimLevelPresent) {
54
+ std::cout << "dim level: " << static_cast<int>(code.dimLevel) << ", ";
55
+ }
56
+
57
+ std::cout << "period: " << code.period << "us." << std::endl;
58
+ }
59
+
60
+ static VALUE wrap_receiver_receive(VALUE self, VALUE pin, VALUE minRepeats) {
61
+ NewRemoteReceiver::init(NUM2INT(pin), NUM2INT(minRepeats), wrap_receiver_callback);
62
+
63
+ /* Wait forever until receiving SIGINT/SIGTERM. */
64
+ while (!signal_received) {
65
+ sleep(1);
66
+ }
67
+
68
+ return self;
69
+ }
70
+
71
+ static void wrap_code_free(NewRemoteCode *code) {
72
+ ruby_xfree(code);
73
+ }
74
+
75
+ static VALUE wrap_code_allocate(VALUE klass) {
76
+ return Data_Wrap_Struct(klass, NULL, wrap_code_free, ruby_xmalloc(sizeof(NewRemoteCode)));
77
+ }
78
+
79
+ static NewRemoteTransmitter *getNewRemoteTransmitter(VALUE self) {
80
+ NewRemoteTransmitter *transmitter;
81
+
82
+ Data_Get_Struct(self, NewRemoteTransmitter, transmitter);
83
+
84
+ return transmitter;
85
+ }
86
+
87
+ static void wrap_transmitter_free(NewRemoteTransmitter *transmitter) {
88
+ transmitter->~NewRemoteTransmitter();
89
+ ruby_xfree(transmitter);
90
+ }
91
+
92
+ static VALUE wrap_transmitter_allocate(VALUE klass) {
93
+ return Data_Wrap_Struct(klass, NULL, wrap_transmitter_free, ruby_xmalloc(sizeof(NewRemoteTransmitter)));
94
+ }
95
+
96
+ static VALUE wrap_transmitter_initialize(int argc, VALUE *argv, VALUE self) {
97
+ NewRemoteTransmitter *transmitter = getNewRemoteTransmitter(self);
98
+ VALUE address, pin, periodusec, repeats;
99
+
100
+ rb_scan_args(argc, argv, "22", &address, &pin, &periodusec, &repeats);
101
+
102
+ if (NIL_P(periodusec)) {
103
+ periodusec = INT2NUM(260);
104
+ }
105
+
106
+ if (NIL_P(repeats)) {
107
+ repeats = INT2NUM(4);
108
+ }
109
+
110
+ new(transmitter) NewRemoteTransmitter(NUM2INT(address), NUM2INT(pin), NUM2INT(periodusec), NUM2INT(repeats));
111
+
112
+ return Qnil;
113
+ }
114
+
115
+ static VALUE wrap_transmitter_send_group(VALUE self, VALUE state) {
116
+ NewRemoteTransmitter *transmitter = getNewRemoteTransmitter(self);
117
+
118
+ transmitter->sendGroup(RTEST(state));
119
+
120
+ return self;
121
+ }
122
+
123
+ static VALUE wrap_transmitter_send_unit(VALUE self, VALUE device, VALUE state) {
124
+ NewRemoteTransmitter *transmitter = getNewRemoteTransmitter(self);
125
+
126
+ transmitter->sendUnit(NUM2INT(device), RTEST(state));
127
+
128
+ return self;
129
+ }
130
+
131
+ static VALUE wrap_transmitter_send_group_dim(VALUE self, VALUE dimLevel) {
132
+ NewRemoteTransmitter *transmitter = getNewRemoteTransmitter(self);
133
+
134
+ transmitter->sendGroupDim(NUM2INT(dimLevel));
135
+
136
+ return self;
137
+ }
138
+
139
+ static VALUE wrap_transmitter_send_unit_dim(VALUE self, VALUE device, VALUE dimLevel) {
140
+ NewRemoteTransmitter *transmitter = getNewRemoteTransmitter(self);
141
+
142
+ transmitter->sendDim(NUM2INT(device), NUM2INT(dimLevel));
143
+
144
+ return self;
145
+ }
146
+
147
+ extern "C" void Init_new_remote() {
148
+ VALUE NewRemoteModule = rb_define_module("NewRemote");
149
+
150
+ /* Receiver class definitions. */
151
+ VALUE ReceiverClass = rb_define_class_under(NewRemoteModule, "Receiver", rb_cObject);
152
+
153
+ rb_define_singleton_method(ReceiverClass, "receive", RUBY_METHOD_FUNC(wrap_receiver_receive), 2);
154
+
155
+ /* Transmitter class definitions. */
156
+ VALUE TransmitterClass = rb_define_class_under(NewRemoteModule, "Transmitter", rb_cObject);
157
+
158
+ rb_define_alloc_func(TransmitterClass, wrap_transmitter_allocate);
159
+ rb_define_method(TransmitterClass, "initialize", RUBY_METHOD_FUNC(wrap_transmitter_initialize), -1);
160
+ rb_define_method(TransmitterClass, "send_group", RUBY_METHOD_FUNC(wrap_transmitter_send_group), 1);
161
+ rb_define_method(TransmitterClass, "send_unit", RUBY_METHOD_FUNC(wrap_transmitter_send_unit), 2);
162
+ rb_define_method(TransmitterClass, "send_group_dim", RUBY_METHOD_FUNC(wrap_transmitter_send_group_dim), 1);
163
+ rb_define_method(TransmitterClass, "send_unit_dim", RUBY_METHOD_FUNC(wrap_transmitter_send_unit_dim), 2);
164
+
165
+ if (wiringPiSetup() == -1) {
166
+ std::cerr << "WiringPi setup failed." << std::endl;
167
+ exit(1);
168
+ }
169
+
170
+ /* Catch SIGINT/SIGTERM with our own signal handler. */
171
+ old_sig_int_handler = signal(SIGINT, new_remote_signal_handler);
172
+ old_sig_term_handler = signal(SIGTERM, new_remote_signal_handler);
173
+ }
data/lib/new_remote.rb ADDED
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "new_remote/new_remote"
4
+ require "new_remote/version"
5
+
6
+ module NewRemote
7
+ class UnitCommand
8
+ def initialize(transmitter, device)
9
+ @transmitter = transmitter
10
+ @device = device
11
+ end
12
+
13
+ def on
14
+ @transmitter.send_unit(@device, true)
15
+ end
16
+
17
+ def off
18
+ @transmitter.send_unit(@device, false)
19
+ end
20
+
21
+ def dim(level)
22
+ @transmitter.send_unit_dim(@device, level)
23
+ end
24
+ end
25
+
26
+ class GroupCommand
27
+ def initialize(transmitter)
28
+ @transmitter = transmitter
29
+ end
30
+
31
+ def on
32
+ @transmitter.send_group(true)
33
+ end
34
+
35
+ def off
36
+ @transmitter.send_group(false)
37
+ end
38
+
39
+ def dim(level)
40
+ @transmitter.send_group_dim(level)
41
+ end
42
+ end
43
+
44
+ class Transmitter
45
+ def unit(device)
46
+ UnitCommand.new(self, device)
47
+ end
48
+
49
+ def group
50
+ GroupCommand.new(self)
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module NewRemote
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "new_remote/version"
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "new_remote"
9
+ spec.version = NewRemote::VERSION
10
+ spec.authors = ["Peter Postma"]
11
+ spec.email = ["peter.postma@gmail.com"]
12
+
13
+ spec.summary = "NewRemoteSwitch for Arduino ported to Raspberry Pi"
14
+ spec.homepage = "https://github.com/ppostma/NewRemoteSwitch"
15
+ spec.license = "GPL-3.0"
16
+
17
+ # Specify which files should be added to the gem when it is released.
18
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.extensions = %w[ext/new_remote/extconf.rb]
24
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
+ spec.require_paths = ["lib"]
26
+
27
+ spec.add_development_dependency "bundler", "~> 2.0"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "rake-compiler", "~> 1.0"
30
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: new_remote
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter Postma
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-03-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ description:
56
+ email:
57
+ - peter.postma@gmail.com
58
+ executables: []
59
+ extensions:
60
+ - ext/new_remote/extconf.rb
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rubocop.yml"
65
+ - Gemfile
66
+ - Gemfile.lock
67
+ - LICENSE
68
+ - README.md
69
+ - Rakefile
70
+ - bin/console
71
+ - bin/setup
72
+ - ext/new_remote/NewRemoteReceiver.cpp
73
+ - ext/new_remote/NewRemoteReceiver.h
74
+ - ext/new_remote/NewRemoteTransmitter.cpp
75
+ - ext/new_remote/NewRemoteTransmitter.h
76
+ - ext/new_remote/extconf.rb
77
+ - ext/new_remote/license.txt
78
+ - ext/new_remote/new_remote.cpp
79
+ - lib/new_remote.rb
80
+ - lib/new_remote/version.rb
81
+ - new_remote.gemspec
82
+ homepage: https://github.com/ppostma/NewRemoteSwitch
83
+ licenses:
84
+ - GPL-3.0
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 2.7.8
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: NewRemoteSwitch for Arduino ported to Raspberry Pi
106
+ test_files: []