mirror of
https://github.com/lumapu/ahoy.git
synced 2025-05-11 07:56:39 +02:00
* preliminary state, compiles good not tested on hardware
* converted struct inverter_t to class Inverter * started with calculation functions (idea from Hubi/mikrocontroller.net)
This commit is contained in:
parent
d195eee498
commit
f6b75aff90
15 changed files with 214 additions and 290 deletions
|
@ -1,12 +1,12 @@
|
|||
#ifndef __HM_SYSTEM_H__
|
||||
#define __HM_SYSTEM_H__
|
||||
|
||||
#include "hmInverters.h"
|
||||
#include "hmInverter.h"
|
||||
#include "hmRadio.h"
|
||||
|
||||
|
||||
|
||||
template <class RADIO, class BUFFER, uint8_t MAX_INVERTER, class RECORDTYPE=float>
|
||||
template <class RADIO, class BUFFER, uint8_t MAX_INVERTER=3, class INVERTERTYPE=Inverter<float>>
|
||||
class HmSystem {
|
||||
public:
|
||||
typedef RADIO RadioType;
|
||||
|
@ -25,34 +25,30 @@ class HmSystem {
|
|||
Radio.setup(&BufCtrl);
|
||||
}
|
||||
|
||||
inverter_t *addInverter(const char *name, uint64_t serial, uint8_t type) {
|
||||
INVERTERTYPE *addInverter(const char *name, uint64_t serial, uint8_t type) {
|
||||
if(MAX_INVERTER <= mNumInv) {
|
||||
DPRINT("max number of inverters reached!");
|
||||
return NULL;
|
||||
}
|
||||
inverter_t *p = &mInverter[mNumInv];
|
||||
INVERTERTYPE *p = &mInverter[mNumInv];
|
||||
p->id = mNumInv;
|
||||
p->serial.u64 = serial;
|
||||
p->type = type;
|
||||
uint8_t len = strlen(name);
|
||||
strncpy(p->name, name, (len > MAX_NAME_LENGTH) ? MAX_NAME_LENGTH : len);
|
||||
getAssignment(p);
|
||||
toRadioId(p);
|
||||
|
||||
if(NULL == p->assign) {
|
||||
DPRINT("no assignment for type found!");
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
mRecord[p->id] = new RECORDTYPE[p->listLen];
|
||||
memset(mRecord[p->id], 0, sizeof(RECORDTYPE) * p->listLen);
|
||||
mNumInv ++;
|
||||
return p;
|
||||
}
|
||||
}
|
||||
|
||||
inverter_t *findInverter(uint8_t buf[]) {
|
||||
inverter_t *p;
|
||||
INVERTERTYPE *findInverter(uint8_t buf[]) {
|
||||
INVERTERTYPE *p;
|
||||
for(uint8_t i = 0; i < mNumInv; i++) {
|
||||
p = &mInverter[i];
|
||||
if((p->serial.b[3] == buf[0])
|
||||
|
@ -64,96 +60,20 @@ class HmSystem {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
inverter_t *getInverterByPos(uint8_t pos) {
|
||||
INVERTERTYPE *getInverterByPos(uint8_t pos) {
|
||||
if(mInverter[pos].serial.u64 != 0ULL)
|
||||
return &mInverter[pos];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *getFieldName(inverter_t *p, uint8_t pos) {
|
||||
return fields[p->assign[pos].fieldId];
|
||||
}
|
||||
|
||||
const char *getUnit(inverter_t *p, uint8_t pos) {
|
||||
return units[p->assign[pos].unitId];
|
||||
}
|
||||
|
||||
uint64_t getSerial(inverter_t *p) {
|
||||
return p->serial.u64;
|
||||
}
|
||||
|
||||
void updateSerial(inverter_t *p, uint64_t serial) {
|
||||
p->serial.u64 = serial;
|
||||
}
|
||||
|
||||
uint8_t getChannel(inverter_t *p, uint8_t pos) {
|
||||
return p->assign[pos].ch;
|
||||
}
|
||||
|
||||
uint8_t getCmdId(inverter_t *p, uint8_t pos) {
|
||||
return p->assign[pos].cmdId;
|
||||
}
|
||||
|
||||
void addValue(inverter_t *p, uint8_t pos, uint8_t buf[]) {
|
||||
uint8_t ptr = p->assign[pos].start;
|
||||
uint8_t end = ptr + p->assign[pos].num;
|
||||
uint16_t div = p->assign[pos].div;
|
||||
|
||||
uint32_t val = 0;
|
||||
do {
|
||||
val <<= 8;
|
||||
val |= buf[ptr];
|
||||
} while(++ptr != end);
|
||||
|
||||
mRecord[p->id][pos] = (RECORDTYPE)(val) / (RECORDTYPE)(div);
|
||||
}
|
||||
|
||||
RECORDTYPE getValue(inverter_t *p, uint8_t pos) {
|
||||
return mRecord[p->id][pos];
|
||||
}
|
||||
|
||||
uint8_t getPosByChField(inverter_t *p, uint8_t channel, uint8_t fieldId) {
|
||||
uint8_t pos = 0;
|
||||
for(; pos < p->listLen; pos++) {
|
||||
if((p->assign[pos].ch == channel) && (p->assign[pos].fieldId == fieldId))
|
||||
break;
|
||||
}
|
||||
return (pos >= p->listLen) ? 0xff : pos;
|
||||
}
|
||||
|
||||
uint8_t getNumInverters(void) {
|
||||
return mNumInv;
|
||||
}
|
||||
|
||||
private:
|
||||
void toRadioId(inverter_t *p) {
|
||||
p->radioId.u64 = 0ULL;
|
||||
p->radioId.b[4] = p->serial.b[0];
|
||||
p->radioId.b[3] = p->serial.b[1];
|
||||
p->radioId.b[2] = p->serial.b[2];
|
||||
p->radioId.b[1] = p->serial.b[3];
|
||||
p->radioId.b[0] = 0x01;
|
||||
}
|
||||
|
||||
void getAssignment(inverter_t *p) {
|
||||
if(INV_TYPE_HM600 == p->type) {
|
||||
p->listLen = (uint8_t)(HM1200_LIST_LEN);
|
||||
p->assign = (byteAssign_t*)hm600assignment;
|
||||
}
|
||||
else if(INV_TYPE_HM1200 == p->type) {
|
||||
p->listLen = (uint8_t)(HM1200_LIST_LEN);
|
||||
p->assign = (byteAssign_t*)hm1200assignment;
|
||||
}
|
||||
else {
|
||||
p->listLen = 0;
|
||||
p->assign = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
inverter_t mInverter[MAX_INVERTER];
|
||||
INVERTERTYPE mInverter[MAX_INVERTER];
|
||||
uint8_t mNumInv;
|
||||
RECORDTYPE *mRecord[MAX_INVERTER];
|
||||
};
|
||||
|
||||
#endif /*__HM_SYSTEM_H__*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue