package com.uxxu.konashi.lib.action;

import android.bluetooth.BluetoothGattService;

import com.uxxu.konashi.lib.Konashi;
import com.uxxu.konashi.lib.KonashiErrorType;
import com.uxxu.konashi.lib.KonashiUUID;
import com.uxxu.konashi.lib.util.PioUtils;

import java.util.UUID;

import info.izumin.android.bletia.BletiaErrorType;

/**
 * Created by izumin on 9/16/15.
 */
public class PioDigitalWriteAction extends KonashiWriteCharacteristicAction {

    private static final UUID UUID = KonashiUUID.PIO_OUTPUT_UUID;

    private int mPin;
    private int mOutput;
    private int mOutputs;

    private final boolean mIsForAll;

    public PioDigitalWriteAction(BluetoothGattService service, int outputs) {
        super(service, UUID);
        mIsForAll = true;
        mOutputs = outputs;
    }

    public PioDigitalWriteAction(BluetoothGattService service, int pin, int newOutput, int currentOutputs) {
        super(service, UUID);
        mIsForAll = false;
        mPin = pin;
        mOutput = newOutput;
        mOutputs = currentOutputs;
    }

    @Override
    protected void setValue() {
        if (!mIsForAll) {
            if (mOutput == Konashi.OUTPUT) {
                mOutputs |= (0x01 << mPin);
            } else {
                mOutputs &= (~(0x01 << mPin) & 0xff);
            }
        }
        getCharacteristic().setValue(new byte[]{(byte) mOutputs});
    }

    @Override
    protected BletiaErrorType validate() {
        if (mIsForAll) {
            return PioUtils.isValidOutput(mOutputs) ? KonashiErrorType.NO_ERROR : KonashiErrorType.INVALID_PIN_NUMBER;
        } else {
            if (!PioUtils.isValidPin(mPin)) return KonashiErrorType.INVALID_PIN_NUMBER;
            else if (!PioUtils.isValidOutput(mOutput)) return KonashiErrorType.INVALID_OUTPUT_PARAM;
            else return KonashiErrorType.NO_ERROR;
        }
    }
}

package com.uxxu.konashi.lib.action;

import android.bluetooth.BluetoothGattService;

import com.uxxu.konashi.lib.Konashi;
import com.uxxu.konashi.lib.KonashiErrorType;
import com.uxxu.konashi.lib.KonashiUUID;
import com.uxxu.konashi.lib.util.PioUtils;

import java.util.UUID;

import info.izumin.android.bletia.BletiaErrorType;

/**
 * Created by izumin on 9/16/15.
 */
public class PioDigitalWriteAction extends KonashiWriteCharacteristicAction {

    private static final UUID UUID = KonashiUUID.PIO_OUTPUT_UUID;

    private int mPin;
    private int mOutput;
    private int mOutputs;

    private final boolean mIsForAll;

    public PioDigitalWriteAction(BluetoothGattService service, int outputs) {
        super(service, UUID);
        mIsForAll = true;
        mOutputs = outputs;
    }

    public PioDigitalWriteAction(BluetoothGattService service, int pin, int newOutput, int currentOutputs) {
        super(service, UUID);
        mIsForAll = false;
        mPin = pin;
        mOutput = newOutput;
        mOutputs = currentOutputs;
    }

    @Override
    protected void setValue() {
        if (!mIsForAll) {
            if (mOutput == Konashi.OUTPUT) {
                mOutputs |= (0x01 << mPin);
            } else {
                mOutputs &= (~(0x01 << mPin) & 0xff);
            }
        }
        getCharacteristic().setValue(new byte[]{(byte) mOutputs});
    }

    @Override
    protected BletiaErrorType validate() {
        if (mIsForAll) {
            return PioUtils.isValidOutputs(mOutputs) ? KonashiErrorType.NO_ERROR : KonashiErrorType.INVALID_PIN_NUMBER;
        } else {
            if (!PioUtils.isValidPin(mPin)) return KonashiErrorType.INVALID_PIN_NUMBER;
            else if (!PioUtils.isValidOutput(mOutput)) return KonashiErrorType.INVALID_OUTPUT_PARAM;
            else return KonashiErrorType.NO_ERROR;
        }
    }
}

Fix PioDigitalWriteAction