Widziałem tu sporo algorytmów Search ROM, na magistrali 1-Wire. Na dobrą sprawę, żaden nie był uniwersalny. Zacząłem się zastanawiać nad własnym, który jednocześnie byłby "zwięzły".
Napisałem poglądowo, coś takiego. To tylko szkic (pseudokod), nie sprawdzałem, bo póki co nie mam "kilku" układów. Czy ma to szanse działać ? Jeśli trzeba, to opiszę tekstowo o co chodzi.
Działa tak, na przykładzie, gdzie pominięto te bity, które nie prowadzą do rozgałęzień. Zawarto jedynie bity rozgałęzień. Kluczowe jest działanie zmiany bitu z 0 na 1, jedynie na końcu konfiguracji i następujące wyczyszczenie jedynek, co pozwala kontynuować przeszukiwanie drzewa.
Kod wydaje się [wstępnie] spełniać postulaty.
Napisałem poglądowo, coś takiego. To tylko szkic (pseudokod), nie sprawdzałem, bo póki co nie mam "kilku" układów. Czy ma to szanse działać ? Jeśli trzeba, to opiszę tekstowo o co chodzi.
// char buffer[N], gdzie N to liczba urządzeń, gdzie
// liczba rozgałęzień wynosi max. N-1,
// zainicjowany jest z zawartością {-1,-1,-1,...,-1}
//
// read/write czyta/pisze na magistralę
// tablicaRekordow[N][64] przechowuje ID układu;
for(int i=0;i<N;i++) {
pozycja=-1;
resetPulse();
searchROM();
for(char bitNo=0;bitNo<64;bitNo++) {
bit=read();
bit_complementary=read();
if ((~(bit|bit_complementary))&0x01) {
pozycja++;
if(buffer[pozycja+1]==-1) {
buffer[pozycja]++;
}
write(buffer[pozycja]);
tablicaRekordow[i][bitNo]=buffer[pozycja];
} else {
write(bit);
tablicaRekordow[i][bitNo]=bit;
}
}
while(buffer[pozycja]) {
buffer[pozycja]=-1;
pozycja--;
}
}Działa tak, na przykładzie, gdzie pominięto te bity, które nie prowadzą do rozgałęzień. Zawarto jedynie bity rozgałęzień. Kluczowe jest działanie zmiany bitu z 0 na 1, jedynie na końcu konfiguracji i następujące wyczyszczenie jedynek, co pozwala kontynuować przeszukiwanie drzewa.
0,0,0,0,-1
0,0,0,0,-1
|
V
0,0,0,1,-1
0,0,0,-1,-1
|
V załóżmy, że pojawiło się nowe rozgałęzienie
0,0,1,0,-1
0,0,1,0,-1
|
V
0,0,1,1,-1
0,0,-1,-1,-1
Kod wydaje się [wstępnie] spełniać postulaty.
