[FL-2219, FL-2251] System, FuriCore, FuriHal: various bug fixes and improvements (#986)

* Replace irq shenanigans with critical section
* Power: halt system on power off instead of crash.
* Gui: properly handle input event on NULL current_view
* FuriHal: correct gpio configuration sequence
* FuriHal: cleanup uart initialization. Makefile: allow to disable thread support.
* Loader: improve locking, fix simultaneous app start crash, full command line args support for gui apps, more consistent insomnia
* Loader: correct spelling
* FuriHal: increase gpio configuration readability
* FuriHal: correct gpio configuration error when mode is GpioModeEventRiseFall
Co-authored-by: DrZlo13 <who.just.the.doctor@gmail.com>
This commit is contained in:
あく
2022-02-10 14:20:50 +03:00
committed by GitHub
parent 6b78a8ccfe
commit df2d1ad13f
35 changed files with 1145 additions and 1962 deletions

View File

@@ -59,9 +59,8 @@ KeyReader::~KeyReader() {
bool KeyReader::read_key(iButtonKeyType* key_type, uint8_t* data, uint8_t data_size) {
bool readed = false;
switch(read_mode) {
case ReadMode::DALLAS:
__disable_irq();
if(read_mode == ReadMode::DALLAS) {
FURI_CRITICAL_ENTER();
if(onewire_master->search(data)) {
onewire_master->reset_search();
readed = true;
@@ -69,9 +68,8 @@ bool KeyReader::read_key(iButtonKeyType* key_type, uint8_t* data, uint8_t data_s
} else {
onewire_master->reset_search();
}
__enable_irq();
break;
case ReadMode::CYFRAL_METAKOM:
FURI_CRITICAL_EXIT();
} else if(read_mode == ReadMode::CYFRAL_METAKOM) {
if(cyfral_decoder.read(data, 2)) {
readed = true;
*key_type = iButtonKeyType::KeyCyfral;
@@ -79,7 +77,6 @@ bool KeyReader::read_key(iButtonKeyType* key_type, uint8_t* data, uint8_t data_s
readed = true;
*key_type = iButtonKeyType::KeyMetakom;
}
break;
}
return readed;
@@ -88,10 +85,10 @@ bool KeyReader::read_key(iButtonKeyType* key_type, uint8_t* data, uint8_t data_s
bool KeyReader::verify_key(iButtonKeyType key_type, const uint8_t* const data, uint8_t data_size) {
bool result = true;
switch(key_type) {
case iButtonKeyType::KeyDallas:
if(key_type == iButtonKeyType::KeyDallas) {
switch_to(ReadMode::DALLAS);
__disable_irq();
FURI_CRITICAL_ENTER();
if(onewire_master->reset()) {
onewire_master->write(DS1990::CMD_READ_ROM);
for(uint8_t i = 0; i < data_size; i++) {
@@ -101,14 +98,11 @@ bool KeyReader::verify_key(iButtonKeyType key_type, const uint8_t* const data, u
}
} else {
result = false;
break;
}
__enable_irq();
break;
FURI_CRITICAL_EXIT();
default:
} else {
result = false;
break;
}
return result;

View File

@@ -74,7 +74,7 @@ bool KeyWriter::compare_key_ds1990(iButtonKey* key) {
bool result = false;
if(key->get_key_type() == iButtonKeyType::KeyDallas) {
__disable_irq();
FURI_CRITICAL_ENTER();
bool presence = onewire_master->reset();
if(presence) {
@@ -89,7 +89,7 @@ bool KeyWriter::compare_key_ds1990(iButtonKey* key) {
}
}
__enable_irq();
FURI_CRITICAL_EXIT();
}
return result;
@@ -99,7 +99,7 @@ bool KeyWriter::write_1990_1(iButtonKey* key) {
bool result = false;
if(key->get_key_type() == iButtonKeyType::KeyDallas) {
__disable_irq();
FURI_CRITICAL_ENTER();
// unlock
onewire_master->reset();
@@ -120,7 +120,7 @@ bool KeyWriter::write_1990_1(iButtonKey* key) {
onewire_master->write(RW1990_1::CMD_WRITE_RECORD_FLAG);
onewire_write_one_bit(1);
__enable_irq();
FURI_CRITICAL_EXIT();
if(compare_key_ds1990(key)) {
result = true;
@@ -134,7 +134,7 @@ bool KeyWriter::write_1990_2(iButtonKey* key) {
bool result = false;
if(key->get_key_type() == iButtonKeyType::KeyDallas) {
__disable_irq();
FURI_CRITICAL_ENTER();
// unlock
onewire_master->reset();
@@ -154,7 +154,7 @@ bool KeyWriter::write_1990_2(iButtonKey* key) {
onewire_master->write(RW1990_2::CMD_WRITE_RECORD_FLAG);
onewire_write_one_bit(0);
__enable_irq();
FURI_CRITICAL_EXIT();
if(compare_key_ds1990(key)) {
result = true;
@@ -169,7 +169,7 @@ bool KeyWriter::write_TM2004(iButtonKey* key) {
bool result = true;
if(key->get_key_type() == iButtonKeyType::KeyDallas) {
__disable_irq();
FURI_CRITICAL_ENTER();
// write rom, addr is 0x0000
onewire_master->reset();
@@ -204,7 +204,7 @@ bool KeyWriter::write_TM2004(iButtonKey* key) {
onewire_master->reset();
__enable_irq();
FURI_CRITICAL_EXIT();
} else {
result = false;
}
@@ -216,7 +216,7 @@ bool KeyWriter::write_TM01(iButtonKey* key) {
/*bool result = true;
// TODO test and encoding
__disable_irq();
FURI_CRITICAL_ENTER();
// unlock
onewire_master->reset();
@@ -240,13 +240,13 @@ bool KeyWriter::write_TM01(iButtonKey* key) {
onewire_master->write(TM01::CMD_WRITE_RECORD_FLAG);
onewire_write_one_bit(0, 10000);
__enable_irq();
FURI_CRITICAL_EXIT();
if(!compare_key_ds1990(key)) {
result = false;
}
__disable_irq();
FURI_CRITICAL_ENTER();
if(key->get_key_type() == iButtonKeyType::KeyMetakom ||
key->get_key_type() == iButtonKeyType::KeyCyfral) {
@@ -258,7 +258,7 @@ bool KeyWriter::write_TM01(iButtonKey* key) {
onewire_write_one_bit(1);
}
__enable_irq();
FURI_CRITICAL_EXIT();
return result;*/
return false;
@@ -275,4 +275,4 @@ void KeyWriter::write_byte_ds1990(uint8_t data) {
delay_us(5000);
data = data >> 1;
}
}
}