From e868241db1a7ba533214f21e66d31884d0ae311e Mon Sep 17 00:00:00 2001 From: GDV0 Date: Thu, 16 Jan 2014 08:00:08 +0100 Subject: [PATCH] Library configuration file management (issue #1734) When an application uses a library supporting configuration: - the library configuration file is stored in the sketch folder as a project ressource. - a sketch tab is created in Arduino IDE to edit the library configuration file This commit manages following actions: - create configuration file tab when opening a sketch which uses a Library configuration file - copy the configuration file in the sketch folder and create a configuration file tab when importing a library which uses a library configuration file - add the library configuration file (from sketch) as include file when compiling the library only Added as an example, Morse library supporting configuration file --- app/src/processing/app/Sketch.java | 121 ++++++++- app/src/processing/app/SketchCode.java | 25 +- app/src/processing/app/debug/Compiler.java | 10 + .../MorseFast/Configuration/LibMorseConf.h | 22 ++ .../Morse/examples/MorseFast/MorseFast.ino | 18 ++ .../MorseSlow/Configuration/LibMorseConf.h | 22 ++ .../Morse/examples/MorseSlow/MorseSlow.ino | 17 ++ libraries/Morse/keywords.txt | 67 +++++ libraries/Morse/library.properties | 10 + libraries/Morse/src/Morse.cpp | 229 ++++++++++++++++++ libraries/Morse/src/Morse.h | 62 +++++ .../Morse/src/configuration/LibMorseConf.h | 22 ++ 12 files changed, 613 insertions(+), 12 deletions(-) create mode 100644 libraries/Morse/examples/MorseFast/Configuration/LibMorseConf.h create mode 100644 libraries/Morse/examples/MorseFast/MorseFast.ino create mode 100644 libraries/Morse/examples/MorseSlow/Configuration/LibMorseConf.h create mode 100644 libraries/Morse/examples/MorseSlow/MorseSlow.ino create mode 100644 libraries/Morse/keywords.txt create mode 100644 libraries/Morse/library.properties create mode 100644 libraries/Morse/src/Morse.cpp create mode 100644 libraries/Morse/src/Morse.h create mode 100644 libraries/Morse/src/configuration/LibMorseConf.h diff --git a/app/src/processing/app/Sketch.java b/app/src/processing/app/Sketch.java index 5d66e18a89e..8f0f110f4d5 100644 --- a/app/src/processing/app/Sketch.java +++ b/app/src/processing/app/Sketch.java @@ -73,7 +73,10 @@ public class Sketch { /** code folder location for this sketch (may not exist yet) */ private File codeFolder; - + + /** configuration folder location for this sketch (may not exist yet) */ + private File configFolder; + private SketchCode current; private int currentIndex; /** @@ -160,15 +163,24 @@ public Sketch(Editor editor, String path) throws IOException { protected void load() throws IOException { codeFolder = new File(folder, "code"); dataFolder = new File(folder, "data"); + configFolder = new File(folder, "configuration"); // get list of files in the sketch folder String list[] = folder.list(); + // get list of files in the library configuration folder + String list1[] = configFolder.list(); // reset these because load() may be called after an // external editor event. (fix for 0099) codeCount = 0; - - code = new SketchCode[list.length]; + + // Add files from library configuration folder if exists + if (configFolder.exists()) { + code = new SketchCode[list.length+list1.length]; + } + else { + code = new SketchCode[list.length]; + } String[] extensions = getExtensions(); @@ -203,6 +215,38 @@ protected void load() throws IOException { if (codeCount == 0) throw new IOException(_("No valid code files found")); + //Check library configuration folder to create tabs for library configuration files + if (configFolder.exists()) { + for (String filename : list1) { + // Ignoring the dot prefix files is especially important to avoid files + // with the ._ prefix on Mac OS X. (You'll see this with Mac files on + // non-HFS drives, i.e. a thumb drive formatted FAT32.) + if (filename.startsWith(".")) continue; + + // Don't let some wacko name a directory blah.pde or bling.java. + if (new File(configFolder, filename).isDirectory()) continue; + + // figure out the name without any extension + String base = filename; + // now strip off the .pde and .java extensions + for (String extension : extensions) { + if (base.toLowerCase().endsWith("." + extension)) { + base = base.substring(0, base.length() - (extension.length() + 1)); + + // Don't allow people to use files with invalid names, since on load, + // it would be otherwise possible to sneak in nasty filenames. [0116] + if (Sketch.isSanitaryName(base)) { + code[codeCount++] = new SketchCode(new File(configFolder, filename), extension); + // Don't forget to declare it as configuration file + code[codeCount-1].setConfig(true); + } else { + editor.console.message(I18n.format("File name {0} is invalid: ignored", filename), true, false); + } + } + } + } + } + // Remove any code that wasn't proper code = (SketchCode[]) PApplet.subset(code, 0, codeCount); @@ -878,7 +922,14 @@ protected boolean saveAs() throws IOException { // now make a fresh copy of the folder newFolder.mkdirs(); - + + // If exists, make a copy of the configuration folder + File newConfigFolder= new File(newFolder, "configuration"); + if (configFolder.exists()) { + Base.copyDir(configFolder, newConfigFolder); + } + + // grab the contents of the current tab before saving // first get the contents of the editor text area if (current.isModified()) { @@ -887,10 +938,17 @@ protected boolean saveAs() throws IOException { // save the other tabs to their new location for (int i = 1; i < codeCount; i++) { - File newFile = new File(newFolder, code[i].getFileName()); + // Library configuration file is not saved in the sketch folder but in the configuration folder + File newFile; + if (code[i].isConfig() && configFolder.exists()) { + newFile = new File(newConfigFolder, code[i].getFileName()); + } + else { + newFile = new File(newFolder, code[i].getFileName()); + } code[i].saveAs(newFile); } - + // re-copy the data folder (this may take a while.. add progress bar?) if (dataFolder.exists()) { File newDataFolder = new File(newFolder, "data"); @@ -1117,12 +1175,28 @@ public void importLibrary(File jarPath) throws IOException { String list[] = Base.headerListFromIncludePath(jarPath); + // If exists, make a copy of the library configuration file in the sketch folder + File LibConfigFolder = new File(jarPath, "configuration"); + if (LibConfigFolder.exists()) { + System.out.println("Library configuration files found" ); + File NewLibConfigFolder = (new File(folder,"configuration")); + Base.copyDir(LibConfigFolder, NewLibConfigFolder); + // Update editor tabs + load(); + // Need to switch between tabs to refresh the current content + if (code[1].fileExists()) { + setCurrentCode(1); + } + setCurrentCode(0); + } + // import statements into the main sketch file (code[0]) // if the current code is a .java file, insert into current //if (current.flavor == PDE) { if (hasDefaultExtension(current)) { setCurrentCode(0); } + // could also scan the text in the file to see if each import // statement is already in there, but if the user has the import // commented out, then this will be a problem. @@ -1136,6 +1210,7 @@ public void importLibrary(File jarPath) throws IOException { buffer.append(editor.getText()); editor.setText(buffer.toString()); editor.setSelection(0, 0); // scroll to start + setModified(true); } @@ -1405,7 +1480,20 @@ public void preprocess(String buildPath, PdePreprocessor preprocessor) throws Ru // shtuff so that unicode bunk is properly handled String filename = sc.getFileName(); //code[i].name + ".java"; try { - Base.saveFile(sc.getProgram(), new File(buildPath, filename)); + // Is it a Library configuration file ? + if (sc.isConfig()) { + File TempLibConfigFolder = new File(buildPath, "configuration"); + // Create the Library Configuration folder if it doesn't exist + if(!TempLibConfigFolder.exists()){ + TempLibConfigFolder.mkdir(); + } + // Copy file in configuration folder + Base.saveFile(sc.getProgram(), new File(TempLibConfigFolder.getAbsolutePath(), filename)); + } + else { + // Copy file in build folder + Base.saveFile(sc.getProgram(), new File(buildPath, filename)); + } } catch (IOException e) { e.printStackTrace(); throw new RunnerException(I18n.format(_("Problem moving {0} to the build folder"), filename)); @@ -1962,6 +2050,25 @@ public File prepareCodeFolder() { return codeFolder; } + /** + * Returns the location of the sketch's configuration folder. (It may not exist yet.) + */ + public File getConfigFolder() { + return configFolder; + } + + + /** + * Create the config folder if it does not exist already. As a convenience, + * it also returns the config folder, since it's likely about to be used. + */ + public File prepareConfigFolder() { + if (!configFolder.exists()) { + configFolder.mkdirs(); + } + return configFolder; + } + public String getClassPath() { return classPath; diff --git a/app/src/processing/app/SketchCode.java b/app/src/processing/app/SketchCode.java index 37e63ed717b..6a9361b31ae 100644 --- a/app/src/processing/app/SketchCode.java +++ b/app/src/processing/app/SketchCode.java @@ -63,6 +63,7 @@ public class SketchCode { private int scrollPosition; private boolean modified; + private boolean config = false; // This attribute allows to differentiate Library configuration files (if true) from other files ( if false) /** name of .java file after preproc */ // private String preprocName; @@ -126,11 +127,15 @@ public boolean accept(File pathname) { protected boolean renameTo(File what, String ext) { - boolean success = file.renameTo(what); - if (success) { - file = what; - extension = ext; - makePrettyName(); + boolean success = false; + // rename is not allowed for Library configuration files + if (!config) { + success = file.renameTo(what); + if (success) { + file = what; + extension = ext; + makePrettyName(); + } } return success; } @@ -186,6 +191,16 @@ public boolean isModified() { } + public void setConfig(boolean _config) { + this.config = _config; + } + + + public boolean isConfig() { + return config; + } + + // public void setPreprocName(String preprocName) { // this.preprocName = preprocName; // } diff --git a/app/src/processing/app/debug/Compiler.java b/app/src/processing/app/debug/Compiler.java index ae3f7e763cc..5d9528cbc0b 100644 --- a/app/src/processing/app/debug/Compiler.java +++ b/app/src/processing/app/debug/Compiler.java @@ -633,6 +633,11 @@ private void compileLibrary(Library lib, List includeFolders) throws RunnerException { File libFolder = lib.getSrcFolder(); File libBuildFolder = prefs.getFile(("build.path"), lib.getName()); + // Manage library configuration files + File libConfigFolder = prefs.getFile(("build.path"), "configuration"); + if (libConfigFolder.exists()) { + includeFolders.add(libConfigFolder); + } if (lib.useRecursion()) { // libBuildFolder == {build.path}/LibName @@ -654,6 +659,11 @@ private void compileLibrary(Library lib, List includeFolders) // other libraries should not see this library's utility/ folder includeFolders.remove(utilityFolder); } + // other libraries should not see this library configuration folder + if (libConfigFolder.exists()) { + includeFolders.remove(libConfigFolder); + } + } private void recursiveCompileFilesInFolder(File srcBuildFolder, File srcFolder, List includeFolders) throws RunnerException { diff --git a/libraries/Morse/examples/MorseFast/Configuration/LibMorseConf.h b/libraries/Morse/examples/MorseFast/Configuration/LibMorseConf.h new file mode 100644 index 00000000000..8112f72a0f3 --- /dev/null +++ b/libraries/Morse/examples/MorseFast/Configuration/LibMorseConf.h @@ -0,0 +1,22 @@ +/* + LibMorseConf.h - Morse library configuration file. + Created by Gilles De Vos, December 10, 2013. + Released into the public domain. +*/ + +#ifndef LIBMORSECONF_H +#define LIBMORSECONF_H + + +#define LIB_MORSE_UNIT 100 //!< Time duration (ms) of elementary Morse code + +// International Morse code elements +#define LIB_MORSE_DOT_DURATION LIB_MORSE_UNIT //!< Time duration (ms) of a dot +#define LIB_MORSE_DASH_DURATION 3*LIB_MORSE_UNIT //!< Time duration (ms) of a dash +#define LIB_MORSE_INTR_CHAR_GAP LIB_MORSE_UNIT //!< Time duration (ms) between the dots and dashes within a character +#define LIB_MORSE_SHORT_GAP 3*LIB_MORSE_UNIT //!< Time duration (ms) between characters +#define LIB_MORSE_MEDIUM_GAP 7*LIB_MORSE_UNIT //!< Time duration (ms) between words + +#define LIB_MORSE_ALPHABET_AVAILABLE //!< Encoded characters are available + +#endif //LIBMORSECONF_H \ No newline at end of file diff --git a/libraries/Morse/examples/MorseFast/MorseFast.ino b/libraries/Morse/examples/MorseFast/MorseFast.ino new file mode 100644 index 00000000000..5a0507be13e --- /dev/null +++ b/libraries/Morse/examples/MorseFast/MorseFast.ino @@ -0,0 +1,18 @@ + +#include + + Morse morse(13); + +void setup() +{ +} + +void loop() +{ + morse._S(); + morse._O(); + morse._S(); + morse.endword(); + +} + diff --git a/libraries/Morse/examples/MorseSlow/Configuration/LibMorseConf.h b/libraries/Morse/examples/MorseSlow/Configuration/LibMorseConf.h new file mode 100644 index 00000000000..788a15eba15 --- /dev/null +++ b/libraries/Morse/examples/MorseSlow/Configuration/LibMorseConf.h @@ -0,0 +1,22 @@ +/* + LibMorseConf.h - Morse library configuration file. + Created by Gilles De Vos, December 10, 2013. + Released into the public domain. +*/ + +#ifndef LIBMORSECONF_H +#define LIBMORSECONF_H + + +#define LIB_MORSE_UNIT 250 //!< Time duration (ms) of elementary Morse code + +// International Morse code elements +#define LIB_MORSE_DOT_DURATION LIB_MORSE_UNIT //!< Time duration (ms) of a dot +#define LIB_MORSE_DASH_DURATION 3*LIB_MORSE_UNIT //!< Time duration (ms) of a dash +#define LIB_MORSE_INTR_CHAR_GAP LIB_MORSE_UNIT //!< Time duration (ms) between the dots and dashes within a character +#define LIB_MORSE_SHORT_GAP 3*LIB_MORSE_UNIT //!< Time duration (ms) between characters +#define LIB_MORSE_MEDIUM_GAP 7*LIB_MORSE_UNIT //!< Time duration (ms) between words + +//#define LIB_MORSE_ALPHABET_AVAILABLE //!< Encoded characters are available + +#endif //LIBMORSECONF_H \ No newline at end of file diff --git a/libraries/Morse/examples/MorseSlow/MorseSlow.ino b/libraries/Morse/examples/MorseSlow/MorseSlow.ino new file mode 100644 index 00000000000..646b2b55515 --- /dev/null +++ b/libraries/Morse/examples/MorseSlow/MorseSlow.ino @@ -0,0 +1,17 @@ + +#include + + Morse morse(13); + +void setup() +{ +} + +void loop() +{ + morse.dot(); morse.dot(); morse.dot(); morse.endchar(); + morse.dash(); morse.dash(); morse.dash(); morse.endchar(); + morse.dot(); morse.dot(); morse.dot(); morse.endchar(); + morse.endword(); +} + diff --git a/libraries/Morse/keywords.txt b/libraries/Morse/keywords.txt new file mode 100644 index 00000000000..bbf1be921e2 --- /dev/null +++ b/libraries/Morse/keywords.txt @@ -0,0 +1,67 @@ +####################################### +# Syntax Coloring Map For Morse +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Morse KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +dot KEYWORD2 +dash KEYWORD2 +endchar KEYWORD2 +endword KEYWORD2 +_A KEYWORD2 +_B KEYWORD2 +_C KEYWORD2 +_D KEYWORD2 +_E KEYWORD2 +_F KEYWORD2 +_G KEYWORD2 +_H KEYWORD2 +_I KEYWORD2 +_J KEYWORD2 +_K KEYWORD2 +_L KEYWORD2 +_M KEYWORD2 +_N KEYWORD2 +_O KEYWORD2 +_P KEYWORD2 +_Q KEYWORD2 +_R KEYWORD2 +_S KEYWORD2 +_T KEYWORD2 +_U KEYWORD2 +_V KEYWORD2 +_W KEYWORD2 +_X KEYWORD2 +_Y KEYWORD2 +_Z KEYWORD2 +_0 KEYWORD2 +_1 KEYWORD2 +_2 KEYWORD2 +_3 KEYWORD2 +_4 KEYWORD2 +_5 KEYWORD2 +_6 KEYWORD2 +_7 KEYWORD2 +_8 KEYWORD2 +_9 KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### +LIB_MORSE_UNIT LITERAL1 +LIB_MORSE_DOT_DURATION LITERAL1 +LIB_MORSE_DASH_DURATION LITERAL1 +LIB_MORSE_INTR_CHAR_GAP LITERAL1 +LIB_MORSE_SHORT_GAP LITERAL1 +LIB_MORSE_MEDIUM_GAP LITERAL1 +LIB_MORSE_ALPHABET_AVAILABLE LITERAL1 + + diff --git a/libraries/Morse/library.properties b/libraries/Morse/library.properties new file mode 100644 index 00000000000..d01f473cb7c --- /dev/null +++ b/libraries/Morse/library.properties @@ -0,0 +1,10 @@ +name=Morse +author= +email= +sentence=This Library allows a sketch to generate Morse characters +paragraph=This library is given as an exemple as it uses a Library configuration file +url=http://arduino.cc/en/Reference/SD +architectures=* +version=1.0 +dependencies= +core-dependencies=arduino (>=1.5.0) diff --git a/libraries/Morse/src/Morse.cpp b/libraries/Morse/src/Morse.cpp new file mode 100644 index 00000000000..7ed13424e1e --- /dev/null +++ b/libraries/Morse/src/Morse.cpp @@ -0,0 +1,229 @@ + +/* + Morse.cpp - Library for flashing Morse code. + Created by David A. Mellis, November 2, 2007. + Modified by Gilles De Vos, December 10, 2013. + Released into the public domain. +*/ + +#include "Arduino.h" +#include "Morse.h" +#include "LibMorseConf.h" + +Morse::Morse(int pin) +{ + pinMode(pin, OUTPUT); + _pin = pin; +} + +void Morse::dot() +{ + digitalWrite(_pin, HIGH); + delay(LIB_MORSE_DOT_DURATION); + digitalWrite(_pin, LOW); + delay(LIB_MORSE_UNIT); +} + +void Morse::dash() +{ + digitalWrite(_pin, HIGH); + delay(LIB_MORSE_DASH_DURATION); + digitalWrite(_pin, LOW); + delay(LIB_MORSE_UNIT); +} + +void Morse::endchar() +{ + if ((LIB_MORSE_SHORT_GAP - LIB_MORSE_UNIT) > 0) + delay(LIB_MORSE_SHORT_GAP - LIB_MORSE_UNIT); +} + +void Morse::endword() +{ + if ((LIB_MORSE_MEDIUM_GAP - LIB_MORSE_UNIT) > 0) + delay(LIB_MORSE_MEDIUM_GAP - LIB_MORSE_UNIT); + +} + +#ifdef LIB_MORSE_ALPHABET_AVAILABLE +void Morse::_A() +{ + dot(); dash(); endchar(); +} + +void Morse::_B() +{ + dash(); dot(); dot(); dot(); endchar(); +} + +void Morse::_C() +{ + dash(); dot(); dash(); dot(); endchar(); +} + +void Morse::_D() +{ + dash(); dot(); dot(); endchar(); +} + +void Morse::_E() +{ + dot(); endchar(); +} + +void Morse::_F() +{ + dot(); dot(); dash(); dot(); endchar(); +} + +void Morse::_G() +{ + dash(); dash(); dot(); endchar(); +} + +void Morse::_H() +{ + dot(); dot(); dot(); dot(); endchar(); +} + +void Morse::_I() +{ + dot(); dot(); endchar(); +} + +void Morse::_J() +{ + dot(); dash(); dash(); dash(); endchar(); +} + +void Morse::_K() +{ + dash(); dot(); dash(); endchar(); +} + +void Morse::_L() +{ + dot(); dash(); dot(); dot(); endchar(); +} + +void Morse::_M() +{ + dash(); dash(); endchar(); +} + +void Morse::_N() +{ + dash(); dot(); endchar(); +} + +void Morse::_O() +{ + dash(); dash(); dash(); endchar(); +} + +void Morse::_P() +{ + dot(); dash(); dash(); dot(); endchar(); +} + +void Morse::_Q() +{ + dash(); dash(); dot(); dash(); endchar(); +} + +void Morse::_R() +{ + dot(); dash(); dot(); endchar(); +} + +void Morse::_S() +{ + dot(); dot(); dot(); endchar(); +} + +void Morse::_T() +{ + dash(); endchar(); +} + +void Morse::_U() +{ + dot(); dot(); dash(); dot(); endchar(); +} + +void Morse::_V() +{ + dot(); dot(); dot(); dash(); endchar(); +} + +void Morse::_W() +{ + dot(); dash(); dash(); endchar(); +} + +void Morse::_X() +{ + dash(); dot(); dot(); dash(); endchar(); +} + +void Morse::_Y() +{ + dash(); dot(); dash(); dash(); endchar(); +} + +void Morse::_Z() +{ + dash(); dash(); dot(); dot(); endchar(); +} + +void Morse::_1() +{ + dot(); dash(); dash(); dash(); dash(); endchar(); +} + +void Morse::_2() +{ + dot(); dot(); dash(); dash(); dash(); endchar(); +} + +void Morse::_3() +{ + dot(); dot(); dot(); dash(); dash(); endchar(); +} + +void Morse::_4() +{ + dot(); dot(); dot(); dot(); dash(); endchar(); +} + +void Morse::_5() +{ + dot(); dot(); dot(); dot(); dot(); endchar(); +} + +void Morse::_6() +{ + dash(); dot(); dot(); dot(); dot(); endchar(); +} + +void Morse::_7() +{ + dash(); dash(); dot(); dot(); dot(); endchar(); +} + +void Morse::_8() +{ + dash(); dash(); dash(); dot(); dot(); endchar(); +} + +void Morse::_9() +{ + dash(); dash(); dash(); dash(); dot(); endchar(); +} + +void Morse::_0() +{ + dash(); dash(); dash(); dash(); dash(); endchar(); +} + +#endif diff --git a/libraries/Morse/src/Morse.h b/libraries/Morse/src/Morse.h new file mode 100644 index 00000000000..1628d6c3841 --- /dev/null +++ b/libraries/Morse/src/Morse.h @@ -0,0 +1,62 @@ +/* + Morse.h - Library for flashing Morse code. + Created by David A. Mellis, November 2, 2007. + Modified by Gilles De Vos December 10, 2013. + Released into the public domain. +*/ +#ifndef Morse_h +#define Morse_h + +#include "Arduino.h" + +class Morse +{ + public: + Morse(int pin); + void dot(); + void dash(); + void endchar(); + void endword(); +//#ifdef LIB_MORSE_CHARACTERS_AVAILABLE + void _A(); + void _B(); + void _C(); + void _D(); + void _E(); + void _F(); + void _G(); + void _H(); + void _I(); + void _J(); + void _K(); + void _L(); + void _M(); + void _N(); + void _O(); + void _P(); + void _Q(); + void _R(); + void _S(); + void _T(); + void _U(); + void _V(); + void _W(); + void _X(); + void _Y(); + void _Z(); + void _1(); + void _2(); + void _3(); + void _4(); + void _5(); + void _6(); + void _7(); + void _8(); + void _9(); + void _0(); +//#endif + private: + int _pin; +}; + +#endif \ No newline at end of file diff --git a/libraries/Morse/src/configuration/LibMorseConf.h b/libraries/Morse/src/configuration/LibMorseConf.h new file mode 100644 index 00000000000..3a09b964d20 --- /dev/null +++ b/libraries/Morse/src/configuration/LibMorseConf.h @@ -0,0 +1,22 @@ +/* + LibMorseConf.h - Morse library configuration file. + Created by Gilles De Vos, December 10, 2013. + Released into the public domain. +*/ + +#ifndef LIBMORSECONF_H +#define LIBMORSECONF_H + + +#define LIB_MORSE_UNIT 250 //!< Time duration (ms) of elementary Morse code + +// International Morse code elements +#define LIB_MORSE_DOT_DURATION LIB_MORSE_UNIT //!< Time duration (ms) of a dot +#define LIB_MORSE_DASH_DURATION 3*LIB_MORSE_UNIT //!< Time duration (ms) of a dash +#define LIB_MORSE_INTR_CHAR_GAP LIB_MORSE_UNIT //!< Time duration (ms) between the dots and dashes within a character +#define LIB_MORSE_SHORT_GAP 3*LIB_MORSE_UNIT //!< Time duration (ms) between characters +#define LIB_MORSE_MEDIUM_GAP 7*LIB_MORSE_UNIT //!< Time duration (ms) between words + +#define LIB_MORSE_ALPHABET_AVAILABLE //!< Encoded characters are available + +#endif //LIBMORSECONF_H \ No newline at end of file