Server for window shades - using Soffy DCT-30 motors - more details here http://robdobson.com/2013/10/moving-my-window-shades-control-to-mbed/
Dependencies: EthernetInterface RdWebServer mbed-rtos mbed
WindowShade.h
- Committer:
- Bobty
- Date:
- 2013-10-04
- Revision:
- 2:24fd130c3600
- Child:
- 4:c593741df37e
File content as of revision 2:24fd130c3600:
#ifndef RD_WIN_SHADE
#define RD_WIN_SHADE
#include "mbed.h"
class WindowShade
{
public:
static const int MAX_SHADE_NAME_LEN = 20;
static const long PULSE_ON_MILLISECS = 500;
static const long MAX_SHADE_ON_MILLSECS = 60000;
WindowShade(char* name, PinName up, PinName stop, PinName down)
{
strncpy(_shadeName, name, MAX_SHADE_NAME_LEN);
_shadeName[MAX_SHADE_NAME_LEN-1] = '\0';
_pUpPin = new DigitalOut(up);
_pStopPin = new DigitalOut(stop);
_pDownPin = new DigitalOut(down);
_msTimeout = 0;
_tickCount = 0;
}
void ClearOutputs()
{
// Clear any existing command
_msTimeout = 0;
_tickCount = 0;
*_pUpPin = false;
*_pStopPin = false;
*_pDownPin = false;
}
void SetTimedOutput(DigitalOut* pPin, bool state, long msDuration, bool bClearExisting)
{
// printf("Setting %s %d %ld %d\n\r", _shadeName, state, msDuration, bClearExisting);
if (bClearExisting)
ClearOutputs();
*pPin = state;
if (msDuration != 0)
{
_msTimeout = msDuration;
_tickCount = 0;
}
}
void CheckTimeouts(int tickMs)
{
// Couldn't get Timer to work so doing with a tick-count
if (_msTimeout != 0)
{
_tickCount++;
if ((_tickCount-1)*tickMs > _msTimeout)
{
ClearOutputs();
_msTimeout = 0;
}
}
}
void DoCommand(char* pDirn, char* pDuration)
{
// printf("DoCommand %s %s %s\n\r", _shadeName, pDirn, pDuration);
// Duration and state
int state = false;
int msDuration = 0;
if (strcmp(pDuration, "on") == 0)
{
state = true;
msDuration = MAX_SHADE_ON_MILLSECS;
}
else if (strcmp(pDuration, "off") == 0)
{
state = false;
msDuration = 0;
}
else if (strcmp(pDuration, "pulse") == 0)
{
state = true;
msDuration = PULSE_ON_MILLISECS;
}
// Direction & config
if (strcmp(pDirn, "up") == 0)
{
SetTimedOutput(_pUpPin, state, msDuration, true);
}
else if (strcmp(pDirn, "stop") == 0)
{
SetTimedOutput(_pStopPin, state, msDuration, true);
}
else if (strcmp(pDirn, "down") == 0)
{
SetTimedOutput(_pDownPin, state, msDuration, true);
}
else if (strcmp(pDirn, "setuplimit") == 0)
{
SetTimedOutput(_pStopPin, state, 0, true);
SetTimedOutput(_pDownPin, state, msDuration, false);
}
else if (strcmp(pDirn, "setdownlimit") == 0)
{
SetTimedOutput(_pStopPin, state, 0, true);
SetTimedOutput(_pUpPin, state, msDuration, false);
}
else if (strcmp(pDirn, "resetmemory") == 0)
{
SetTimedOutput(_pStopPin, state, 0, true);
SetTimedOutput(_pDownPin, state, 0, false);
SetTimedOutput(_pUpPin, state, msDuration, false);
}
}
char _shadeName[MAX_SHADE_NAME_LEN];
DigitalOut* _pUpPin;
DigitalOut* _pStopPin;
DigitalOut* _pDownPin;
long _msTimeout;
int _tickCount;
};
#endif