@ -20,32 +20,43 @@ use colored::*;
#[ derive(StructOpt, Debug) ]
#[ structopt(name = " rust-footswitch " ) ]
struct Opt {
/// Prints a table of all keys with <listkeys> rows
#[ structopt(short = " l " , long = " listkeys " ) ]
listkeys : Option < usize > ,
#[ structopt(subcommand) ]
cmd : Option < Command > ,
}
#[ derive(StructOpt, Debug) ]
enum Command {
/// Write to the footpedal
#[ structopt(name = " write " ) ]
Write {
/// Specify pedal to modify with following command. Possible values: [0 | 1 | 2]
#[ structopt(short = " p " , long = " pedal " ) ]
pedal : Vec < u8 > ,
/// Prints a table of all possible keys
#[ structopt(name = " list " ) ]
ListKeys {
/// Specify the number of columns of the table
#[ structopt(short = " c " , long = " columns " ) ]
columns : usize ,
} ,
/// Command to apply. Possible values: [set_key | set_mousebutton | del_key | app_key | app_str | app_mod]
#[ structopt(short = " c " , long = " command " ) ]
command : Vec < String > ,
/// Set a key or a mousebutton to one or more pedals
#[ structopt(name = " set " ) ]
Set {
#[ structopt(subcommand) ]
cmd : Set
} ,
/// Input values to apply
#[ structopt(short = " i " , long = " input " ) ]
input : Vec < String > ,
/// Append a key, a modifier, or a string to one or more pedals
#[ structopt(name = " append " ) ]
Append {
#[ structopt(subcommand) ]
cmd : Append
} ,
/// Clear the value of one or more pedals
#[ structopt(name = " clear " ) ]
Clear {
/// Specify pedal(s) to clear: [0 | 1 | 2]
#[ structopt(short = " p " , long = " pedal " ) ]
pedal : Vec < u8 > ,
} ,
/// Read from the footpedal
#[ structopt(name = " read " ) ]
Read {
/// Read all pedals
@ -58,76 +69,180 @@ enum Command {
}
}
#[ derive(StructOpt, Debug) ]
enum Set {
/// Set a key value to one or more pedals
#[ structopt(name = " key " ) ]
SetKey {
/// Specify pedal(s) to modify: [0 | 1 | 2]
#[ structopt(short = " p " , long = " pedal " ) ]
pedal : Vec < u8 > ,
/// Value(s) to apply
#[ structopt(short = " i " , long = " input " ) ]
input : Vec < String > ,
} ,
/// Set a mousebutton to one or more pedals
#[ structopt(name = " mousebutton " ) ]
SetMousebutton {
/// Specify pedal(s) to modify: [0 | 1 | 2]
#[ structopt(short = " p " , long = " pedal " ) ]
pedal : Vec < u8 > ,
/// Value(s) to apply
#[ structopt(short = " i " , long = " input " ) ]
input : Vec < String > ,
} ,
/// Set X, Y, and W movement of the mouse pointer for one or more pedals
#[ structopt(name = " mousemovement " ) ]
SetMousemovement {
/// Specify pedal(s) to modify: [0 | 1 | 2]
#[ structopt(short = " p " , long = " pedal " ) ]
pedal : Vec < u8 > ,
/// X value(s): [-128,127]
#[ structopt(short = " x " ) ]
x : Vec < i8 > ,
/// Y value(s): [-128,127]
#[ structopt(short = " y " ) ]
y : Vec < i8 > ,
/// W value(s): [-128,127]
#[ structopt(short = " w " ) ]
w : Vec < i8 > ,
}
}
#[ derive(StructOpt, Debug) ]
enum Append {
/// Append a key value to one or more pedals
#[ structopt(name = " key " ) ]
AppendKey {
/// Specify pedal(s) to modify: [0 | 1 | 2]
#[ structopt(short = " p " , long = " pedal " ) ]
pedal : Vec < u8 > ,
/// Value(s) to apply
#[ structopt(short = " i " , long = " input " ) ]
input : Vec < String > ,
} ,
/// Append a string to one or more pedals
#[ structopt(name = " string " ) ]
AppendString {
/// Specify pedal(s) to modify: [0 | 1 | 2]
#[ structopt(short = " p " , long = " pedal " ) ]
pedal : Vec < u8 > ,
/// Value(s) to apply
#[ structopt(short = " i " , long = " input " ) ]
input : Vec < String > ,
} ,
/// Append a modifier to one or more pedals
#[ structopt(name = " modifier " ) ]
AppendModifier {
/// Specify pedal(s) to modify: [0 | 1 | 2]
#[ structopt(short = " p " , long = " pedal " ) ]
pedal : Vec < u8 > ,
/// Value(s) to apply
#[ structopt(short = " i " , long = " input " ) ]
input : Vec < String > ,
}
}
fn main ( ) {
let opt = Opt ::from_args ( ) ;
welcome ( "footswitch-rs, Dennis Potter <dennis@dennispotter.eu>" ) ;
welcome ( ) ;
check_sudo ( ) ;
// All options that don't need the device to be open
// Print all keys and exit application
if let Some ( x ) = opt . listkeys {
key_operations ::print_key_map ( x ) ;
goodbye ( ) ;
match opt . cmd {
Some ( Command ::ListKeys { columns } ) = > {
key_operations ::print_key_map ( columns ) ;
goodbye ( ) ;
} ,
_ = > { /* Do nothing, there are still lots of other options further below */ }
}
let mut pedals = pedal_operations ::Pedals ::new ( ) ;
// All options that need the device to be open
match opt . cmd {
Some ( Command ::Write { pedal : ped_list , command : cmd_list , input : val_list } ) = > {
if ped_list . len ( ) ! = cmd_list . len ( ) & & ped_list . len ( ) ! = val_list . len ( ) {
error ! ( "You must define as much pedals as you define commands and as you define input values!" ) ;
}
Some ( Command ::Append { cmd } ) = > {
match cmd {
Append::AppendKey { pedal , input } = >
{
for ( i , cmd ) in cmd_list . iter ( ) . enumerate ( ) {
match cmd as & str {
"set_key" = > {
pedals . set_key ( ped_list [ i ] as usize , val_list [ i ] . as_str ( ) ) ;
}
"set_mousebutton" = > {
pedals . set_mousebutton ( ped_list [ i ] as usize , val_list [ i ] . as_str ( ) ) ;
}
"del_key" = > {
}
"app_key" = > {
}
"app_str" = > {
pedals . set_string ( ped_list [ i ] as usize , val_list [ i ] . as_str ( ) ) ;
} ,
Append ::AppendString { pedal , input } = >
{
check_length ( & pedal , & input ) ;
for ( i , pedal ) in pedal . iter ( ) . enumerate ( ) {
pedals . set_string ( * pedal as usize , input [ i ] . as_str ( ) ) ;
}
"app_mod" = > {
pedals . set_modifier ( ped_list [ i ] as usize , val_list [ i ] . as_str ( ) ) ;
} ,
Append ::AppendModifier { pedal , input } = >
{
check_length ( & pedal , & input ) ;
for ( i , pedal ) in pedal . iter ( ) . enumerate ( ) {
pedals . set_modifier ( * pedal as usize , input [ i ] . as_str ( ) ) ;
}
"set_x" = > {
pedals . set_mouse_xyw ( ped_list [ i ] as usize , val_list [ i ] . as_str ( ) , 5 )
}
}
pedals . update_and_close ( ) ;
} ,
Some ( Command ::Set { cmd } ) = > {
match cmd {
Set ::SetKey { pedal , input } = >
{
check_length ( & pedal , & input ) ;
for ( i , pedal ) in pedal . iter ( ) . enumerate ( ) {
pedals . set_key ( * pedal as usize , input [ i ] . as_str ( ) ) ;
}
"set_y" = > {
pedals . set_mouse_xyw ( ped_list [ i ] as usize , val_list [ i ] . as_str ( ) , 6 )
} ,
Set ::SetMousebutton { pedal , input } = >
{
check_length ( & pedal , & input ) ;
for ( i , pedal ) in pedal . iter ( ) . enumerate ( ) {
pedals . set_mousebutton ( * pedal as usize , input [ i ] . as_str ( ) ) ;
}
"set_w" = > {
pedals . set_mouse_xyw ( ped_list [ i ] as usize , val_list [ i ] . as_str ( ) , 7 )
}
Set ::SetMousemovement { pedal , x , y , w } = >
{
if pedal . len ( ) ! = x . len ( ) | | x . len ( ) ! = y . len ( ) | | y . len ( ) ! = w . len ( ) {
error ! ( "You must define X, Y, and W for every pedal. If a direction is not needed, set it to 0!" ) ;
}
_ = > {
error ! ( "Unknown command!" ) ;
for ( i , pedal ) in pedal . iter ( ) . enumerate ( ) {
pedals . set_mouse_xyw ( * pedal as usize , x [ i ] , 5 ) ;
pedals . set_mouse_xyw ( * pedal as usize , y [ i ] , 6 ) ;
pedals . set_mouse_xyw ( * pedal as usize , w [ i ] , 7 ) ;
}
}
}
// Since we ran the Write command without any errors, we are now writing everything
pedals . write_pedals ( ) ;
info ! ( "Successfully wrote everything to footpedal!" ) ;
info ! ( "The current state of the device is shown below." ) ;
// Show user current state of pedal
pedals . read_pedals ( vec! [ 0 , 1 , 2 ] ) ;
pedals . update_and_close ( ) ;
} ,
goodbye ( ) ;
Some ( Command ::Clear { pedal } ) = > {
} ,
Some ( Command ::Read { all : all_var , pedals : ped_list } ) = > {
if ped_list . len ( ) > 3 {
error ! ( "Number of pedals may not be bigger than 3!" ) ;
@ -145,6 +260,8 @@ fn main() {
goodbye ( ) ;
} ,
Some ( Command ::ListKeys { columns :_columns } ) = > { /* This case will never occur */ } ,
None = > {
error ! ( "You did not specify any command. Run './footswitch-rs --help' for more information." ) ;
}
@ -157,3 +274,9 @@ fn check_sudo() {
error ! ( "Please execute this application as super user!" ) ;
}
}
fn check_length ( pedal : & Vec < u8 > , input : & Vec < String > ) {
if pedal . len ( ) ! = input . len ( ) {
error ! ( "You must define as much pedals as you define input values!" ) ;
}
}