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