Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
3720f4d
Remove special support for FunctionalInterrupt from core interrupt ha…
dok-net May 2, 2019
e4f6e6c
Add supporting function for interrupt arg memory management, linke wi…
dok-net May 2, 2019
035551d
Bring back FunctionalInterrupt, and ScheduledFunctions, as example code.
dok-net May 2, 2019
bd339ec
Ridiculous port number mistake.
dok-net May 2, 2019
f4acddb
Merge branch 'master' into functional-shouldbe-lib
dok-net May 2, 2019
4f621ea
Apply astyle to example INO.
dok-net May 2, 2019
6002811
Merge branch 'master' into functional-shouldbe-lib
dok-net May 2, 2019
4b045f5
Remove ScheduledFunctions.(h|cpp), per comment https://github.com/esp…
dok-net May 2, 2019
e7013ba
Merge remote-tracking branch 'origin/master' into functional-shouldbe…
dok-net May 2, 2019
9e239ec
Invented void* detachInterruptArg() that returns the argument given i…
dok-net May 3, 2019
f89b22c
Modified example to showcase how general FunctionalInterrupt uses vio…
dok-net May 3, 2019
346d3c3
Direct call or scheduled is either-or.
dok-net May 3, 2019
a844d43
Always apply astyle to examples.
dok-net May 3, 2019
eb6c493
Merge branch 'master' into functional-shouldbe-lib
dok-net May 3, 2019
17e3692
Merge branch 'master' into functional-shouldbe-lib
dok-net May 3, 2019
f5092c6
Merge branch 'master' into functional-shouldbe-lib
dok-net May 4, 2019
e619e4c
Merge branch 'master' into functional-shouldbe-lib
dok-net May 4, 2019
69ac313
Merge branch 'master' into functional-shouldbe-lib
dok-net May 4, 2019
fe56dc6
Merge branch 'master' into functional-shouldbe-lib
dok-net May 4, 2019
db7b1b1
Merge branch 'master' into functional-shouldbe-lib
dok-net May 5, 2019
c8c8bfb
astyle Arduino.h and core_esp8266_wiring_digital.cpp - reduced diff t…
dok-net May 6, 2019
6a33d99
astyle libraries/esp8266/examples/GPIO/FunctionalInterrupt
dok-net May 6, 2019
dd066c9
Merge branch 'master' into functional-shouldbe-lib
dok-net May 9, 2019
6a58725
Merge branch 'master' into functional-shouldbe-lib
dok-net May 12, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
astyle libraries/esp8266/examples/GPIO/FunctionalInterrupt
  • Loading branch information
dok-net committed May 6, 2019
commit 6a33d994265ea670bb4d93c66c2481704a9be895
Original file line number Diff line number Diff line change
Expand Up @@ -4,65 +4,77 @@

void ICACHE_RAM_ATTR interruptFunctional(void* arg)
{
ArgStructure* localArg = static_cast<ArgStructure*>(arg);
if (localArg->interruptInfo)
{
localArg->interruptInfo->value = digitalRead(localArg->interruptInfo->pin);
localArg->interruptInfo->micro = micros();
}
if (localArg->functionInfo->reqScheduledFunction)
{
schedule_function(
[reqScheduledFunction = localArg->functionInfo->reqScheduledFunction,
interruptInfo = *localArg->interruptInfo]() { reqScheduledFunction(interruptInfo); });
}
else if (localArg->functionInfo->reqFunction)
{
localArg->functionInfo->reqFunction();
}
ArgStructure* localArg = static_cast<ArgStructure*>(arg);
if (localArg->interruptInfo)
{
localArg->interruptInfo->value = digitalRead(localArg->interruptInfo->pin);
localArg->interruptInfo->micro = micros();
}
if (localArg->functionInfo->reqScheduledFunction)
{
schedule_function(
[reqScheduledFunction = localArg->functionInfo->reqScheduledFunction,
interruptInfo = *localArg->interruptInfo]()
{
reqScheduledFunction(interruptInfo);
});
}
else if (localArg->functionInfo->reqFunction)
{
localArg->functionInfo->reqFunction();
}
}

void cleanupFunctional(void* arg)
{
ArgStructure* localArg = static_cast<ArgStructure*>(arg);
delete localArg;
ArgStructure* localArg = static_cast<ArgStructure*>(arg);
delete localArg;
}

void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode)
{
// use the local interrupt routine which takes the ArgStructure as argument
// use the local interrupt routine which takes the ArgStructure as argument

void* localArg = detachInterruptArg(pin);
if (localArg) cleanupFunctional(localArg);
void* localArg = detachInterruptArg(pin);
if (localArg)
{
cleanupFunctional(localArg);
}

FunctionInfo* fi = new FunctionInfo;
fi->reqFunction = intRoutine;
FunctionInfo* fi = new FunctionInfo;
fi->reqFunction = intRoutine;

ArgStructure* as = new ArgStructure;
as->functionInfo = fi;
ArgStructure* as = new ArgStructure;
as->functionInfo = fi;

attachInterruptArg (pin, interruptFunctional, as, mode);
attachInterruptArg(pin, interruptFunctional, as, mode);
}

void attachScheduledInterrupt(uint8_t pin, std::function<void(InterruptInfo)> scheduledIntRoutine, int mode)
{
void* localArg = detachInterruptArg(pin);
if (localArg) cleanupFunctional(localArg);
void* localArg = detachInterruptArg(pin);
if (localArg)
{
cleanupFunctional(localArg);
}

InterruptInfo* ii = new InterruptInfo(pin);
InterruptInfo* ii = new InterruptInfo(pin);

FunctionInfo* fi = new FunctionInfo;
fi->reqScheduledFunction = scheduledIntRoutine;
FunctionInfo* fi = new FunctionInfo;
fi->reqScheduledFunction = scheduledIntRoutine;

ArgStructure* as = new ArgStructure;
as->interruptInfo = ii;
as->functionInfo = fi;
ArgStructure* as = new ArgStructure;
as->interruptInfo = ii;
as->functionInfo = fi;

attachInterruptArg(pin, interruptFunctional, as, mode);
attachInterruptArg(pin, interruptFunctional, as, mode);
}

void detachFunctionalInterrupt(uint8_t pin)
{
void* localArg = detachInterruptArg(pin);
if (localArg) cleanupFunctional(localArg);
void* localArg = detachInterruptArg(pin);
if (localArg)
{
cleanupFunctional(localArg);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,22 @@

// Structures for communication

struct InterruptInfo {
struct InterruptInfo
{
InterruptInfo(uint8_t _pin) : pin(_pin) {}
const uint8_t pin;
uint8_t value = 0;
uint32_t micro = 0;
};

struct FunctionInfo {
struct FunctionInfo
{
std::function<void(void)> reqFunction = nullptr;
std::function<void(InterruptInfo)> reqScheduledFunction = nullptr;
};

struct ArgStructure {
struct ArgStructure
{
~ArgStructure()
{
delete functionInfo;
Expand Down