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