mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-09-19 16:46:11 -04:00
0.1.1 - first public version
This commit is contained in:
parent
f43a58a906
commit
3405ddd093
147
libraries/Troolean/Troolean.cpp
Normal file
147
libraries/Troolean/Troolean.cpp
Normal file
@ -0,0 +1,147 @@
|
||||
//
|
||||
// FILE: Troolean.cpp
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.1
|
||||
// PURPOSE: class for troolean math (true false unknown)
|
||||
// URL:
|
||||
//
|
||||
// HISTORY:
|
||||
// 0.1.0 initial version
|
||||
// 0.1.1 adjust (in)equality so that unknown == unknown
|
||||
// although there could be arguments that unknown != unknown
|
||||
// added isTrue(), isFalse(), isUnknown()
|
||||
// first public release
|
||||
//
|
||||
|
||||
#include "Troolean.h"
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
//
|
||||
// PUBLIC
|
||||
//
|
||||
Troolean::Troolean()
|
||||
{
|
||||
_value = -1;
|
||||
}
|
||||
|
||||
Troolean::Troolean(const int8_t val)
|
||||
{
|
||||
if (val == 0) _value = 0;
|
||||
else if (val == -1) _value = -1;
|
||||
else _value = 1;
|
||||
}
|
||||
|
||||
Troolean::Troolean(const Troolean &t)
|
||||
{
|
||||
_value = t._value;
|
||||
}
|
||||
|
||||
|
||||
// PRINTING
|
||||
size_t Troolean::printTo(Print& p) const
|
||||
{
|
||||
size_t n = 0;
|
||||
if (_value == 0) n += p.print("false");
|
||||
else if (_value == -1) n += p.print("unknown");
|
||||
else n += p.print("true");
|
||||
return n;
|
||||
};
|
||||
|
||||
// EQUALITIES
|
||||
// t == t
|
||||
// f == f
|
||||
// u == u
|
||||
bool Troolean::operator == (const Troolean &t)
|
||||
{
|
||||
return (_value == t._value);
|
||||
}
|
||||
|
||||
bool Troolean::operator == (const bool &b)
|
||||
{
|
||||
if (_value == 0 && !b) return true;
|
||||
if (_value == 1 && b) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Troolean::operator == (const int &i)
|
||||
{
|
||||
if (_value == 0 && i == 0) return true;
|
||||
if (_value == -1 && i == -1) return true;
|
||||
if (_value == 1 && i != 0 && i != -1) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Troolean::operator != (const Troolean &t)
|
||||
{
|
||||
return (_value != t._value);
|
||||
}
|
||||
|
||||
bool Troolean::operator != (const bool &b)
|
||||
{
|
||||
if (_value == 0 && !b) return false;
|
||||
if (_value == 1 && b) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Troolean::operator != (const int &i)
|
||||
{
|
||||
if (_value == 0 && i != 0) return true;
|
||||
if (_value == -1 && i != -1) return true;
|
||||
if (_value == 1 && (i == 0 || i == -1)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
Troolean::operator bool() const
|
||||
{
|
||||
if (_value == 1) return true;
|
||||
if (_value == 0) return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// NEGATE
|
||||
// t -> f
|
||||
// f -> t
|
||||
// u -> u
|
||||
Troolean Troolean::operator ! ()
|
||||
{
|
||||
if (_value == -1) return Troolean(-1); // random 0 1 :)
|
||||
if (_value == 1) return Troolean(0);
|
||||
return Troolean(1);
|
||||
}
|
||||
|
||||
// LOGICAL OPERATORS
|
||||
Troolean Troolean::operator && (const Troolean &t)
|
||||
{
|
||||
if (_value == 0 || t._value == 0) return Troolean(0);
|
||||
if (_value == 1 && t._value == 1) return Troolean(1);
|
||||
return Troolean(-1);
|
||||
}
|
||||
|
||||
Troolean Troolean::operator && (const bool &b)
|
||||
{
|
||||
if (_value == 0 || !b) return Troolean(0);
|
||||
if (_value == 1 && b) return Troolean(1);
|
||||
return Troolean(-1);
|
||||
|
||||
}
|
||||
|
||||
Troolean Troolean::operator || (const Troolean &t)
|
||||
{
|
||||
if (_value == 1 || t._value == 1) return Troolean(1);
|
||||
if (_value == 0 && t._value == 0) return Troolean(0);
|
||||
return Troolean(-1);
|
||||
}
|
||||
|
||||
Troolean Troolean::operator || (const bool &b)
|
||||
{
|
||||
if (_value == 1 || b) return Troolean(0);
|
||||
if (_value == 0 && !b) return Troolean(1);
|
||||
return Troolean(-1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// END OF FILE
|
67
libraries/Troolean/Troolean.h
Normal file
67
libraries/Troolean/Troolean.h
Normal file
@ -0,0 +1,67 @@
|
||||
//
|
||||
// FILE: Troolean.h
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.1
|
||||
// PURPOSE: class for Troolean math
|
||||
// URL: https://en.wikipedia.org/wiki/Three-valued_logic
|
||||
// Kleene and Priest logics
|
||||
//
|
||||
// HISTORY:
|
||||
// see Troolean.cpp file
|
||||
//
|
||||
|
||||
#ifndef TROOLEAN_H
|
||||
#define TROOLEAN_H
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "Printable.h"
|
||||
|
||||
#define TROOLEAN_LIB_VERSION (F("0.1.1"))
|
||||
|
||||
// TODO:rvdt enum values in a separate type....
|
||||
#define unknown -1
|
||||
|
||||
class Troolean: public Printable
|
||||
{
|
||||
public:
|
||||
Troolean();
|
||||
Troolean(const int8_t);
|
||||
Troolean(const Troolean&);
|
||||
|
||||
size_t printTo(Print&) const;
|
||||
|
||||
bool operator == (const Troolean&);
|
||||
bool operator == (const bool&);
|
||||
bool operator == (const int&);
|
||||
bool operator != (const Troolean&);
|
||||
bool operator != (const bool&);
|
||||
bool operator != (const int&);
|
||||
|
||||
operator bool() const;
|
||||
|
||||
Troolean operator ! (); // negation
|
||||
|
||||
Troolean operator && (const Troolean&);
|
||||
Troolean operator && (const bool&);
|
||||
Troolean operator || (const Troolean&);
|
||||
Troolean operator || (const bool&);
|
||||
|
||||
// faster than ==
|
||||
inline bool isTrue() { return _value == 1; };
|
||||
inline bool isFalse() { return _value == 0; };
|
||||
inline bool isUnknown() { return _value == -1; };
|
||||
|
||||
// ideas
|
||||
// bool toBool(); // returns random true/false if unknown....
|
||||
// Troolean operator &&=
|
||||
// Troolean operator ||=
|
||||
// extend with dontcare ? ==> four state logic ? Foolean?
|
||||
|
||||
private:
|
||||
int8_t _value;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
// END OF FILE
|
428
libraries/Troolean/examples/testTroolean/testTroolean.ino
Normal file
428
libraries/Troolean/examples/testTroolean/testTroolean.ino
Normal file
@ -0,0 +1,428 @@
|
||||
//
|
||||
// FILE: testTroolean.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.1
|
||||
// PURPOSE: test for troolean (tri state) math library for Arduino
|
||||
// URL:
|
||||
//
|
||||
// Released to the public domain
|
||||
//
|
||||
|
||||
#include "Troolean.h"
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(__FILE__);
|
||||
Serial.print("TROOLEAN_LIB_VERSION: ");
|
||||
Serial.println(TROOLEAN_LIB_VERSION);
|
||||
|
||||
testConstructor();
|
||||
testEquality();
|
||||
testInEquality();
|
||||
testAssignment();
|
||||
testAND();
|
||||
testOR();
|
||||
testNOT();
|
||||
testIF();
|
||||
testIS();
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
}
|
||||
|
||||
void testConstructor()
|
||||
{
|
||||
Troolean f(false);
|
||||
Troolean t(true);
|
||||
Troolean u(-1);
|
||||
Troolean v(u);
|
||||
|
||||
Serial.println();
|
||||
Serial.println(__FUNCTION__);
|
||||
Serial.print(f);
|
||||
Serial.print('\t');
|
||||
Serial.print(t);
|
||||
Serial.print('\t');
|
||||
Serial.print(u);
|
||||
Serial.print('\t');
|
||||
Serial.println(v);
|
||||
}
|
||||
|
||||
void testEquality()
|
||||
{
|
||||
Troolean f(false);
|
||||
Troolean t(true);
|
||||
Troolean u(unknown);
|
||||
|
||||
Serial.println();
|
||||
Serial.println(__FUNCTION__);
|
||||
Serial.print(f == f);
|
||||
Serial.print('\t');
|
||||
Serial.print(f == t);
|
||||
Serial.print('\t');
|
||||
Serial.println(f == u);
|
||||
Serial.print(t == f);
|
||||
Serial.print('\t');
|
||||
Serial.print(t == t);
|
||||
Serial.print('\t');
|
||||
Serial.println(t == u);
|
||||
Serial.print(u == f);
|
||||
Serial.print('\t');
|
||||
Serial.print(u == t);
|
||||
Serial.print('\t');
|
||||
Serial.println(u == u);
|
||||
|
||||
Serial.print(f == false);
|
||||
Serial.print('\t');
|
||||
Serial.print(t == true);
|
||||
Serial.print('\t');
|
||||
Serial.print(u == false);
|
||||
Serial.print('\t');
|
||||
Serial.println(u == true);
|
||||
}
|
||||
|
||||
void testInEquality()
|
||||
{
|
||||
Troolean f(false);
|
||||
Troolean t(true);
|
||||
Troolean u(-1);
|
||||
|
||||
Serial.println();
|
||||
Serial.println(__FUNCTION__);
|
||||
Serial.print(f != f);
|
||||
Serial.print('\t');
|
||||
Serial.print(f != t);
|
||||
Serial.print('\t');
|
||||
Serial.println(f != u);
|
||||
Serial.print(t != f);
|
||||
Serial.print('\t');
|
||||
Serial.print(t != t);
|
||||
Serial.print('\t');
|
||||
Serial.println(t != u);
|
||||
Serial.print(u != f);
|
||||
Serial.print('\t');
|
||||
Serial.print(u != t);
|
||||
Serial.print('\t');
|
||||
Serial.println(u != u);
|
||||
|
||||
Serial.print(f != false);
|
||||
Serial.print('\t');
|
||||
Serial.print(t != true);
|
||||
Serial.print('\t');
|
||||
Serial.print(u != false);
|
||||
Serial.print('\t');
|
||||
Serial.println(u != true);
|
||||
}
|
||||
|
||||
void testAssignment()
|
||||
{
|
||||
Troolean f(false);
|
||||
Troolean t(true);
|
||||
Troolean u(-1);
|
||||
|
||||
f = true;
|
||||
t = unknown;
|
||||
u = false;
|
||||
Serial.println();
|
||||
Serial.println(__FUNCTION__);
|
||||
Serial.print(f);
|
||||
Serial.print('\t');
|
||||
Serial.print(t);
|
||||
Serial.print('\t');
|
||||
Serial.println(u);
|
||||
}
|
||||
|
||||
void testAND()
|
||||
{
|
||||
Troolean a, b, c;
|
||||
|
||||
Serial.println();
|
||||
Serial.println(__FUNCTION__);
|
||||
a = true;
|
||||
b = false;
|
||||
c = a && b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = true;
|
||||
b = true;
|
||||
c = a && b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = true;
|
||||
b = unknown;
|
||||
c = a && b;
|
||||
Serial.println(c);
|
||||
|
||||
a = false;
|
||||
b = false;
|
||||
c = a && b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = false;
|
||||
b = true;
|
||||
c = a && b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = false;
|
||||
b = unknown;
|
||||
c = a && b;
|
||||
Serial.println(c);
|
||||
|
||||
a = unknown;
|
||||
b = false;
|
||||
c = a && b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = unknown;
|
||||
b = true;
|
||||
c = a && b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = unknown;
|
||||
b = unknown;
|
||||
c = a && b;
|
||||
Serial.println(c);
|
||||
}
|
||||
|
||||
void testOR()
|
||||
{
|
||||
Troolean a, b, c;
|
||||
|
||||
Serial.println();
|
||||
Serial.println(__FUNCTION__);
|
||||
a = true;
|
||||
b = false;
|
||||
c = a || b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = true;
|
||||
b = true;
|
||||
c = a || b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = true;
|
||||
b = unknown;
|
||||
c = a || b;
|
||||
Serial.println(c);
|
||||
|
||||
a = false;
|
||||
b = false;
|
||||
c = a || b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = false;
|
||||
b = true;
|
||||
c = a || b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = false;
|
||||
b = unknown;
|
||||
c = a || b;
|
||||
Serial.println(c);
|
||||
|
||||
a = unknown;
|
||||
b = false;
|
||||
c = a || b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = unknown;
|
||||
b = true;
|
||||
c = a || b;
|
||||
Serial.print(c);
|
||||
Serial.print('\t');
|
||||
a = unknown;
|
||||
b = unknown;
|
||||
c = a || b;
|
||||
Serial.println(c);
|
||||
}
|
||||
|
||||
void testNOT()
|
||||
{
|
||||
Troolean a(false), b(true), c(unknown);
|
||||
|
||||
Serial.println();
|
||||
Serial.println(__FUNCTION__);
|
||||
Serial.print(!a);
|
||||
Serial.print('\t');
|
||||
Serial.print(!b);
|
||||
Serial.print('\t');
|
||||
Serial.println(!c);
|
||||
|
||||
Serial.print(!!a);
|
||||
Serial.print('\t');
|
||||
Serial.print(!!b);
|
||||
Serial.print('\t');
|
||||
Serial.println(!!c);
|
||||
}
|
||||
|
||||
void testIF()
|
||||
{
|
||||
// a troolean cannot be used directly in a if or while statement
|
||||
// it must be compared to either boolean ot troolean.
|
||||
Troolean a(false), b(true), c(unknown);
|
||||
|
||||
Serial.println();
|
||||
Serial.println(__FUNCTION__);
|
||||
|
||||
Serial.print("TRUE");
|
||||
Serial.print('\t');
|
||||
if (a == true)
|
||||
{
|
||||
Serial.print('a');
|
||||
Serial.print('\t');
|
||||
}
|
||||
if (b == true)
|
||||
{
|
||||
Serial.print('b');
|
||||
Serial.print('\t');
|
||||
}
|
||||
if (c == true)
|
||||
{
|
||||
Serial.print('c');
|
||||
Serial.print('\t');
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
Serial.print("FALSE");
|
||||
Serial.print('\t');
|
||||
if (a == false)
|
||||
{
|
||||
Serial.print('a');
|
||||
Serial.print('\t');
|
||||
}
|
||||
if (b == false)
|
||||
{
|
||||
Serial.print('b');
|
||||
Serial.print('\t');
|
||||
}
|
||||
if (c == false)
|
||||
{
|
||||
Serial.print('c');
|
||||
Serial.print('\t');
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
Serial.print("UNKNOWN");
|
||||
Serial.print('\t');
|
||||
if (a == unknown)
|
||||
{
|
||||
Serial.print('a');
|
||||
Serial.print('\t');
|
||||
}
|
||||
if (b == unknown)
|
||||
{
|
||||
Serial.print(b);
|
||||
Serial.print('b');
|
||||
Serial.print('\t');
|
||||
}
|
||||
if (c == unknown)
|
||||
{
|
||||
Serial.print('c');
|
||||
Serial.print('\t');
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
Serial.print("BOOL()");
|
||||
Serial.print('\t');
|
||||
if (a)
|
||||
{
|
||||
Serial.print('a');
|
||||
Serial.print('\t');
|
||||
}
|
||||
if (b)
|
||||
{
|
||||
Serial.print('b');
|
||||
Serial.print('\t');
|
||||
}
|
||||
if (c)
|
||||
{
|
||||
Serial.print('c');
|
||||
Serial.print('\t');
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
void testIS()
|
||||
{
|
||||
Troolean f(false), t(true), u(unknown);
|
||||
|
||||
Serial.println();
|
||||
Serial.println(__FUNCTION__);
|
||||
|
||||
Serial.print(f.isFalse());
|
||||
Serial.print('\t');
|
||||
Serial.print(f.isTrue());
|
||||
Serial.print('\t');
|
||||
Serial.println(f.isUnknown());
|
||||
|
||||
Serial.print(t.isFalse());
|
||||
Serial.print('\t');
|
||||
Serial.print(t.isTrue());
|
||||
Serial.print('\t');
|
||||
Serial.println(t.isUnknown());
|
||||
|
||||
Serial.print(u.isFalse());
|
||||
Serial.print('\t');
|
||||
Serial.print(u.isTrue());
|
||||
Serial.print('\t');
|
||||
Serial.println(u.isUnknown());
|
||||
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
//
|
||||
// EXPECTED OUTPUT
|
||||
//
|
||||
/*
|
||||
.....\test1.ino
|
||||
TROOLEAN_LIB_VERSION: 0.1.1
|
||||
|
||||
testConstructor
|
||||
false true unknown unknown
|
||||
|
||||
testEquality
|
||||
1 0 0
|
||||
0 1 0
|
||||
0 0 1
|
||||
1 1 0 0
|
||||
|
||||
testInEquality
|
||||
0 1 1
|
||||
1 0 1
|
||||
1 1 0
|
||||
0 0 1 1
|
||||
|
||||
testAssignment
|
||||
true unknown false
|
||||
|
||||
testAND
|
||||
false true unknown
|
||||
false false false
|
||||
false unknown unknown
|
||||
|
||||
testOR
|
||||
true true true
|
||||
false true unknown
|
||||
unknown true unknown
|
||||
|
||||
testNOT
|
||||
true false unknown
|
||||
false true unknown
|
||||
|
||||
testIF
|
||||
TRUE b
|
||||
FALSE a
|
||||
UNKNOWN c
|
||||
BOOL() trueb
|
||||
|
||||
testIS
|
||||
1 0 0
|
||||
0 1 0
|
||||
0 0 1
|
||||
|
||||
*/
|
||||
// END OF FILE
|
@ -0,0 +1,61 @@
|
||||
//
|
||||
// FILE: testTrooleanArray.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.1
|
||||
// PURPOSE: test for troolean (tri state) math library for Arduino
|
||||
// URL:
|
||||
//
|
||||
// Released to the public domain
|
||||
//
|
||||
|
||||
#include "Troolean.h"
|
||||
|
||||
// minimal array test
|
||||
Troolean arr[10];
|
||||
Troolean brr[5] = { true, false, unknown };
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(__FILE__);
|
||||
Serial.print("TROOLEAN_LIB_VERSION: ");
|
||||
Serial.println(TROOLEAN_LIB_VERSION);
|
||||
|
||||
for (int i = 0; i < 10; i++) arr[i] = false;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
Serial.print(arr[i]);
|
||||
Serial.print(" ");
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
for (int i = 0; i < 10; i++) arr[i] = true;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
Serial.print(arr[i]);
|
||||
Serial.print(" ");
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
for (int i = 0; i < 10; i++) arr[i] = unknown;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
Serial.print(arr[i]);
|
||||
Serial.print(" ");
|
||||
}
|
||||
Serial.println();
|
||||
|
||||
Serial.println();
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
Serial.print(brr[i]);
|
||||
Serial.print(" ");
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
}
|
||||
|
||||
// END OF FILE
|
18
libraries/Troolean/keywords.txt
Normal file
18
libraries/Troolean/keywords.txt
Normal file
@ -0,0 +1,18 @@
|
||||
#######################################
|
||||
# Syntax Coloring Map for Troolean
|
||||
#######################################
|
||||
|
||||
#######################################
|
||||
# Datatypes (KEYWORD1)
|
||||
#######################################
|
||||
|
||||
Troolean KEYWORD1
|
||||
|
||||
#######################################
|
||||
# Methods and Functions (KEYWORD2)
|
||||
#######################################
|
||||
|
||||
#######################################
|
||||
# Constants (LITERAL1)
|
||||
#######################################
|
||||
unknown LITERAL1
|
24
libraries/Troolean/library.json
Normal file
24
libraries/Troolean/library.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "Troolean",
|
||||
"keywords": "Troolean,numbers",
|
||||
"description": "Library with Troolean math for Arduino.",
|
||||
"authors":
|
||||
[
|
||||
{
|
||||
"name": "Rob Tillaart",
|
||||
"email": "Rob.Tillaart@gmail.com",
|
||||
"maintainer": true
|
||||
}
|
||||
],
|
||||
"repository":
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/RobTillaart/Arduino.git"
|
||||
},
|
||||
"version":"0.1.1",
|
||||
"frameworks": "arduino",
|
||||
"platforms": "*",
|
||||
"export": {
|
||||
"include": "libraries/Troolean"
|
||||
}
|
||||
}
|
9
libraries/Troolean/library.properties
Normal file
9
libraries/Troolean/library.properties
Normal file
@ -0,0 +1,9 @@
|
||||
name=Troolean
|
||||
version=0.1.1
|
||||
author=Rob Tillaart <rob.tillaart@gmail.com>
|
||||
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
|
||||
sentence=Library with troolean math for Arduino.
|
||||
paragraph=
|
||||
category=Data Processing
|
||||
url=https://github.com/RobTillaart/Arduino/tree/master/libraries/
|
||||
architectures=*
|
Loading…
Reference in New Issue
Block a user