127 lines
2.9 KiB
C++
127 lines
2.9 KiB
C++
/*
|
||
* NOTE: Button center is positive wire. Borders eq. ground
|
||
*/
|
||
|
||
#include "OneWire.h"
|
||
|
||
#define used_pin 10
|
||
#define _DEBUG
|
||
|
||
// KEY_TO_WRITE. SET KEY YOU WANNA WRITE RIGHT HERE
|
||
byte key_to_write[] = { 0x01, 0x5F, 0x69, 0xB, 0x1, 0x0, 0x0, 0xEA };
|
||
|
||
OneWire ds(used_pin); // pin 10 is 1-Wire interface pin now
|
||
|
||
void setup(void) {
|
||
Serial.begin(9600);
|
||
}
|
||
|
||
void loop(void) {
|
||
byte i;
|
||
byte read_data[8];
|
||
|
||
delay(1000); // 1 sec
|
||
|
||
read_key(read_data);
|
||
|
||
if (print_key_connected_status(read_data))
|
||
return;
|
||
|
||
print_key(read_data, 8);
|
||
|
||
if (validate_key(read_data))
|
||
return;
|
||
|
||
if (!checkTypeRW1990()){
|
||
Serial.println("Not RW1990. Not supported.");
|
||
return;
|
||
}
|
||
// UNCOMMENT THIS SECTION FOR FLASHING KEY
|
||
/*
|
||
flash();
|
||
read_key(read_data);
|
||
print_key(read_data, 8);
|
||
*/
|
||
}
|
||
|
||
void read_key(byte* read_data){
|
||
ds.reset();
|
||
ds.write(0x33); // "READ" command
|
||
ds.read_bytes(read_data, 8);
|
||
}
|
||
boolean print_key_connected_status(byte read_data[]){
|
||
// Check if FF:FF:FF:FF:FF:FF:FF:FF . MOST LIKELY (but not always) NOTHING IS PLUGGED IN
|
||
if (read_data[0] & read_data[1] & read_data[2] & read_data[3] & read_data[4] & read_data[5] & read_data[6] & read_data[7] == 0xFF){
|
||
Serial.print(".");
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void print_key(byte *key_array, int size){
|
||
Serial.println();
|
||
Serial.print("[");
|
||
for(int i = 0; i < size; i++) {
|
||
Serial.print(key_array[i], HEX);
|
||
if (i != 7)
|
||
Serial.print(":");
|
||
}
|
||
Serial.println("]");
|
||
}
|
||
|
||
boolean validate_key(byte read_data[]){
|
||
// Check if read key is equal to one that has to be programmed
|
||
for (int i = 0; i < 8; i++){
|
||
if (read_data[i] != key_to_write[i])
|
||
return false;
|
||
}
|
||
Serial.print(" programmed to KEY requested");
|
||
return true;
|
||
}
|
||
|
||
boolean checkTypeRW1990(){
|
||
ds.reset();
|
||
ds.write(0xD1); // attend to remove write flag
|
||
ds.write_bit(1);
|
||
delay(10);
|
||
pinMode(used_pin, INPUT);
|
||
|
||
ds.reset();
|
||
ds.write(0xB5); // Request write flag stat
|
||
byte reply = ds.read();
|
||
#ifdef DEBUG
|
||
Serial.print("Reply RW-1990.1: ");
|
||
Serial.println(reply, HEX);
|
||
#endif
|
||
if (reply == 0xFE) // 0xFE eq. RW-1990, RW-1990.1, ТМ-08, ТМ-08v2
|
||
return true;
|
||
return false;
|
||
}
|
||
|
||
void flash(){
|
||
ds.reset();
|
||
ds.write(0xD1); // write command
|
||
ds.write_bit(0);
|
||
delay(10);
|
||
pinMode(used_pin, INPUT);
|
||
ds.reset();
|
||
ds.write(0xD5);
|
||
for (byte i = 0; i < 8; i++){
|
||
BurnByte(~key_to_write[i]); // invert 4 RW1990.1
|
||
Serial.print('+');
|
||
}
|
||
|
||
ds.write(0xD1); // write flag
|
||
ds.write_bit(1); // stop
|
||
pinMode(used_pin, INPUT);
|
||
delay(10);
|
||
}
|
||
|
||
void BurnByte(byte data){
|
||
for(byte n_bit = 0; n_bit < 8; n_bit++){
|
||
ds.write_bit(data & 1);
|
||
delay(5); // даем время на прошивку каждого бита до 10 мс
|
||
data = data >> 1; // переходим к следующему bit
|
||
}
|
||
pinMode(used_pin, INPUT);
|
||
}
|