#Lego   #IR   #Android   #Controll   #Library   #Opensource #Easy   #RemoteControl   #RC   #Infrared   #PowerFunctions   #38k  

My library (opensource license, just name me in your project as a project helper) for controlling legoir.

Just create a new LegoIRController(anyActivity) and play with the motors by Motor.R/B0-3.setSpeed(-7 to 7). Don't forget to use
<uses-permission android:name="android.permission.TRANSMIT_IR" /> in your AndroidManifest.xml


package me.antonio.infrared;

import android.annotation.SuppressLint;
import android.hardware.ConsumerIrManager;

public class LegoIRController implements Runnable {

private ConsumerIrManager man;
private static boolean active = false, shouldrun = true;
public static boolean isActive(){return active;}
public static void requestStop(){shouldrun = false;}

public LegoIRController(Activity act){this.man = (ConsumerIrManager)act.getSystemService(Context.CONSUMER_IR_SERVICE);}

private static final int // in ms
START = (int)(26.3 * 39),
ZERO = (int)(26.3 * 10),
ONE = (int)(26.3 * 21),
TR = (int)(26.3 * 6);

private static int i(int data, int pos){
return ((data>>pos)&1) != 0 ? ONE : ZERO;
}

@Override public void run(){
active = true;
try {
while(shouldrun){
// ... send the signals
for(Channel c : Channel.values()){
if(c.RED.active>0 || c.BLUE.active>0){
int s0 = 4 + c.id;
int s1 = c.BLUE.speed.value;
int s2 = c.RED.speed.value;
int s3 = 15 ^ s0 ^ s1 ^ s2;
// send 01id, bbbb, aaaa llll
man.transmit(38000, new int[]{

TR,START,

TR,i(s0,3),
TR,i(s0,2),
TR,i(s0,1),
TR,i(s0,0),

TR,i(s1,3),
TR,i(s1,2),
TR,i(s1,1),
TR,i(s1,0),

TR,i(s2,3),
TR,i(s2,2),
TR,i(s2,1),
TR,i(s2,0),

TR,i(s3,3),
TR,i(s3,2),
TR,i(s3,1),
TR,i(s3,0),

TR,START

});

c.RED.tick();
c.BLUE.tick();
}
}
// ... wait a little
Thread.sleep(50);
}
} catch (InterruptedException e) {}
active = false;
}

public static enum Speed {
FLOAT(0),
P1(1), P2(2), P3(3), P4(4), P5(5), P6(6), P7(7),
BREAK_THEN_FLOAT(-8),
M7(-7), M6(-6), M5(-5), M4(-4), M3(-3), M2(-2), M1(-1);
public final int value;
private Speed(int id){this.value = id;}
public static Speed byInt(int speed){
return Speed.values()[speed & 15];
}
}

public static enum Motor {
R0(0,false),B0(0,true),
R1(1,false),B1(1,true),
R2(2,false),B2(2,true),
R3(3,false),B3(3,true);
public final boolean blue;
public final int channel;
private Speed speed = Speed.FLOAT;
private int active = 0;
private Motor(int channel, boolean blue){
this.channel = channel;
this.blue = blue;
}

public Speed getSpeed(){return speed;}
public void setSpeed(Speed speed){
if(speed==this.speed){
return;
} else if(speed!=Speed.FLOAT && speed!=Speed.BREAK_THEN_FLOAT){active = 3;}
this.speed = speed;
}


public void setSpeed(int i) {
setSpeed(Speed.byInt(i));
}

private void tick(){
if((speed == Speed.FLOAT || speed == Speed.BREAK_THEN_FLOAT) && active>0){
active--;
}
}
}

public static enum Channel {
C0(0, Motor.R0, Motor.B0),
C1(1, Motor.R1, Motor.B1),
C2(2, Motor.R2, Motor.B2),
C3(3, Motor.R3, Motor.B3);
public final Motor RED, BLUE;
public final int id;
public final Motor[] motors;
private Channel(int id, Motor red, Motor blue){
this.id=id;RED=red;BLUE=blue;
motors = new Motor[]{red,blue};
}
}
}

255223507s ago, by Antonio