/* * 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.raspberrypi; import android.util.Log; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public final class RaspberryPiService { private static final String TAG = RaspberryPiService.class.getSimpleName(); public RPiSocketConnection connection = null; private static RaspberryPiService instance; private enum GpioVersionType { SMALL_GPIO, BIG_GPIO, COMPUTE_MODULE } private Map<String, GpioVersionType> gpioVersionMap = new HashMap<>(); private Set<Integer> pinInterrupts = null; public static RaspberryPiService getInstance() { if (instance == null) { instance = new RaspberryPiService(); } return instance; } private RaspberryPiService() { initGpioVersionMap(); pinInterrupts = new HashSet<Integer>(); } public void addPinInterrupt(int pin) { pinInterrupts.add(pin); } public boolean connect(String host, int port) { AsyncRPiTaskRunner rpi; try { rpi = new AsyncRPiTaskRunner(); rpi.connect(host, port); connection = rpi.getConnection(); } catch (Exception e) { Log.e(TAG, "connecting to " + host + ":" + port + " failed" + e); return false; } if (rpi.getConnection().isConnected()) { return true; } return false; } public void disconnect() { if (connection != null) { try { connection.disconnect(); connection = null; } catch (IOException e) { Log.e(TAG, "Exception during disconnect: " + e); } } pinInterrupts.clear(); } public ArrayList<Integer> getGpioList(String revision) { GpioVersionType version = gpioVersionMap.get(revision); ArrayList<Integer> availableGPIOs = new ArrayList<>(); if (version == GpioVersionType.SMALL_GPIO) { availableGPIOs.add(3); availableGPIOs.add(5); availableGPIOs.add(7); availableGPIOs.add(8); availableGPIOs.add(10); availableGPIOs.add(11); availableGPIOs.add(12); availableGPIOs.add(13); availableGPIOs.add(15); availableGPIOs.add(16); availableGPIOs.add(18); availableGPIOs.add(19); availableGPIOs.add(21); availableGPIOs.add(22); availableGPIOs.add(23); availableGPIOs.add(24); availableGPIOs.add(26); } else if (version == GpioVersionType.BIG_GPIO) { availableGPIOs.add(3); availableGPIOs.add(5); availableGPIOs.add(7); availableGPIOs.add(8); availableGPIOs.add(10); availableGPIOs.add(11); availableGPIOs.add(12); availableGPIOs.add(13); availableGPIOs.add(15); availableGPIOs.add(16); availableGPIOs.add(18); availableGPIOs.add(19); availableGPIOs.add(21); availableGPIOs.add(22); availableGPIOs.add(23); availableGPIOs.add(24); availableGPIOs.add(26); availableGPIOs.add(29); availableGPIOs.add(31); availableGPIOs.add(32); availableGPIOs.add(33); availableGPIOs.add(35); availableGPIOs.add(36); availableGPIOs.add(37); availableGPIOs.add(38); availableGPIOs.add(40); } else { // legacy mode, try to support if we don't know the version availableGPIOs.add(3); availableGPIOs.add(5); availableGPIOs.add(7); availableGPIOs.add(8); availableGPIOs.add(10); availableGPIOs.add(11); availableGPIOs.add(12); availableGPIOs.add(13); availableGPIOs.add(15); availableGPIOs.add(16); availableGPIOs.add(18); availableGPIOs.add(19); availableGPIOs.add(21); availableGPIOs.add(22); availableGPIOs.add(23); availableGPIOs.add(24); availableGPIOs.add(26); } return availableGPIOs; } private void initGpioVersionMap() { gpioVersionMap.put("a01041", GpioVersionType.BIG_GPIO); gpioVersionMap.put("a21041", GpioVersionType.BIG_GPIO); gpioVersionMap.put("0013", GpioVersionType.BIG_GPIO); gpioVersionMap.put("0012", GpioVersionType.BIG_GPIO); gpioVersionMap.put("0011", GpioVersionType.COMPUTE_MODULE); gpioVersionMap.put("0010", GpioVersionType.BIG_GPIO); gpioVersionMap.put("000f", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("000e", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("000d", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("0009", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("0008", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("0007", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("0006", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("0005", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("0004", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("0003", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("0002", GpioVersionType.SMALL_GPIO); gpioVersionMap.put("Beta", GpioVersionType.SMALL_GPIO); } public boolean isValidPin(String revision, int pinNumber) { return getGpioList(revision).contains(pinNumber); } public Set<Integer> getPinInterrupts() { return pinInterrupts; } }