The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# vim: sts=2 sw=2
package LEGO::NXT::Constants;

use strict;
use warnings;

use Exporter qw( import );
our @EXPORT;

=head1 NAME

LEGO::NXT::Constants - Low-level constants for the Direct Commands API.

=head1 SYNOPSIS

  use LEGO::NXT::Constants;

=head1 DESCRIPTION

This module exports a bunch of constants in to your namespace for you to
use with the various low-level methods in the L<LEGO::NXT> module.

=head1 CONSTANTS

All of the following constants are exported in to your namespace by
default.

=head2 RET and NORET

For each request of the NXT, you must specify whether you want the NXT to
send a return value.

 $NXT_RET
 $NXT_NORET

Use $NXT_RET only when you really need a return value as it does have some
overhead because it has do do a second request to retrieve response
data from NXT and then parses that data.

=cut

our $NXT_RET   = 0x00;
our $NXT_NORET = 0x80;
our $NXT_SYSOP = 0x01;

push @EXPORT, qw( $NXT_RET $NXT_NORET $NXT_SYSOP );

=head2 IO Port

  $NXT_SENSOR1
  $NXT_SENSOR2
  $NXT_SENSOR3
  $NXT_SENSOR4
  
  $NXT_MOTOR_A
  $NXT_MOTOR_B
  $NXT_MOTOR_C
  $NXT_MOTOR_ALL

=cut

our $NXT_SENSOR_1  = 0x00;
our $NXT_SENSOR_2  = 0x01;
our $NXT_SENSOR_3  = 0x02; 
our $NXT_SENSOR_4  = 0x03;

our $NXT_MOTOR_A   = 0x00;
our $NXT_MOTOR_B   = 0x01;
our $NXT_MOTOR_C   = 0x02;
our $NXT_MOTOR_ALL = 0xFF;

push @EXPORT, qw(
    $NXT_SENSOR_1 $NXT_SENSOR_2 $NXT_SENSOR_3 $NXT_SENSOR_4
    $NXT_MOTOR_A $NXT_MOTOR_B $NXT_MOTOR_C $NXT_MOTOR_ALL
);

=head2 Motor Control

Output mode:

  $NXT_MOTOR_ON
  $NXT_BRAKE
  $NXT_REGULATED

Output regulation modes:

  $NXT_REGULATION_MODE_IDLE
  $NXT_REGULATION_MODE_MOTOR_SPEED
  $NXT_REGULATION_MODE_MOTOR_SYNC

Output run states:

  $NXT_MOTOR_RUN_STATE_IDLE
  $NXT_MOTOR_RUN_STATE_RAMPUP
  $NXT_MOTOR_RUN_STATE_RUNNING
  $NXT_MOTOR_RUN_STATE_RAMPDOWN

=cut

our $NXT_MOTOR_ON  = 0x01;
our $NXT_BRAKE     = 0x02;
our $NXT_REGULATED = 0x04;

our $NXT_REGULATION_MODE_IDLE        = 0x00;
our $NXT_REGULATION_MODE_MOTOR_SPEED = 0x01;
our $NXT_REGULATION_MODE_MOTOR_SYNC  = 0x02;

our $NXT_MOTOR_RUN_STATE_IDLE        = 0x00;
our $NXT_MOTOR_RUN_STATE_RAMPUP      = 0x10;
our $NXT_MOTOR_RUN_STATE_RUNNING     = 0x20;
our $NXT_MOTOR_RUN_STATE_RAMPDOWN    = 0x40;

push @EXPORT, qw(
  $NXT_MOTOR_ON $NXT_BRAKE $NXT_REGULATED
  $NXT_REGULATION_MODE_IDLE $NXT_REGULATION_MODE_MOTOR_SPEED $NXT_REGULATION_MODE_MOTOR_SYNC
  $NXT_MOTOR_RUN_STATE_IDLE $NXT_MOTOR_RUN_STATE_RAMPUP $NXT_MOTOR_RUN_STATE_RUNNING $NXT_MOTOR_RUN_STATE_RAMPDOWN
);

=head2 Sensor Type

  $NXT_NO_SENSOR
  $NXT_SWITCH
  $NXT_TEMPERATURE
  $NXT_REFLECTION
  $NXT_ANGLE
  $NXT_LIGHT_ACTIVE
  $NXT_LIGHT_INACTIVE
  $NXT_SOUND_DB
  $NXT_SOUND_DBA
  $NXT_CUSTOM
  $NXT_LOW_SPEED
  $NXT_LOW_SPEED_9V
  $NXT_NO_OF_SENSOR_TYPES

=cut

