Device-Firmata
view release on metacpan or search on metacpan
lib/Device/Firmata/Protocol.pm view on Meta::CPAN
}
#/* pin state response
# * -------------------------------
# * 0 START_SYSEX (0xF0) (MIDI System Exclusive)
# * 1 pin state response (0x6E)
# * 2 pin (0 to 127)
# * 3 pin mode (the currently configured mode)
# * 4 pin state, bits 0-6
# * 5 (optional) pin state, bits 7-13
# * 6 (optional) pin state, bits 14-20
# ... additional optional bytes, as many as needed
# * N END_SYSEX (0xF7)
# */
sub handle_pin_state_response {
my ( $self, $sysex_data ) = @_;
my $pin = shift @$sysex_data;
my $mode = shift @$sysex_data;
my $state = shift @$sysex_data & 0x7f;
my $nibble = shift @$sysex_data;
for ( my $i = 1 ; defined $nibble ; $nibble = shift @$sysex_data ) {
$state += ( $nibble & 0x7f ) << ( 7 * $i );
}
return {
pin => $pin,
mode => $mode,
moden_str => $MODENAMES->{$mode},
state => $state
};
}
sub packet_sampling_interval {
my ( $self, $interval ) = @_;
return $self->packet_sysex_command( SAMPLING_INTERVAL,
$interval & 0x7f,
$interval >> 7
);
}
#/* I2C read/write request
# * -------------------------------
# * 0 START_SYSEX (0xF0) (MIDI System Exclusive)
# * 1 I2C_REQUEST (0x76)
# * 2 slave address (LSB)
# * 3 slave address (MSB) + read/write and address mode bits
# {7: always 0} + {6: reserved} + {5: address mode, 1 means 10-bit mode} +
# {4-3: read/write, 00 => write, 01 => read once, 10 => read continuously, 11 => stop reading} +
# {2-0: slave address MSB in 10-bit mode, not used in 7-bit mode}
# * 4 data 0 (LSB)
# * 5 data 0 (MSB)
# * 6 data 1 (LSB)
# * 7 data 1 (MSB)
# * ...
# * n END_SYSEX (0xF7)
# */
sub packet_i2c_request {
my ( $self, $address, $command, @i2cdata ) = @_;
if (($address & 0x380) > 0) {
$command |= (0x20 | (($address >> 7) & 0x7));
}
if (scalar @i2cdata) {
my @data;
push_array_as_two_7bit(\@i2cdata,\@data);
return $self->packet_sysex_command( I2C_REQUEST,
$address & 0x7f,
$command,
@data,
);
} else {
return $self->packet_sysex_command( I2C_REQUEST,
$address & 0x7f,
$command,
);
}
}
#/* I2C reply
# * -------------------------------
# * 0 START_SYSEX (0xF0) (MIDI System Exclusive)
# * 1 I2C_REPLY (0x77)
# * 2 slave address (LSB)
# * 3 slave address (MSB)
# * 4 register (LSB)
# * 5 register (MSB)
# * 6 data 0 LSB
# * 7 data 0 MSB
# * ...
# * n END_SYSEX (0xF7)
# */
sub handle_i2c_reply {
my ( $self, $sysex_data ) = @_;
my $address = shift14bit($sysex_data);
my $register = shift14bit($sysex_data);
my @data = double_7bit_to_array($sysex_data);
return {
address => $address,
register => $register,
data => \@data,
};
}
#/* I2C config
# * -------------------------------
# * 0 START_SYSEX (0xF0) (MIDI System Exclusive)
# * 1 I2C_CONFIG (0x78)
# * 2 Delay in microseconds (LSB)
# * 3 Delay in microseconds (MSB)
# * ... user defined for special cases, etc
# * n END_SYSEX (0xF7)
# */
sub packet_i2c_config {
my ( $self, $delay, @data ) = @_;
return $self->packet_sysex_command( I2C_CONFIG,
$delay & 0x7f,
$delay >> 7, @data
);
}
#/* servo config
# * --------------------
# * 0 START_SYSEX (0xF0)
( run in 0.585 second using v1.01-cache-2.11-cpan-39bf76dae61 )