changeset 0:1e69eae27ed0

add code
author Dennis <dennis@denniscm.com>
date Fri, 25 Aug 2023 17:23:11 +0100
parents
children 3855fe446a41
files .gitignore include/README lib/README platformio.ini src/main.cpp test/README
diffstat 6 files changed, 224 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.gitignore	Fri Aug 25 17:23:11 2023 +0100
@@ -0,0 +1,3 @@
+.pio
+.clang_complete
+.ccls
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/README	Fri Aug 25 17:23:11 2023 +0100
@@ -0,0 +1,39 @@
+
+This directory is intended for project header files.
+
+A header file is a file containing C declarations and macro definitions
+to be shared between several project source files. You request the use of a
+header file in your project source file (C, C++, etc) located in `src` folder
+by including it, with the C preprocessing directive `#include'.
+
+```src/main.c
+
+#include "header.h"
+
+int main (void)
+{
+ ...
+}
+```
+
+Including a header file produces the same results as copying the header file
+into each source file that needs it. Such copying would be time-consuming
+and error-prone. With a header file, the related declarations appear
+in only one place. If they need to be changed, they can be changed in one
+place, and programs that include the header file will automatically use the
+new version when next recompiled. The header file eliminates the labor of
+finding and changing all the copies as well as the risk that a failure to
+find one copy will result in inconsistencies within a program.
+
+In C, the usual convention is to give header files names that end with `.h'.
+It is most portable to use only letters, digits, dashes, and underscores in
+header file names, and at most one dot.
+
+Read more about using header files in official GCC documentation:
+
+* Include Syntax
+* Include Operation
+* Once-Only Headers
+* Computed Includes
+
+https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/README	Fri Aug 25 17:23:11 2023 +0100
@@ -0,0 +1,46 @@
+
+This directory is intended for project specific (private) libraries.
+PlatformIO will compile them to static libraries and link into executable file.
+
+The source code of each library should be placed in a an own separate directory
+("lib/your_library_name/[here are source files]").
+
+For example, see a structure of the following two libraries `Foo` and `Bar`:
+
+|--lib
+|  |
+|  |--Bar
+|  |  |--docs
+|  |  |--examples
+|  |  |--src
+|  |     |- Bar.c
+|  |     |- Bar.h
+|  |  |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
+|  |
+|  |--Foo
+|  |  |- Foo.c
+|  |  |- Foo.h
+|  |
+|  |- README --> THIS FILE
+|
+|- platformio.ini
+|--src
+   |- main.c
+
+and a contents of `src/main.c`:
+```
+#include <Foo.h>
+#include <Bar.h>
+
+int main (void)
+{
+  ...
+}
+
+```
+
+PlatformIO Library Dependency Finder will find automatically dependent
+libraries scanning project source files.
+
+More information about PlatformIO Library Dependency Finder
+- https://docs.platformio.org/page/librarymanager/ldf.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/platformio.ini	Fri Aug 25 17:23:11 2023 +0100
@@ -0,0 +1,16 @@
+; PlatformIO Project Configuration File
+;
+;   Build options: build flags, source filter
+;   Upload options: custom upload port, speed and extra flags
+;   Library options: dependencies, extra library storages
+;   Advanced options: extra scripting
+;
+; Please visit documentation for the other options and examples
+; https://docs.platformio.org/page/projectconf.html
+
+[env:uno]
+platform = atmelavr
+board = uno
+framework = arduino
+lib_deps =
+	 arduino-libraries/LiquidCrystal@^1.0.7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main.cpp	Fri Aug 25 17:23:11 2023 +0100
@@ -0,0 +1,109 @@
+#include <Arduino.h>
+#include <LiquidCrystal.h>
+
+const int pinLogicMain = 8;
+const int pinLogicSecondary = 9;
+const int pinNextGate = 10;
+const int pinEnter = 11;
+const int pinLed = 12;
+
+int stateLogicMain = 0;
+int stateLogicSecondary = 0;
+int stateNextGate = 0;
+int stateEnter = 0;
+int stateLed = 0;
+
+int logicModeEnabled = 0;
+
+#define GATES_SIZE 7
+const char* gates[GATES_SIZE] = {"AND", "OR", "NOT", "NAND", "NOR", "XOR", "XNOR"};
+int gateSelected = -1;
+
+const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
+LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
+
+void setup()
+{
+	Serial.begin(9600);
+
+	pinMode(pinLogicMain, INPUT);
+	pinMode(pinLogicSecondary, INPUT);
+	pinMode(pinNextGate, INPUT);
+	pinMode(pinEnter, INPUT);
+	pinMode(pinLed, OUTPUT);
+	
+	lcd.begin(16, 2);
+	lcd.print("Select gate");
+}
+
+void ledControl(int enabled)
+{
+	if (enabled) {
+		digitalWrite(pinLed, HIGH);
+	} else {
+		digitalWrite(pinLed, LOW);
+	}
+}
+
+void loop()
+{
+	stateLogicMain = digitalRead(pinLogicMain);
+	stateLogicSecondary = digitalRead(pinLogicSecondary);
+	stateNextGate = digitalRead(pinNextGate);
+	stateEnter = digitalRead(pinEnter);
+	stateLed = digitalRead(pinLed);
+
+	if (stateNextGate == HIGH) {
+		logicModeEnabled = 0;
+		
+		if (gateSelected + 1 < GATES_SIZE) {
+			gateSelected++;
+		} else {
+			gateSelected = 0;
+		}
+		
+		lcd.clear();
+
+		char msg[16];
+		sprintf(msg, "%i -> %s", gateSelected, gates[gateSelected]);
+		lcd.setCursor(0, 0);
+		lcd.print(msg);
+		delay(500);
+	}
+
+	if (stateEnter == HIGH && logicModeEnabled == 0) {
+		logicModeEnabled = 1;
+	}
+
+	if (logicModeEnabled == 1) {
+		lcd.setCursor(0, 1);
+		lcd.print("Enabled");
+		lcd.setCursor(0, 0);
+
+		switch (gateSelected) {
+		case 0:
+			ledControl(stateLogicMain && stateLogicSecondary);
+			break;
+		case 1:
+			ledControl(stateLogicMain || stateLogicSecondary);
+			break;
+		case 2:
+			ledControl(!stateLogicMain);
+			break;
+		case 3:
+			ledControl(!(stateLogicMain && stateLogicSecondary));
+			break;
+		case 4:
+			ledControl(!(stateLogicMain || stateLogicSecondary));
+			break;
+		case 5:
+			ledControl(stateLogicMain != stateLogicSecondary);
+			break;
+		case 6:
+			ledControl(stateLogicMain == stateLogicSecondary);
+			break;
+		}
+	} else {
+		digitalWrite(pinLed, LOW);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/README	Fri Aug 25 17:23:11 2023 +0100
@@ -0,0 +1,11 @@
+
+This directory is intended for PlatformIO Test Runner and project tests.
+
+Unit Testing is a software testing method by which individual units of
+source code, sets of one or more MCU program modules together with associated
+control data, usage procedures, and operating procedures, are tested to
+determine whether they are fit for use. Unit testing finds problems early
+in the development cycle.
+
+More information about PlatformIO Unit Testing:
+- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html