diff --git a/Examples/p01basic/p01basic.vcxproj b/Examples/p01basic/p01basic.vcxproj
index 062f601..1bb41c4 100644
--- a/Examples/p01basic/p01basic.vcxproj
+++ b/Examples/p01basic/p01basic.vcxproj
@@ -63,7 +63,7 @@
true
true
true
- $(ProjectDir)..\p01basic;$(ProjectDir)..\..\src;C:\Program Files (x86)\Arduino\libraries;$(ProjectDir)..\..\..\..\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino;C:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.8.1\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.2\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.3\include;%(AdditionalIncludeDirectories)
+ $(ProjectDir)..\p01basic;$(ProjectDir)..\..\src;$(ProjectDir)..\..\..\AltSoftSerial;C:\Program Files (x86)\Arduino\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries;$(ProjectDir)..\..\..\..\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino;C:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.8.1\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.2\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.3\include;%(AdditionalIncludeDirectories)
$(ProjectDir)__vm\.p01basic.vsarduino.h;%(ForcedIncludeFiles)
false
__AVR_ATmega328p__;__AVR_ATmega328P__;F_CPU=16000000L;ARDUINO=10807;ARDUINO_AVR_UNO;ARDUINO_ARCH_AVR;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)
@@ -88,9 +88,6 @@
-
-
-
diff --git a/Examples/p02cStyle/p02cStyle.vcxproj b/Examples/p02cStyle/p02cStyle.vcxproj
index a19c277..68ff2bc 100644
--- a/Examples/p02cStyle/p02cStyle.vcxproj
+++ b/Examples/p02cStyle/p02cStyle.vcxproj
@@ -63,7 +63,7 @@
true
true
true
- $(ProjectDir)..\p02cStyle;$(ProjectDir)..\..\src;$(ProjectDir)..\..\..\AltSoftSerial;C:\Program Files (x86)\Arduino\libraries;$(ProjectDir)..\..\..\..\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino;C:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.8.1\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.2\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.3\include;%(AdditionalIncludeDirectories)
+ $(ProjectDir)..\p02cStyle;$(ProjectDir)..\..\src;$(ProjectDir)..\..\..\AltSoftSerial;C:\Program Files (x86)\Arduino\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries;$(ProjectDir)..\..\..\..\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino;C:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.8.1\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.2\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.3\include;%(AdditionalIncludeDirectories)
$(ProjectDir)__vm\.p02cStyle.vsarduino.h;%(ForcedIncludeFiles)
false
__AVR_ATmega328p__;__AVR_ATmega328P__;F_CPU=16000000L;ARDUINO=10807;ARDUINO_AVR_UNO;ARDUINO_ARCH_AVR;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)
diff --git a/Examples/p03cppStyle/p03cppStyle.vcxproj b/Examples/p03cppStyle/p03cppStyle.vcxproj
index 9b0b69e..b6dbf02 100644
--- a/Examples/p03cppStyle/p03cppStyle.vcxproj
+++ b/Examples/p03cppStyle/p03cppStyle.vcxproj
@@ -63,7 +63,7 @@
true
true
true
- $(ProjectDir)..\p03cppStyle;$(ProjectDir)..\..\src;$(ProjectDir)..\..\..\AltSoftSerial;C:\Program Files (x86)\Arduino\libraries;$(ProjectDir)..\..\..\..\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino;C:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.8.1\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.2\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.3\include;%(AdditionalIncludeDirectories)
+ $(ProjectDir)..\p03cppStyle;$(ProjectDir)..\..\src;$(ProjectDir)..\..\..\AltSoftSerial;C:\Program Files (x86)\Arduino\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries;$(ProjectDir)..\..\..\..\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino;C:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.8.1\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.2\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.3\include;%(AdditionalIncludeDirectories)
$(ProjectDir)__vm\.p03cppStyle.vsarduino.h;%(ForcedIncludeFiles)
false
__AVR_ATmega328p__;__AVR_ATmega328P__;F_CPU=16000000L;ARDUINO=10807;ARDUINO_AVR_UNO;ARDUINO_ARCH_AVR;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)
diff --git a/Examples/p04usingPmsx/p04usingPmsx.vcxproj b/Examples/p04usingPmsx/p04usingPmsx.vcxproj
index 4391809..d62a7fd 100644
--- a/Examples/p04usingPmsx/p04usingPmsx.vcxproj
+++ b/Examples/p04usingPmsx/p04usingPmsx.vcxproj
@@ -63,7 +63,7 @@
true
true
true
- $(ProjectDir)..\p04usingPmsx;$(ProjectDir)..\..\src;$(ProjectDir)..\..\..\AltSoftSerial;C:\Program Files (x86)\Arduino\libraries;$(ProjectDir)..\..\..\..\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino;C:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.8.1\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.2\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.3\include;%(AdditionalIncludeDirectories)
+ $(ProjectDir)..\p04usingPmsx;$(ProjectDir)..\..\src;$(ProjectDir)..\..\..\AltSoftSerial;C:\Program Files (x86)\Arduino\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries;$(ProjectDir)..\..\..\..\libraries;C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino;C:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include\avr;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.8.1\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.2\include;C:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\4.9.3\include;%(AdditionalIncludeDirectories)
$(ProjectDir)__vm\.p04usingPmsx.vsarduino.h;%(ForcedIncludeFiles)
false
__AVR_ATmega328p__;__AVR_ATmega328P__;F_CPU=16000000L;ARDUINO=10807;ARDUINO_AVR_UNO;ARDUINO_ARCH_AVR;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)
diff --git a/VisualStudio/pms5003.sln b/VisualStudio/pms5003.sln
index 244b57f..b3d7bae 100644
--- a/VisualStudio/pms5003.sln
+++ b/VisualStudio/pms5003.sln
@@ -14,6 +14,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
..\API.md = ..\API.md
..\src\compact_optional.h = ..\src\compact_optional.h
..\Compatibility.md = ..\Compatibility.md
+ ..\src\mini_mutex.h = ..\src\mini_mutex.h
..\src\pms.h = ..\src\pms.h
..\src\pmsConfig.h = ..\src\pmsConfig.h
..\src\pmsSerial.h = ..\src\pmsSerial.h
diff --git a/src/mini_mutex.h b/src/mini_mutex.h
new file mode 100644
index 0000000..ca5f758
--- /dev/null
+++ b/src/mini_mutex.h
@@ -0,0 +1,86 @@
+#ifndef _JB_LIBRARIES_MINI_MUTEX_H_
+#define _JB_LIBRARIES_MINI_MUTEX_H_
+
+#include
+#include
+
+// Class contains Arduino implementation of very basic approach to mutex
+//
+// Created by https://github.com/jbanaszczyk
+
+namespace jb {
+ namespace threads {
+ using namespace jb::logic;
+
+ template
+ class safe_mutex {
+
+ public:
+ safe_mutex(const safe_mutex&) = delete;
+ safe_mutex& operator = (const safe_mutex &) = delete;
+ safe_mutex() : state(UNLOCKED) {};
+ ~safe_mutex() {
+ static_assert (mixer(LOCKED, UNLOCKED) != LOCKED, "Function mixer() in destructor should return something different from LOCKED and UNLOCKED value (LOCKED)");
+ static_assert (mixer(LOCKED, UNLOCKED) != UNLOCKED, "Function mixer() in destructor should return something different from LOCKED and UNLOCKED value (UNLOCKED)");
+ static_assert (LOCKED != UNLOCKED, "LOCKED and UNLOCKED parameters should be different");
+ state = mixer(LOCKED, UNLOCKED);
+ }
+
+ tribool try_lock() {
+ tribool result = unknown;
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+ if ((state == LOCKED) || (state == UNLOCKED)) {
+ result = state == UNLOCKED;
+ state = LOCKED;
+ }
+ }
+ return result;
+ }
+
+ void unlock() {
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+ if (state == LOCKED) {
+ state = UNLOCKED;
+ }
+ }
+ }
+
+ protected:
+ volatile T state;
+
+ private:
+ static constexpr T mixer(T lhs, T rhs) {
+ return (!lhs) ^ (!rhs);
+ }
+ };
+
+ class mutex {
+
+ public:
+ mutex(const mutex &) = delete;
+ mutex & operator = (const mutex &) = delete;
+ mutex() : unlocked(true) {};
+
+ bool try_lock() {
+ static_assert (sizeof(unlocked) == 1, "locked : expected single byte");
+ bool result;
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+ result = unlocked;
+ unlocked = false;
+ }
+ return result;
+ }
+
+ void unlock() {
+ unlocked = true;
+ }
+
+
+ public:
+ volatile bool unlocked;
+ };
+
+ }
+}
+
+#endif