Satic vector, new epprom routines, new wireless relay storage method
This commit is contained in:
@ -1,5 +1,6 @@
|
|||||||
#include"WirelessRelay.h"
|
#include"WirelessRelay.h"
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
#include "eeprom.h"
|
||||||
|
|
||||||
volatile unsigned char *_port = &PORTB;
|
volatile unsigned char *_port = &PORTB;
|
||||||
unsigned char _pin = PB5;
|
unsigned char _pin = PB5;
|
||||||
|
@ -9,18 +9,25 @@
|
|||||||
|
|
||||||
class WirelessRelay
|
class WirelessRelay
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
static const MAX_NAME_LENGTH = 32;
|
||||||
|
|
||||||
|
char name[MAX_NAME_LENGTH];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _state = false;
|
bool _state = false;
|
||||||
|
uint16_t _nameAddr;
|
||||||
uint16_t _id;
|
uint16_t _id;
|
||||||
void sendBit( const bool i);
|
void sendBit( const bool i);
|
||||||
void sync();
|
void sync();
|
||||||
void sendId();
|
void sendId();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
WirelessRelay(const uint16_t id);
|
WirelessRelay(const uint16_t id, uint16_t nameAddr, char* nameIn = "");
|
||||||
WirelessRelay();
|
WirelessRelay();
|
||||||
void setTimeout(uint64_t timeout);
|
void setTimeout(uint64_t timeout);
|
||||||
void init(const uint16_t id);
|
void init(const uint16_t id, uint16_t nameAddr, char* nameIn = "");
|
||||||
void on();
|
void on();
|
||||||
void off();
|
void off();
|
||||||
uint16_t getId();
|
uint16_t getId();
|
||||||
|
43
eeprom.h
43
eeprom.h
@ -1,40 +1,51 @@
|
|||||||
void EEPROM_write_char(uint16_t address, unsigned char data)
|
void EEPROM_write_char(uint16_t address, unsigned char data)
|
||||||
{
|
{
|
||||||
/* Wait for completion of previous write */
|
//Wait for completion of previous write
|
||||||
while(EECR & (1<<EEPE));
|
while(EECR & (1<<EEPE));
|
||||||
/* Set up address and Data Registers */
|
//Set up address and Data Registers
|
||||||
EEAR = address;
|
EEAR = address;
|
||||||
EEDR = data;
|
EEDR = data;
|
||||||
/* Write logical one to EEMPE */
|
//Write logical one to EEMPE
|
||||||
EECR |= (1<<EEMPE);
|
EECR |= (1<<EEMPE);
|
||||||
/* Start eeprom write by setting EEPE */
|
//Start eeprom write by setting EEPE
|
||||||
EECR |= (1<<EEPE);
|
EECR |= (1<<EEPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char EEPROM_read_char(uint16_t uiAddress)
|
unsigned char EEPROM_read_char(uint16_t uiAddress)
|
||||||
{
|
{
|
||||||
/* Wait for completion of previous write */
|
// Wait for completion of previous write
|
||||||
while(EECR & (1<<EEPE));
|
while(EECR & (1<<EEPE));
|
||||||
/* Set up address register */
|
//Set up address register
|
||||||
EEAR = uiAddress;
|
EEAR = uiAddress;
|
||||||
/* Start eeprom read by writing EERE */
|
//Start eeprom read by writing EERE
|
||||||
EECR |= (1<<EERE);
|
EECR |= (1<<EERE);
|
||||||
/* Return data from Data Register */
|
//Return data from Data Register
|
||||||
return EEDR;
|
return EEDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EEPROM_write_string(uint16_t address, char* buffer, uint16_t length)
|
void EEPROM_write_string(uint16_t address, char* buffer, uint16_t length)
|
||||||
{
|
{
|
||||||
for(uint16_t i = 0; i < length; i++)
|
for(uint16_t i = 0; i < length; i++) EEPROM_write_char( address+i, buffer[i] );
|
||||||
{
|
|
||||||
EEPROM_write_char( address+i, buffer[i] );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EEPROM_read_string(uint16_t address, char* buffer, uint16_t length)
|
void EEPROM_read_string(uint16_t address, char* buffer, uint16_t length)
|
||||||
{
|
{
|
||||||
for(uint16_t i = 0; i < length; i++)
|
for(uint16_t i = 0; i < length; i++) buffer[i] = EEPROM_read_char( address+i);
|
||||||
{
|
}
|
||||||
buffer[i] = EEPROM_read_char( address+i);
|
|
||||||
}
|
template <class T> void EEPROM_write_class(uint16_t address, const T& in)
|
||||||
|
{
|
||||||
|
EEPROM_write_string( address, reinterpret_cast<char*> &in, sizeof(in));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T> T EEPROM_read_class(uint16_t address)
|
||||||
|
{
|
||||||
|
char data[sizeof(T)];
|
||||||
|
EEPROM_read_string( address, data, sizeof(T) );
|
||||||
|
return *reinterpret_cast<T*>(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T> T EEPROM_read_class(uint16_t address, T* in)
|
||||||
|
{
|
||||||
|
EEPROM_read_string( address, reinterpret_cast<char*> &in, sizeof(T) );
|
||||||
}
|
}
|
||||||
|
20
main.cpp
20
main.cpp
@ -10,18 +10,30 @@
|
|||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "bitrep.h"
|
#include "bitrep.h"
|
||||||
|
|
||||||
#define MAX_RELAYS 32
|
|
||||||
#define COMMAND_BUFFER_SIZE 32
|
#define COMMAND_BUFFER_SIZE 32
|
||||||
#define SNPRINTF_BUFFER_SIZE 64
|
#define SNPRINTF_BUFFER_SIZE 64
|
||||||
|
|
||||||
char buffer[SNPRINTF_BUFFER_SIZE];
|
char buffer[SNPRINTF_BUFFER_SIZE];
|
||||||
|
|
||||||
struct WirelessRelayStore
|
class WirelessRelayStore
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
static const MAX_RELAYS = 16;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
WirelessRelay array[MAX_RELAYS];
|
WirelessRelay array[MAX_RELAYS];
|
||||||
|
uint8_t count;
|
||||||
bool states[MAX_RELAYS]={};
|
bool states[MAX_RELAYS]={};
|
||||||
bool printState = true;
|
bool printState = true;
|
||||||
uint8_t count;
|
uint16_t baseNameAddr_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
WirelessRelayStore(uint16_t baseNameAddr = 0)
|
||||||
|
bool add( uint16_t id, char* name );
|
||||||
|
bool remove();
|
||||||
|
WirelessRelay* getRelay(uint8_t id);
|
||||||
};
|
};
|
||||||
|
|
||||||
WirelessRelayStore relays;
|
WirelessRelayStore relays;
|
||||||
@ -357,7 +369,7 @@ int main()
|
|||||||
|
|
||||||
restore_relays(&relays);
|
restore_relays(&relays);
|
||||||
|
|
||||||
serial.write_p(PSTR("RGBController v0.6 starting\n"));
|
serial.write_p(PSTR("RGBController v0.7 starting\n"));
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
serialDispatch(&serial, &relays, &rgbled, &pwmTc1);
|
serialDispatch(&serial, &relays, &rgbled, &pwmTc1);
|
||||||
|
75
staticvector.h
Normal file
75
staticvector.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
template<typename T, std::size_t size> class SVector;
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
size_t stored = 0;
|
||||||
|
|
||||||
|
T array[size];
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
constexpr T* data()
|
||||||
|
{
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
T operator[](size_t i)
|
||||||
|
{
|
||||||
|
return array[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
T at(size_t i)
|
||||||
|
{
|
||||||
|
return array[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
T front()
|
||||||
|
{
|
||||||
|
return array[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
T back()
|
||||||
|
{
|
||||||
|
return array[stored];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool empty()
|
||||||
|
{
|
||||||
|
return stored == 0 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size();
|
||||||
|
{
|
||||||
|
return stored;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr size_t maxSize()
|
||||||
|
{
|
||||||
|
return std::array::size();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t remainingCapacity()
|
||||||
|
{
|
||||||
|
return std::array::size() - stored;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool push_back(const T in)
|
||||||
|
{
|
||||||
|
if( remainingCapacity() != 0)
|
||||||
|
{
|
||||||
|
std::array::operator[](stored) = in;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool erase(size_t position)
|
||||||
|
{
|
||||||
|
if(position > stored) return false;
|
||||||
|
if constexpr( std::is_class<T> ) array[position].~T();
|
||||||
|
--stored;
|
||||||
|
for( size_t i = position; i < stored ) array[i] = array[i+1];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user