Я хочу понять как работает этот. Функция карусель запрашивает 8 - ? параметров сенсора по кругу.
угу только я не совсем понимаю зачем, можно спросить все одним запросом
void carousel() {
#define MAX_PONY 8
currPony++;
if (currPony > MAX_PONY) {currPony = 1;}
switch (currPony) {
case 1: if (nrf1Name == "") {sendPacket(GET_NAME);} break;
case 2: if (nrf1Id == "") {sendPacket(GET_ID);} break;
case 3: if (nrf1Addr == 0) {sendPacket(GET_ADDR);} break;
case 4: if (nrf1FreeMem == 0) {sendPacket(GET_FREE_MEM);} break;
case 5: if (nrf1Battery == 0) {sendPacket(GET_BATTERY);} break;
case 6: if (nrf1SelfTemp == 0) {sendPacket(GET_SELF_TEMP);} break;
case 7: if (nrf1Health == 0) {sendPacket(GET_HEALTH);} break;
case 8: if (nrf1Temp1 == 0) {sendPacket(GET_TEMP_1);} break;
}
}
допустим зовем sendPacket(GET_NAME)
void sendPacket(byte packet) {
radio.stopListening();
switch (packet) {
case BAK_ECHO: //makePacketEcho();
break;
case GET_NAME: makePacketGetName(); break;
case GET_ADDR: makePacketGetAddress(); break;
case GET_FREE_MEM: makePacketGetFreeMem(); break;
case GET_BATTERY: makePacketGetBattery(); break;
case GET_SELF_TEMP: makePacketGetSelfTemp(); break;
case GET_HEALTH: makePacketGetHealth(); break;
case GET_ID: makePacketGetId(); break;
case GET_TEMP_1: makePacketGetTemp1(); break;
} // switch (packet)
зовем makePacketGetName()
void makePacketGetName() {makePacket(&sendGetName, TYPE_REQUEST, GET_NAME, 255, "", "");}
void makePacket(struct Sender *p, byte tpe, byte cmd, byte dest, String pwd, String dta) {
// sender
if (p->required) {p->active = true; p->success = false;}
else {p->active = false; p->success = true;}
p->command = cmd;
p->timer = millis();
byte type;
if (p->type) {type = p->type;}
else {type = tpe;}
// packet
buffTx[POS_TYPE] = type;
buffTx[POS_COMMAND] = cmd;
//////////////buffTx[POS_ADDRESS] = eeAddress;
buffTx[POS_DEST] = dest;
buffTx[POS_REQUIRED] = p->required;
buffTx[POS_NUMBER] = p->number;
clearTxRegion(POS_PASSWORD, PACKET_MAX_BYTES);
setTxRegion(POS_PASSWORD, pwd);
setTxRegion(POS_DATA, dta);
}
обрати внимание на
//////////////buffTx[POS_ADDRESS] = eeAddress;
все работают на одном канале без адреса, значит один запрос количество ответов=количеству сенсоров как будем разгребать ответ?
в коде сенсора
void makePacket(struct Sender *p, byte tpe, byte cmd, byte dest, String pwd, String dta) {
// sender
if (p->required) {p->active = true; p->success = false;}
else {p->active = false; p->success = true;}
p->command = cmd;
p->timer = millis();
byte type;
if (p->type) {type = p->type;}
else {type = tpe;}
// packet
buffTx[POS_TYPE] = type;
buffTx[POS_COMMAND] = cmd;
buffTx[POS_ADDRESS] = eeAddress;
buffTx[POS_DEST] = dest;
buffTx[POS_REQUIRED] = p->required;
buffTx[POS_NUMBER] = p->number;
clearTxRegion(POS_PASSWORD, PACKET_MAX_BYTES);
setTxRegion(POS_PASSWORD, pwd);
setTxRegion(POS_DATA, dta);
p->required = true;
}
сенсор свой адрес пишет и ты его видишь
Чем хороша карусель - если кто то отвалился - это сразу видно с третьей попытки
она не правильно работает если нет адреса и сенсор один то все нормально, а если несколько то к кому мы обращаемся?
аналогично работает 1WARE если датчик 1 то можем не передавать адрес, если несколько то обязаны адресовать иначе все далласы начинают передачу одновременно и обмен падает, так вот тебе надо разделить сенсоры или по трубам или по адресам