our $NXT_NO_SENSOR           = 0x00;
our $NXT_SWITCH              = 0x01;
our $NXT_TEMPERATURE         = 0x02;
our $NXT_REFLECTION          = 0x03;
our $NXT_ANGLE               = 0x04;
our $NXT_LIGHT_ACTIVE        = 0x05;
our $NXT_LIGHT_INACTIVE      = 0x06;
our $NXT_SOUND_DB            = 0x07;
our $NXT_SOUND_DBA           = 0x08;
our $NXT_CUSTOM              = 0x09;
our $NXT_LOW_SPEED           = 0x0A;
our $NXT_LOW_SPEED_9V        = 0x0B;
our $NXT_NO_OF_SENSOR_TYPES  = 0x0C;

push @EXPORT, qw(
  $NXT_NO_SENSOR $NXT_SWITCH $NXT_TEMPERATURE $NXT_REFLECTION $NXT_ANGLE
  $NXT_LIGHT_ACTIVE $NXT_LIGHT_INACTIVE $NXT_SOUND_DB $NXT_SOUND_DBA
  $NXT_CUSTOM $NXT_LOW_SPEED $NXT_LOW_SPEED_9V $NXT_NO_OF_SENSOR_TYPES
);

=head2 Sensor Mode

  $NXT_RAW_MODE
  $NXT_BOOLEAN_MODE
  $NXT_TRANSITION_CNT_MODE
  
  $NXT_PERIOD_COUNTER_MODE
  $NXT_PCT_FULL_SCALE_MODE
  
  $NXT_CELSIUS_MODE
  $NXT_FAHRENHEIT_MODE
  
  $NXT_ANGLE_STEPS_MODE
  $NXT_SLOPE_MASK
  $NXT_MODE_MASK

=cut

our $NXT_RAW_MODE            = 0x00;
our $NXT_BOOLEAN_MODE        = 0x20;
our $NXT_TRANSITION_CNT_MODE = 0x40;

our $NXT_PERIOD_COUNTER_MODE = 0x60;
our $NXT_PCT_FULL_SCALE_MODE = 0x80;

our $NXT_CELSIUS_MODE        = 0xA0;
our $NXT_FAHRENHEIT_MODE     = 0xC0;

our $NXT_ANGLE_STEPS_MODE    = 0xE0;
our $NXT_SLOPE_MASK          = 0x1F;
our $NXT_MODE_MASK           = 0xE0;

push @EXPORT, qw(
  $NXT_RAW_MODE $NXT_BOOLEAN_MODE $NXT_TRANSITION_CNT_MODE
  $NXT_PERIOD_COUNTER_MODE $NXT_PCT_FULL_SCALE_MODE
  $NXT_CELSIUS_MODE $NXT_FAHRENHEIT_MODE
  $NXT_ANGLE_STEPS_MODE $NXT_SLOPE_MASK $NXT_MODE_MASK
);

=head2 Op Codes

Generally you will not need to use these constants
since L<LEGO::NXT> provides easy to use wrappers around
all of these actions.

  $NXT_START_PROGRAM
  $NXT_STOP_PROGRAM
  $NXT_PLAY_SOUND_FILE
  $NXT_PLAY_TONE
  $NXT_SET_OUTPUT_STATE
  $NXT_SET_INPUT_MODE
  $NXT_GET_OUTPUT_STATE
  $NXT_GET_INPUT_VALUES
  $NXT_RESET_SCALED_INPUT_VALUE
  $NXT_MESSAGE_WRITE
  $NXT_RESET_MOTOR_POSITION
  $NXT_GET_BATTERY_LEVEL
  $NXT_STOP_SOUND_PLAYBACK
  $NXT_KEEP_ALIVE
  $NXT_LSGET_STATUS
  $NXT_LSWRITE
  $NXT_LSREAD
  $NXT_GET_CURRENT_PROGRAM_NAME
  $NXT_MESSAGE_READ

=cut

our $NXT_START_PROGRAM            = 0x00;
our $NXT_STOP_PROGRAM             = 0x01;
our $NXT_PLAY_SOUND_FILE          = 0x02;
our $NXT_PLAY_TONE                = 0x03;
our $NXT_SET_OUTPUT_STATE         = 0x04;
our $NXT_SET_INPUT_MODE           = 0x05;
our $NXT_GET_OUTPUT_STATE         = 0x06;
our $NXT_GET_INPUT_VALUES         = 0x07;
our $NXT_RESET_SCALED_INPUT_VALUE = 0x08;
our $NXT_MESSAGE_WRITE            = 0x09;
our $NXT_RESET_MOTOR_POSITION     = 0x0A;
our $NXT_GET_BATTERY_LEVEL        = 0x0B;
our $NXT_STOP_SOUND_PLAYBACK      = 0x0C;
our $NXT_KEEP_ALIVE               = 0x0D;
our $NXT_LSGET_STATUS             = 0x0E;
our $NXT_LSWRITE                  = 0x0F;
our $NXT_LSREAD                   = 0x10;
our $NXT_GET_CURRENT_PROGRAM_NAME = 0x11;
our $NXT_MESSAGE_READ             = 0x13;

