mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-07-19 00:48:09 -07:00
Merge branch 'flipperdevices:dev' into dev
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
#include "pulse_sequencer.h"
|
||||
|
||||
#include <furi.h>
|
||||
#include <callback-connector.h>
|
||||
#include <furi_hal_resources.h>
|
||||
#include <furi_hal.h>
|
||||
|
||||
void PulseSequencer::set_periods(
|
||||
uint32_t* _periods,
|
||||
@@ -13,74 +13,40 @@ void PulseSequencer::set_periods(
|
||||
}
|
||||
|
||||
void PulseSequencer::start() {
|
||||
callback_pointer = cbc::obtain_connector(this, &PulseSequencer::timer_elapsed_callback);
|
||||
api_interrupt_add(callback_pointer, InterruptTypeTimerUpdate, this);
|
||||
|
||||
period_index = 1;
|
||||
init_timer(periods[period_index]);
|
||||
pin_state = pin_start_state;
|
||||
hal_gpio_write(&ibutton_gpio, pin_state);
|
||||
pin_state = !pin_state;
|
||||
|
||||
HAL_TIM_Base_Start_IT(&htim1);
|
||||
hal_gpio_init(&ibutton_gpio, GpioModeOutputOpenDrain, GpioPullNo, GpioSpeedVeryHigh);
|
||||
furi_hal_ibutton_emulate_start(
|
||||
periods[period_index], PulseSequencer::timer_elapsed_callback, this);
|
||||
}
|
||||
|
||||
void PulseSequencer::stop() {
|
||||
HAL_TIM_Base_Stop_IT(&htim1);
|
||||
|
||||
api_interrupt_remove(callback_pointer, InterruptTypeTimerUpdate);
|
||||
deinit_timer();
|
||||
furi_hal_ibutton_emulate_stop();
|
||||
}
|
||||
|
||||
PulseSequencer::~PulseSequencer() {
|
||||
stop();
|
||||
}
|
||||
|
||||
void PulseSequencer::init_timer(uint32_t period) {
|
||||
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
||||
void PulseSequencer::timer_elapsed_callback(void* context) {
|
||||
PulseSequencer* self = static_cast<PulseSequencer*>(context);
|
||||
|
||||
htim1.Instance = TIM1;
|
||||
htim1.Init.Prescaler = 0;
|
||||
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||
htim1.Init.Period = period;
|
||||
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
||||
htim1.Init.RepetitionCounter = 0;
|
||||
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
||||
if(HAL_TIM_Base_Init(&htim1) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
||||
if(HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) {
|
||||
Error_Handler();
|
||||
furi_hal_ibutton_emulate_set_next(self->periods[self->period_index]);
|
||||
|
||||
if(self->period_index == 0) {
|
||||
self->pin_state = self->pin_start_state;
|
||||
} else {
|
||||
self->pin_state = !self->pin_state;
|
||||
}
|
||||
|
||||
HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
|
||||
hal_gpio_write(&ibutton_gpio, self->pin_state);
|
||||
|
||||
hal_gpio_init(&ibutton_gpio, GpioModeOutputOpenDrain, GpioPullNo, GpioSpeedVeryHigh);
|
||||
}
|
||||
self->period_index++;
|
||||
|
||||
void PulseSequencer::deinit_timer() {
|
||||
}
|
||||
|
||||
void PulseSequencer::timer_elapsed_callback(void* hw, void* context) {
|
||||
PulseSequencer* _this = static_cast<PulseSequencer*>(context);
|
||||
TIM_HandleTypeDef* htim = static_cast<TIM_HandleTypeDef*>(hw);
|
||||
|
||||
if(htim->Instance == TIM1) {
|
||||
htim->Instance->ARR = _this->periods[_this->period_index];
|
||||
|
||||
if(_this->period_index == 0) {
|
||||
_this->pin_state = _this->pin_start_state;
|
||||
} else {
|
||||
_this->pin_state = !_this->pin_state;
|
||||
}
|
||||
|
||||
hal_gpio_write(&ibutton_gpio, _this->pin_state);
|
||||
|
||||
_this->period_index++;
|
||||
|
||||
if(_this->period_index == _this->periods_count) {
|
||||
_this->period_index = 0;
|
||||
}
|
||||
if(self->period_index == self->periods_count) {
|
||||
self->period_index = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,10 +17,10 @@ private:
|
||||
bool pin_state;
|
||||
|
||||
void init_timer(uint32_t period);
|
||||
void deinit_timer();
|
||||
|
||||
void reset_period_index(PulseSequencer* _this);
|
||||
|
||||
void (*callback_pointer)(void*, void*);
|
||||
void timer_elapsed_callback(void* hcomp, void* comp_ctx);
|
||||
};
|
||||
|
||||
static void timer_elapsed_callback(void* comp_ctx);
|
||||
};
|
||||
|
||||
@@ -16,7 +16,9 @@ void iButtonSceneReadedKeyMenu::on_enter(iButtonApp* app) {
|
||||
Submenu* submenu = view_manager->get_submenu();
|
||||
auto callback = cbc::obtain_connector(this, &iButtonSceneReadedKeyMenu::submenu_callback);
|
||||
|
||||
submenu_add_item(submenu, "Write", SubmenuIndexWrite, callback, app);
|
||||
if(app->get_key()->get_key_type() == iButtonKeyType::KeyDallas) {
|
||||
submenu_add_item(submenu, "Write", SubmenuIndexWrite, callback, app);
|
||||
}
|
||||
submenu_add_item(submenu, "Name and save", SubmenuIndexNameAndSave, callback, app);
|
||||
submenu_add_item(submenu, "Emulate", SubmenuIndexEmulate, callback, app);
|
||||
submenu_add_item(submenu, "Read new key", SubmenuIndexReadNewKey, callback, app);
|
||||
|
||||
@@ -18,7 +18,9 @@ void iButtonSceneSavedKeyMenu::on_enter(iButtonApp* app) {
|
||||
auto callback = cbc::obtain_connector(this, &iButtonSceneSavedKeyMenu::submenu_callback);
|
||||
|
||||
submenu_add_item(submenu, "Emulate", SubmenuIndexEmulate, callback, app);
|
||||
submenu_add_item(submenu, "Write", SubmenuIndexWrite, callback, app);
|
||||
if(app->get_key()->get_key_type() == iButtonKeyType::KeyDallas) {
|
||||
submenu_add_item(submenu, "Write", SubmenuIndexWrite, callback, app);
|
||||
}
|
||||
submenu_add_item(submenu, "Edit", SubmenuIndexEdit, callback, app);
|
||||
submenu_add_item(submenu, "Delete", SubmenuIndexDelete, callback, app);
|
||||
submenu_add_item(submenu, "Info", SubmenuIndexInfo, callback, app);
|
||||
|
||||
@@ -32,7 +32,7 @@ bool nfc_mf_classic_dict_get_next_key(Stream* stream, uint64_t* key) {
|
||||
|
||||
bool next_key_read = false;
|
||||
while(!next_key_read) {
|
||||
if(stream_read_line(stream, next_line)) break;
|
||||
if(!stream_read_line(stream, next_line)) break;
|
||||
if(string_get_char(next_line, 0) == '#') continue;
|
||||
if(string_size(next_line) != NFC_MF_CLASSIC_KEY_LEN) continue;
|
||||
for(uint8_t i = 0; i < 12; i += 2) {
|
||||
|
||||
Reference in New Issue
Block a user