Skip to content

Commit

Permalink
mini_mutex created
Browse files Browse the repository at this point in the history
  • Loading branch information
jbanaszczyk committed Oct 24, 2018
1 parent 00d435f commit 4ca1ad1
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 7 deletions.
5 changes: 1 addition & 4 deletions Examples/p01basic/p01basic.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(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)</AdditionalIncludeDirectories>
<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)</AdditionalIncludeDirectories>
<ForcedIncludeFiles>$(ProjectDir)__vm\.p01basic.vsarduino.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
<WholeProgramOptimization>false</WholeProgramOptimization>
<PreprocessorDefinitions>__AVR_ATmega328p__;__AVR_ATmega328P__;F_CPU=16000000L;ARDUINO=10807;ARDUINO_AVR_UNO;ARDUINO_ARCH_AVR;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
Expand All @@ -88,9 +88,6 @@
<ItemGroup>
<ClInclude Include="__vm\.p01basic.vsarduino.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="doIt.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
Expand Down
2 changes: 1 addition & 1 deletion Examples/p02cStyle/p02cStyle.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(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)</AdditionalIncludeDirectories>
<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)</AdditionalIncludeDirectories>
<ForcedIncludeFiles>$(ProjectDir)__vm\.p02cStyle.vsarduino.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
<WholeProgramOptimization>false</WholeProgramOptimization>
<PreprocessorDefinitions>__AVR_ATmega328p__;__AVR_ATmega328P__;F_CPU=16000000L;ARDUINO=10807;ARDUINO_AVR_UNO;ARDUINO_ARCH_AVR;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
Expand Down
2 changes: 1 addition & 1 deletion Examples/p03cppStyle/p03cppStyle.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(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)</AdditionalIncludeDirectories>
<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)</AdditionalIncludeDirectories>
<ForcedIncludeFiles>$(ProjectDir)__vm\.p03cppStyle.vsarduino.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
<WholeProgramOptimization>false</WholeProgramOptimization>
<PreprocessorDefinitions>__AVR_ATmega328p__;__AVR_ATmega328P__;F_CPU=16000000L;ARDUINO=10807;ARDUINO_AVR_UNO;ARDUINO_ARCH_AVR;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
Expand Down
2 changes: 1 addition & 1 deletion Examples/p04usingPmsx/p04usingPmsx.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>$(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)</AdditionalIncludeDirectories>
<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)</AdditionalIncludeDirectories>
<ForcedIncludeFiles>$(ProjectDir)__vm\.p04usingPmsx.vsarduino.h;%(ForcedIncludeFiles)</ForcedIncludeFiles>
<WholeProgramOptimization>false</WholeProgramOptimization>
<PreprocessorDefinitions>__AVR_ATmega328p__;__AVR_ATmega328P__;F_CPU=16000000L;ARDUINO=10807;ARDUINO_AVR_UNO;ARDUINO_ARCH_AVR;__cplusplus=201103L;_VMICRO_INTELLISENSE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
Expand Down
1 change: 1 addition & 0 deletions VisualStudio/pms5003.sln
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
86 changes: 86 additions & 0 deletions src/mini_mutex.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#ifndef _JB_LIBRARIES_MINI_MUTEX_H_
#define _JB_LIBRARIES_MINI_MUTEX_H_

#include <util/atomic.h>
#include <tribool.h>

// 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 <typename T = uint8_t, T LOCKED = T{ 0xC3 }, T UNLOCKED = T{ 0x3C } >
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

0 comments on commit 4ca1ad1

Please sign in to comment.