aboutsummaryrefslogtreecommitdiff
path: root/lib/Lirc/Client.rakumod
blob: f87528c7972c2021b4e874cd6a30e590d23ca294 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use v6.d;
use NativeCall;
 
class Lirc::Client {
    our class X::Init is Exception {
        has Int $.rc;
        method message { "Failed to init LIRC client: $!rc" }
    }
 
    our class X::Send is Exception {
        method message { "Failed to send command to LIRC client" }
    }
    
    my sub lirc_get_local_socket(Str $socket is encoded('utf8'), int32 $verbose --> int32is native('lirc_client'{*}
    my sub lirc_send_one(int32 $fdStr $remote is encoded('utf8'), Str $keysym is encoded('utf8'--> int32is native('lirc_client'{*}
 
    has int $!fd;
 
    submethod BUILD(Str :$socket=StrBool :$verbose=False{
        $!fd = lirc_get_local_socket($socket, $verbose ?? 1 !! 0);
        X::Init.new(rc => -$!fd).throw() if $!fd < 0;
    }
    
    method !send-sync(Str :$remote!Str :$keysym!{
        my $rc = lirc_send_one($!fd, $remote, $keysym);
        X::Send.new().throw() if $rc != 0;
    }
 
    # copied from OO::Actors 
    has Lock::Async $!orderer .= new;
    method send(Str :$remote!Str :$keysym!{
        $!orderer.lock.then({
            LEAVE $!orderer.unlock;
            self!send-sync(:$remote:$keysym);
        })
    }
}