/*
* Catroid: An on-device visual programming system for Android devices
* Copyright (C) 2010-2016 The Catrobat Team
* (<http://developer.catrobat.org/credits>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* An additional term exception under section 7 of the GNU Affero
* General Public License, version 3, is available at
* http://developer.catrobat.org/license_additional_term
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.catrobat.catroid.devices.arduino;
import android.util.Log;
import org.catrobat.catroid.utils.Utils;
import name.antonsmirnov.firmata.IFirmata;
import name.antonsmirnov.firmata.message.AnalogMessage;
import name.antonsmirnov.firmata.message.DigitalMessage;
import name.antonsmirnov.firmata.message.FirmwareVersionMessage;
import name.antonsmirnov.firmata.message.I2cReplyMessage;
import name.antonsmirnov.firmata.message.ProtocolVersionMessage;
import name.antonsmirnov.firmata.message.StringSysexMessage;
import name.antonsmirnov.firmata.message.SysexMessage;
public class ArduinoListener implements IFirmata.Listener {
private static final String TAG = ArduinoListener.class.getSimpleName();
private int analogPin0 = 0;
private int analogPin1 = 0;
private int analogPin2 = 0;
private int analogPin3 = 0;
private int analogPin4 = 0;
private int analogPin5 = 0;
private int[] portValue = new int[(ArduinoImpl.NUMBER_OF_DIGITAL_PINS + ArduinoImpl.PINS_IN_A_PORT - 1) / ArduinoImpl.PINS_IN_A_PORT];
@Override
public void onAnalogMessageReceived(AnalogMessage message) {
if (message.getValue() > 1023 || message.getValue() < 0) {
return;
}
Log.d(TAG, String.format("Received Analog Message: %d | Value: %d", message.getPin(), message.getValue()));
switch (message.getPin()) {
case ArduinoImpl.PIN_ANALOG_0:
analogPin0 = message.getValue();
break;
case ArduinoImpl.PIN_ANALOG_1:
analogPin1 = message.getValue();
break;
case ArduinoImpl.PIN_ANALOG_2:
analogPin2 = message.getValue();
break;
case ArduinoImpl.PIN_ANALOG_3:
analogPin3 = message.getValue();
break;
case ArduinoImpl.PIN_ANALOG_4:
analogPin4 = message.getValue();
break;
case ArduinoImpl.PIN_ANALOG_5:
analogPin5 = message.getValue();
break;
}
}
@Override
public void onDigitalMessageReceived(DigitalMessage message) {
if (message.getValue() > 64 || message.getValue() < 0) {
return;
}
Log.d(TAG, String.format("Received Digital Message: port: %d, value: %d",
message.getPort(), message.getValue()));
portValue[message.getPort()] = message.getValue();
for (int i = 0; i < ArduinoImpl.NUMBER_OF_DIGITAL_PINS; i++) {
Log.d(TAG, String.format("Digital Pin %d Value: %d", i, getDigitalPinValue(i)));
}
}
@Override
public void onFirmwareVersionMessageReceived(FirmwareVersionMessage message) {
Log.d(TAG, String.format("Received Firmware Version Message: Name: %s, Version Major: %d, Minor: %d",
message.getName(), message.getMajor(), message.getMinor()));
}
@Override
public void onProtocolVersionMessageReceived(ProtocolVersionMessage message) {
Log.d(TAG, String.format("Received Protocol Version Message: Version Major: %d, Minor: %d",
message.getMajor(), message.getMinor()));
}
@Override
public void onSysexMessageReceived(SysexMessage message) {
Log.d(TAG, "Sysex Message received: " + message.getCommand());
}
@Override
public void onStringSysexMessageReceived(StringSysexMessage message) {
Log.d(TAG, "String Sysex Message received: " + message.getCommand());
}
@Override
public void onI2cMessageReceived(I2cReplyMessage message) {
Log.d(TAG, "I2C Message received: " + message.getCommand());
}
@Override
public void onUnknownByteReceived(int byteValue) {
//Log.d(TAG, "Unkown Byte received. Byte value: " + byteValue);
}
public int getAnalogPin0() {
return analogPin0;
}
public int getAnalogPin1() {
return analogPin1;
}
public int getAnalogPin2() {
return analogPin2;
}
public int getAnalogPin3() {
return analogPin3;
}
public int getAnalogPin4() {
return analogPin4;
}
public int getAnalogPin5() {
return analogPin5;
}
public int getDigitalPinValue(int pin) {
if (ArduinoImpl.isValidPin(pin)) {
int port = ArduinoImpl.getPortFromPin(pin);
int index = ArduinoImpl.getIndexOfPinOnPort(pin);
return Utils.getBit(portValue[port], index);
}
return 0;
}
public void setDigitalPinValue(int pin, int value) {
if (ArduinoImpl.isValidPin(pin)) {
int port = ArduinoImpl.getPortFromPin(pin);
int index = ArduinoImpl.getIndexOfPinOnPort(pin);
this.portValue[port] = Utils.setBit(portValue[port], index, value);
}
}
public int getPortValue(int port) {
return portValue[port];
}
}