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 )