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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rubocop.yml +19 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +43 -0
- data/LICENSE +674 -0
- data/README.md +80 -0
- data/Rakefile +11 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/ext/new_remote/NewRemoteReceiver.cpp +311 -0
- data/ext/new_remote/NewRemoteReceiver.h +108 -0
- data/ext/new_remote/NewRemoteTransmitter.cpp +162 -0
- data/ext/new_remote/NewRemoteTransmitter.h +116 -0
- data/ext/new_remote/extconf.rb +10 -0
- data/ext/new_remote/license.txt +674 -0
- data/ext/new_remote/new_remote.cpp +173 -0
- data/lib/new_remote.rb +53 -0
- data/lib/new_remote/version.rb +5 -0
- data/new_remote.gemspec +30 -0
- metadata +106 -0
@@ -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
|
data/new_remote.gemspec
ADDED
@@ -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: []
|