Skip to content

Commit 3e5b371

Browse files
committed
Initial commit.
0 parents  commit 3e5b371

File tree

6 files changed

+1434
-0
lines changed

6 files changed

+1434
-0
lines changed

Firmata.pm

+150
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
package Firmata;
2+
3+
use warnings;
4+
use strict;
5+
6+
use Moose;
7+
extends 'Reflex::Base';
8+
9+
has handle => ( isa => 'FileHandle', is => 'rw' );
10+
11+
with 'Reflex::Role::Streaming' => { handle => 'handle' };
12+
13+
has buffer => ( isa => 'Str', is => 'rw', default => '' );
14+
15+
sub on_handle_data {
16+
my ($self, $args) = @_;
17+
18+
my $data = $args->{data};
19+
my $buffer = $self->buffer() . $data;
20+
21+
# TODO - Cheezy, slow. Do better.
22+
23+
while (1) {
24+
25+
if ($buffer =~ s/^\xF9(..)//s) {
26+
my ($maj, $min) = unpack("CC", $1);
27+
print "<-- version $maj.$min\n";
28+
next;
29+
}
30+
31+
# SysEx? Ogods!
32+
33+
if ($buffer =~ s/^\xF0\x79(..)(.*?)\xF7//s) {
34+
my ($maj, $min) = unpack("CC", $1);
35+
36+
# TODO - See String SysEx discussion.
37+
my $string = $2;
38+
$string =~ tr[\x00][]d;
39+
print "<-- version $maj.$min ($string)\n";
40+
41+
# Capabilities.
42+
$self->put_handle("\xF0\x6B\xF7");
43+
44+
next;
45+
}
46+
47+
# String SysEx.
48+
49+
if ($buffer =~ s/^\xF0\x71(.*?)\xF7//s) {
50+
my $string = $1;
51+
52+
# TODO - Actually the MSB of each string octet is in one of the
53+
# bytes. We should convert these 16bit characters to 14bit
54+
# before displaying. Ripping out the \x00s is just an expedient
55+
# hack.
56+
57+
$string =~ tr[\x00][]d;
58+
print "<-- string: '$string'\n";
59+
next;
60+
}
61+
62+
# Capability SysEx.
63+
64+
if ($buffer =~ s/^\xF0\x6C(.*?)\xF7//s) {
65+
my $raw = $1;
66+
my @pins = ($raw =~ m/([^\x7F]*)\x7F/g);
67+
68+
my $pin = 0;
69+
foreach my $modes (@pins) {
70+
foreach my $mode ($modes =~ m/(..)/sg) {
71+
my ($m, $r) = unpack "CC", $mode;
72+
73+
my $text = [
74+
qw(
75+
input
76+
output
77+
analog
78+
pwm
79+
servo
80+
shift
81+
i2c
82+
)
83+
]->[$m];
84+
85+
print "<-- pin $pin can $text ($r)\n";
86+
}
87+
88+
$pin++;
89+
}
90+
91+
next;
92+
}
93+
94+
# Unknown SysEx.
95+
96+
if ($buffer =~ s/^\xF0(.)(.*?)\xF7//s) {
97+
my $cmd = ord($1);
98+
99+
my $hex = $2;
100+
$hex =~ s/([^ -~])/sprintf("<%02.2x>", ord($1))/seg;
101+
102+
printf "<-- sysex %02.2X '%s'\n", $cmd, $hex;
103+
next;
104+
}
105+
106+
if ($buffer =~ s/^([\xE0-\xEF])(..)//s) {
107+
my $port = ord($1) & 0x0F;
108+
my ($lsb, $msb) = unpack "CC", $2;
109+
my $value = (($msb & 0x7F) << 7) | ($lsb & 0x7F);
110+
print "<-- a($port) = $value\n";
111+
next;
112+
}
113+
114+
if ($buffer =~ s/^([\x90-\x9F])(..)//s) {
115+
my $port = ord($1) & 0x0F;
116+
my ($lsb, $msb) = unpack "CC", $2;
117+
my $value = (($msb & 0x7F) << 7) | ($lsb & 0x7F);
118+
print "<-- d($port) = $value\n";
119+
next;
120+
}
121+
122+
if ($buffer =~ s/^([\xC0-\xCF])(..)//s) {
123+
my $port = ord($1) & 0x0F;
124+
my ($lsb, $msb) = unpack "CC", $2;
125+
my $value = $lsb & 0x01;
126+
print "<-- a($port) set $value\n";
127+
next;
128+
}
129+
130+
if ($buffer =~ s/^([\xD0-\xDF])(..)//s) {
131+
my $port = ord($1) & 0x0F;
132+
my ($lsb, $msb) = unpack "CC", $2;
133+
my $value = $lsb & 0x01;
134+
print "<-- d($port) set $value\n";
135+
next;
136+
}
137+
138+
last;
139+
}
140+
141+
$self->buffer($buffer);
142+
143+
if (length $buffer) {
144+
my $hex = $buffer;
145+
$hex =~ s/(.)/sprintf("<%02.2x>", ord($1))/seg;
146+
print "<-- raw: $hex\n";
147+
}
148+
}
149+
150+
1;

README

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
Reflexive::Firmata - an Asynchronous OO interface to serial Firmata devices
2+
3+
Current status: Work in progress. Committed to github and Gitorious
4+
to facilitate collaborative hacking.
5+
6+
Community: irc.perl.org #reflex (for now)
7+
8+
License: Unless otherwise specified, Same Terms as Perl Itself. This
9+
may change.
10+
11+
The repository contains some other-copyright files that are being used
12+
for reference. Their code won't be incorporated in the released
13+
distribution, and the files will be removed from the repository once
14+
the Perl implementation is reasonably complete.

0 commit comments

Comments
 (0)