push @EXPORT, qw(
  $NXT_START_PROGRAM $NXT_STOP_PROGRAM
  $NXT_PLAY_SOUND_FILE $NXT_PLAY_TONE
  $NXT_SET_OUTPUT_STATE $NXT_SET_INPUT_MODE $NXT_GET_OUTPUT_STATE
  $NXT_GET_INPUT_VALUES $NXT_RESET_SCALED_INPUT_VALUE $NXT_MESSAGE_WRITE
  $NXT_RESET_MOTOR_POSITION $NXT_GET_BATTERY_LEVEL $NXT_STOP_SOUND_PLAYBACK
  $NXT_KEEP_ALIVE $NXT_LSGET_STATUS $NXT_LSWRITE $NXT_LSREAD
  $NXT_GET_CURRENT_PROGRAM_NAME $NXT_MESSAGE_READ
);

=head2 SYS OPCODES

$NXT_SYS_OPEN_READ
$NXT_SYS_OPEN_WRITE
$NXT_SYS_READ
$NXT_SYS_WRITE
$NXT_SYS_CLOSE
$NXT_SYS_DELETE
$NXT_SYS_FIND_FIRST
$NXT_SYS_FIND_NEXT
$NXT_SYS_GET_FIRMWARE_VERSION
$NXT_SYS_OPEN_WRITE_LINEAR
$NXT_SYS_OPEN_READ_LINEAR
$NXT_SYS_OPEN_WRITE_DATA
$NXT_SYS_OPEN_APPEND_DATA
$NXT_SYS_BOOT
$NXT_SYS_SET_BRICK_NAME
$NXT_SYS_GET_DEVICE_INFO
$NXT_SYS_DELETE_USER_FLASH
$NXT_SYS_POLL_COMMAND_LENGTH
$NXT_SYS_POLL_COMMAND
$NXT_SYS_BLUETOOTH_FACTORY_RESET

=cut

our $NXT_SYS_OPEN_READ                = 0x80;
our $NXT_SYS_OPEN_WRITE               = 0x81;
our $NXT_SYS_READ                     = 0x82;
our $NXT_SYS_WRITE                    = 0x83;
our $NXT_SYS_CLOSE                    = 0x84;
our $NXT_SYS_DELETE                   = 0x85;
our $NXT_SYS_FIND_FIRST               = 0x86;
our $NXT_SYS_FIND_NEXT                = 0x87;
our $NXT_SYS_GET_FIRMWARE_VERSION     = 0x88;
our $NXT_SYS_OPEN_WRITE_LINEAR        = 0x89;
our $NXT_SYS_OPEN_READ_LINEAR         = 0x8A;
our $NXT_SYS_OPEN_WRITE_DATA          = 0x8B;
our $NXT_SYS_OPEN_APPEND_DATA         = 0x8C;
our $NXT_SYS_BOOT                     = 0x97;
our $NXT_SYS_SET_BRICK_NAME           = 0x98;
our $NXT_SYS_GET_DEVICE_INFO          = 0x9B;
our $NXT_SYS_DELETE_USER_FLASH        = 0xA0;
our $NXT_SYS_POLL_COMMAND_LENGTH      = 0xA1;
our $NXT_SYS_POLL_COMMAND             = 0xA2;
our $NXT_SYS_BLUETOOTH_FACTORY_RESET  = 0xA4;

push @EXPORT, qw(
$NXT_SYS_OPEN_READ 
$NXT_SYS_OPEN_WRITE
$NXT_SYS_READ      
$NXT_SYS_WRITE    
$NXT_SYS_CLOSE   
$NXT_SYS_DELETE 
$NXT_SYS_FIND_FIRST
$NXT_SYS_FIND_NEXT
$NXT_SYS_GET_FIRMWARE_VERSION 
$NXT_SYS_OPEN_WRITE_LINEAR   
$NXT_SYS_OPEN_READ_LINEAR   
$NXT_SYS_OPEN_WRITE_DATA   
$NXT_SYS_OPEN_APPEND_DATA 
$NXT_SYS_BOOT            
$NXT_SYS_SET_BRICK_NAME 
$NXT_SYS_GET_DEVICE_INFO
$NXT_SYS_DELETE_USER_FLASH
$NXT_SYS_POLL_COMMAND_LENGTH
$NXT_SYS_POLL_COMMAND      
$NXT_SYS_BLUETOOTH_FACTORY_RESET
);

1;

__END__
=head1 AUTHOR

Michael W. Collins <michaelcollins@ivorycity.com>

=head1 CONTRIBUTORS

Aran Deltac <bluefeet@cpan.org>

=head1 LICENSE

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.