mirror of https://github.com/lumapu/ahoy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.2 KiB
45 lines
1.2 KiB
#include "common.hpp"
|
|
|
|
#include <sstream>
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
|
|
using namespace std;
|
|
|
|
/** Convert given 5-byte address to human readable hex string */
|
|
string prettyPrintAddr(string &a)
|
|
{
|
|
ostringstream o;
|
|
o << hex << setw(2)
|
|
<< setfill('0') << setw(2) << int(a[0])
|
|
<< ":" << setw(2) << int(a[1])
|
|
<< ":" << setw(2) << int(a[2])
|
|
<< ":" << setw(2) << int(a[3])
|
|
<< ":" << setw(2) << int(a[4]) << dec;
|
|
return o.str();
|
|
}
|
|
|
|
|
|
/** Convert a Hoymiles inverter/DTU serial number into its
|
|
* corresponding NRF24 address byte sequence (5 bytes).
|
|
*
|
|
* The inverters use a BCD representation of the last 8
|
|
* digits of their serial number, in reverse byte order,
|
|
* followed by \x01.
|
|
*/
|
|
string serno2shockburstaddrbytes(uint64_t n)
|
|
{
|
|
char b[5];
|
|
b[3] = (((n/10)%10) << 4) | ((n/1)%10);
|
|
b[2] = (((n/1000)%10) << 4) | ((n/100)%10);
|
|
b[1] = (((n/100000)%10) << 4) | ((n/10000)%10);
|
|
b[0] = (((n/10000000)%10) << 4) | ((n/1000000)%10);
|
|
b[4] = 0x01;
|
|
|
|
string s = string(b, sizeof(b));
|
|
|
|
cout << dec << "ser# " << n << " --> addr "
|
|
<< prettyPrintAddr(s) << endl;
|
|
return s;
|
|
}
|
|
|
|
|