forked from jp112sdl/Beispiel_AskSinPP
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
166 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,166 @@ | ||
//- ----------------------------------------------------------------------------------------------------------------------- | ||
// AskSin++ | ||
// 2016-10-31 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/ | ||
//- ----------------------------------------------------------------------------------------------------------------------- | ||
|
||
// define this to read the device id, serial and device type from bootloader section | ||
// #define USE_OTA_BOOTLOADER | ||
|
||
#define CFG_STEPUP_BYTE 0x00 | ||
#define CFG_STEPUP_OFF 0x00 | ||
#define CFG_STEPUP_ON 0x01 | ||
|
||
#define CFG_BAT_LOW_BYTE 0x01 | ||
#define CFG_BAT_CRITICAL_BYTE 0x02 | ||
|
||
// define device configuration bytes | ||
#define DEVICE_CONFIG CFG_STEPUP_OFF,22,19 | ||
|
||
// 24 0030 4D455130323134373633 80 910101 | ||
|
||
#define EI_NOTEXTERNAL | ||
#include <EnableInterrupt.h> | ||
#include <AskSinPP.h> | ||
#include <LowPower.h> | ||
|
||
#include <Register.h> | ||
#include <ThreeState.h> | ||
|
||
// we use a Pro Mini | ||
// Arduino pin for the LED | ||
// D4 == PIN 4 on Pro Mini | ||
#define LED1_PIN 4 | ||
#define LED2_PIN 5 | ||
// Arduino pin for the config button | ||
// B0 == PIN 8 on Pro Mini | ||
#define CONFIG_BUTTON_PIN 8 | ||
|
||
#define SENS1_PIN 14 | ||
|
||
// number of available peers per channel | ||
#define PEERS_PER_CHANNEL 10 | ||
#define CYCLETIME seconds2ticks(60UL * 60 * 16) | ||
|
||
// all library classes are placed in the namespace 'as' | ||
using namespace as; | ||
|
||
// define all device properties | ||
const struct DeviceInfo PROGMEM devinfo = { | ||
{0x09,0x43,0x34}, // Device ID | ||
"JPTiS00001", // Device Serial | ||
{0x00,0x43}, // Device Model | ||
0x10, // Firmware Version | ||
as::DeviceType::ThreeStateSensor, // Device Type | ||
{0x01,0x00} // Info Bytes | ||
}; | ||
|
||
class BatSensor : public BatterySensorUni<17,7,3000> { | ||
bool m_Extern; | ||
public: | ||
// sense pin = A3 = 17, activation pin = D7 = 7 | ||
BatSensor () : BatterySensorUni(), m_Extern(false) {} | ||
virtual ~BatSensor () {} | ||
|
||
void hasStepUp (bool value) { | ||
m_Extern = value; | ||
voltage(); | ||
} | ||
|
||
virtual uint8_t voltage () { | ||
if( m_Extern == true ) { | ||
return BatterySensorUni<17,7,3000>::voltage(); | ||
} | ||
return BatterySensor::voltage(); | ||
} | ||
}; | ||
|
||
/** | ||
* Configure the used hardware | ||
*/ | ||
typedef AvrSPI<10,11,12,13> SPIType; | ||
typedef Radio<SPIType,2> RadioType; | ||
typedef DualStatusLed<LED2_PIN,LED1_PIN> LedType; | ||
typedef AskSin<LedType,BatSensor,RadioType> BaseHal; | ||
class Hal : public BaseHal { | ||
public: | ||
void init (const HMID& id) { | ||
BaseHal::init(id); | ||
// measure battery every 1h | ||
battery.init(seconds2ticks(60UL*60),sysclock); | ||
} | ||
} hal; | ||
|
||
DEFREGISTER(Reg0,DREG_INTKEY,DREG_CYCLICINFOMSG,MASTERID_REGS,DREG_TRANSMITTRYMAX) | ||
class RHSList0 : public RegList0<Reg0> { | ||
public: | ||
RHSList0(uint16_t addr) : RegList0<Reg0>(addr) {} | ||
void defaults () { | ||
clear(); | ||
cycleInfoMsg(true); | ||
transmitDevTryMax(6); | ||
} | ||
}; | ||
|
||
DEFREGISTER(Reg1,CREG_AES_ACTIVE,CREG_MSGFORPOS,CREG_EVENTDELAYTIME,CREG_LEDONTIME,CREG_TRANSMITTRYMAX) | ||
class RHSList1 : public RegList1<Reg1> { | ||
public: | ||
RHSList1 (uint16_t addr) : RegList1<Reg1>(addr) {} | ||
void defaults () { | ||
clear(); | ||
msgForPosA(1); // CLOSED | ||
msgForPosB(2); // OPEN | ||
// aesActive(false); | ||
// eventDelaytime(0); | ||
ledOntime(100); | ||
transmitTryMax(6); | ||
} | ||
}; | ||
|
||
|
||
typedef ThreeStateChannel<Hal,RHSList0,RHSList1,DefList4,PEERS_PER_CHANNEL> ChannelType; | ||
class RHSType : public ThreeStateDevice<Hal,ChannelType,1,RHSList0,CYCLETIME> { | ||
public: | ||
typedef ThreeStateDevice<Hal,ChannelType,1,RHSList0,CYCLETIME> TSDevice; | ||
RHSType(const DeviceInfo& info,uint16_t addr) : TSDevice(info,addr) {} | ||
virtual ~RHSType () {} | ||
|
||
virtual void configChanged () { | ||
TSDevice::configChanged(); | ||
// set battery low/critical values | ||
battery().low(getConfigByte(CFG_BAT_LOW_BYTE)); | ||
battery().critical(getConfigByte(CFG_BAT_CRITICAL_BYTE)); | ||
// set the battery mode | ||
if( getConfigByte(CFG_STEPUP_BYTE) == CFG_STEPUP_ON ) { | ||
DPRINTLN("Use StepUp"); | ||
battery().hasStepUp(true); | ||
} | ||
} | ||
}; | ||
|
||
RHSType sdev(devinfo,0x20); | ||
ConfigButton<RHSType> cfgBtn(sdev); | ||
|
||
void setup () { | ||
DINIT(57600,ASKSIN_PLUS_PLUS_IDENTIFIER); | ||
sdev.init(hal); | ||
buttonISR(cfgBtn,CONFIG_BUTTON_PIN); | ||
const uint8_t posmap[4] = {Positions::PosA,Positions::PosB,Positions::PosA,Positions::PosB}; | ||
sdev.channel(1).init(SENS1_PIN,SENS1_PIN,posmap); | ||
sdev.initDone(); | ||
} | ||
|
||
void loop() { | ||
bool worked = hal.runready(); | ||
bool poll = sdev.pollRadio(); | ||
if( worked == false && poll == false ) { | ||
// deep discharge protection | ||
// if we drop below critical battery level - switch off all and sleep forever | ||
if( hal.battery.critical() ) { | ||
// this call will never return | ||
hal.activity.sleepForever(hal); | ||
} | ||
// if nothing to do - go sleep | ||
hal.activity.savePower<Sleep<> >(hal); | ||
} | ||
} | ||
|