The [[https://www.bluej.org/raspberrypi/led.html|LED Tutorial]] is where I started, and I had to tweak the code so that I didn't get a **GpioPinExistsException.** I added a ''finalize()'' method
=====LED class=====
I am using ''RaspiPin.GPIO_25'' since chose to wire my LED to physical pin 37, aka ''BCM GPIO 26''\\
import com.pi4j.io.gpio.*;
import com.pi4j.io.gpio.event.*;
/**
* Write a description of class LED here.
* @author Ian Utting @author Fabio Heday
* Chris Thiel added the finalize() method to aviod GpioPinExistsException
* @version 10 Aug 18
*/
public class LED implements GpioPinListenerDigital
{
/* The LED gpio*/
private GpioPinDigitalOutput ledPin;
private GpioController gpio;
/**
* Constructor for objects of class LED
*/
public LED()
{
//GpioUtil.enableNonPrivilegedAccess();
gpio = GpioFactory.getInstance();
ledPin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_25, "LED", PinState.LOW);
}
protected void finalize(){
gpio.unprovisionPin(ledPin);
}
/**
* Flash the LED for a given amount of time @param ms the time to flash the LED in milliseconds
*/
public void flash(int ms)
{
ledPin.high();
try {
Thread.sleep(ms);
}
catch (InterruptedException e) {
}
ledPin.low();
}
/**
* Turns on the LED
*/
public void on()
{
ledPin.high();
}
/**
* Turns off the LED
*/
public void off()
{
ledPin.low();
}
/**
* toggle LED state
*/
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event)
{
ledPin.toggle();
}
}
=====LEDTester Class=====
/**
* This class tests LED by flashing some morse code. 2014 verion by
* @author Ian Utting
* @author Fabio Heday
*
* Chris Thiel added the finalize() method to aviod GpioPinExistsException
* @version 10 Aug 18
*/
public class LEDTester
{
public LED pin1;
//unit of time, in milliseconds
private final static int UNIT = 200;
public static void main(String [] args) {
LEDTester lt = new LEDTester();
String s = "SOS SOS SOS";
//
if ( args.length > 0 && args[0] != null && !args[0].equals ("") )
s = args[0];
lt.flashMorse(s);
lt.finalize();
}
/*
* create a new LED instance
*/
public LEDTester() {
this(new LED());
}
/*
* Creates a LED instance based on a LED object
*/
public LEDTester(LED p) {
pin1 = p;
}
/*
* Flashes the LED 10 times
*/
public void flash10Times() {
for(int i = 0; i < 10; i++) {
pin1.flash(200);
try { Thread.sleep (200); } catch (InterruptedException e) {}
}
}
/*
* Sends the morse code using the LED.
*/
public void flashMorse(String msg) {
char [] morse = StringToMorse.translate(msg).toCharArray();
// . = 1, - = 3, intra-char = 1, inter-char = 3, space = 7.",
for (char atom : morse) {
if (atom == '.') {
pin1.flash(UNIT);
} else if (atom == '-') {
pin1.flash(3*UNIT);
} else if (atom == '/') { // inter-symbol gap
sleep (1); // plus one leading and one trailing == 3
} else {
// must be a space
sleep (5); // plus one leading and one trailing == 7
}
sleep (1); // common gap
}
}
/*
* Wait units times the defined unit of time
*/
private void sleep(int units) {
try {
Thread.sleep(units*UNIT);
} catch (InterruptedException e)
{
}
}
protected void finalize(){
pin1.finalize();
}
}
=====String to Morse class=====
This is unchanged from the original
import java.util.*;
import static java.lang.Character.*;
/**
* Translate a String into Morse code.
*
* Maps lower case letters to upper case.
* Returned string contains the Morse equivalent of the parameter,
* with codons sperated by slashes, and spaces represented by spaces..
*
* @author Ian Utting
* @version 1.0
*/
public class StringToMorse
{
private static final Map code = new HashMap<>();
static {
// Upper case letters
/* A */ code.put('A', ".-");
/* B */ code.put('B', "-...");
/* C */ code.put('C', "-.-.");
/* D */ code.put('D', "-..");
/* E */ code.put('E', ".");
/* F */ code.put('F', "..-.");
/* G */ code.put('G', "--.");
/* H */ code.put('H', "....");
/* I */ code.put('I', "..");
/* J */ code.put('J', ".---");
/* K */ code.put('K', "-.-");
/* L */ code.put('L', ".-..");
/* M */ code.put('M', "--");
/* N */ code.put('N', "-.");
/* O */ code.put('O', "---");
/* P */ code.put('P', ".--.");
/* Q */ code.put('Q', "--.-");
/* R */ code.put('R', ".-.");
/* S */ code.put('S', "...");
/* T */ code.put('T', "-");
/* U */ code.put('U', "..-");
/* V */ code.put('V', "...-");
/* W */ code.put('W', ".--");
/* X */ code.put('X', "-..-");
/* Y */ code.put('Y', "-.--");
/* Z */ code.put('Z', "--..");
// Lower case letters map to the same values as upper case
/* A */ code.put('a', ".-");
/* B */ code.put('b', "-...");
/* C */ code.put('c', "-.-.");
/* D */ code.put('d', "-..");
/* E */ code.put('e', ".");
/* F */ code.put('f', "..-.");
/* G */ code.put('g', "--.");
/* H */ code.put('h', "....");
/* I */ code.put('i', "..");
/* J */ code.put('j', ".---");
/* K */ code.put('k', "-.-");
/* L */ code.put('l', ".-..");
/* M */ code.put('m', "--");
/* N */ code.put('n', "-.");
/* O */ code.put('o', "---");
/* P */ code.put('p', ".--.");
/* Q */ code.put('q', "--.-");
/* R */ code.put('r', ".-.");
/* S */ code.put('s', "...");
/* T */ code.put('t', "-");
/* U */ code.put('u', "..-");
/* V */ code.put('v', "...-");
/* W */ code.put('w', ".--");
/* X */ code.put('x', "-..-");
/* Y */ code.put('y', "-.--");
/* Z */ code.put('z', "--..");
// Digits
/* 0 */ code.put('0', "-----");
/* 1 */ code.put('1', ".----");
/* 2 */ code.put('2', "..---");
/* 3 */ code.put('3', "...--");
/* 4 */ code.put('4', "....-");
/* 5 */ code.put('5', ".....");
/* 6 */ code.put('6', "-....");
/* 7 */ code.put('7', "--...");
/* 8 */ code.put('8', "---..");
/* 9 */ code.put('9', "----.");
// punctuation
/* . */ code.put('.', ".-.-.-");
/* , */ code.put(',', "--..--");
/* : */ code.put(':', "---...");
/* ? */ code.put('?', "..--..");
/* ' */ code.put('\'', ".----.");
/* - */ code.put('-', "-....-");
/* / */ code.put('/', "-..-.");
/* ( */ code.put('(', "-.--.-");
/* ) */ code.put(')', "-.--.-");
/* " */ code.put('"', ".-..-.");
/* @ */ code.put('@', ".--.-.");
/* = */ code.put('=', "-...-");
// Special code for a space character.
code.put(' ', " ");
}
/**
* Translate a string into its Morse code equivalent
*
* Spaces in message are encoded as spaces in the returned string. Codons are separated by slashes
*
* @param message The string to be translated
* @return The encoded string.
* @throws IllegalArgumentException if there is a character in message which is not codeable in Morse
*/
public static String translate(String message) {
String result = new String();
for(char c : message.toCharArray()) {
if (code.containsKey(c)) result = result + code.get(c) + "/";
else throw new IllegalArgumentException("Character " + c + "is not in Morse's code");
}
// trim the trailing slash
result = result.substring(0, result.length() - 1);
return result;
}
}