mirror of
https://github.com/eried/portapack-mayhem.git
synced 2024-12-27 00:09:36 -05:00
Merge branch 'eried:next' into next
This commit is contained in:
commit
95ac4a2d1e
@ -22,6 +22,7 @@
|
|||||||
#include "ais_app.hpp"
|
#include "ais_app.hpp"
|
||||||
|
|
||||||
#include "string_format.hpp"
|
#include "string_format.hpp"
|
||||||
|
#include "database.hpp"
|
||||||
|
|
||||||
#include "baseband_api.hpp"
|
#include "baseband_api.hpp"
|
||||||
|
|
||||||
@ -62,6 +63,25 @@ static std::string mmsi(
|
|||||||
return to_string_dec_uint(mmsi, 9, '0'); // MMSI is always is always 9 characters pre-padded with zeros
|
return to_string_dec_uint(mmsi, 9, '0'); // MMSI is always is always 9 characters pre-padded with zeros
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static std::string mid(
|
||||||
|
const ais::MMSI& mmsi
|
||||||
|
) {
|
||||||
|
std::database db;
|
||||||
|
std::string mid_code = "";
|
||||||
|
std::database::MidDBRecord mid_record = {};
|
||||||
|
int return_code = 0;
|
||||||
|
|
||||||
|
// Try getting the country name from mids.db using MID code for given MMSI
|
||||||
|
mid_code = to_string_dec_uint(mmsi, 9, ' ').substr(0, 3);
|
||||||
|
return_code = db.retrieve_mid_record(&mid_record, mid_code);
|
||||||
|
switch(return_code) {
|
||||||
|
case DATABASE_RECORD_FOUND: return mid_record.country;
|
||||||
|
case DATABASE_NOT_FOUND: return "No mids.db file";
|
||||||
|
default: return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static std::string navigational_status(const unsigned int value) {
|
static std::string navigational_status(const unsigned int value) {
|
||||||
switch(value) {
|
switch(value) {
|
||||||
case 0: return "under way w/engine";
|
case 0: return "under way w/engine";
|
||||||
@ -271,6 +291,7 @@ void AISRecentEntryDetailView::paint(Painter& painter) {
|
|||||||
auto field_rect = Rect { rect.left(), rect.top() + 16, rect.width(), 16 };
|
auto field_rect = Rect { rect.left(), rect.top() + 16, rect.width(), 16 };
|
||||||
|
|
||||||
field_rect = draw_field(painter, field_rect, s, "MMSI", ais::format::mmsi(entry_.mmsi));
|
field_rect = draw_field(painter, field_rect, s, "MMSI", ais::format::mmsi(entry_.mmsi));
|
||||||
|
field_rect = draw_field(painter, field_rect, s, "Ctry", ais::format::mid(entry_.mmsi));
|
||||||
field_rect = draw_field(painter, field_rect, s, "Name", entry_.name);
|
field_rect = draw_field(painter, field_rect, s, "Name", entry_.name);
|
||||||
field_rect = draw_field(painter, field_rect, s, "Call", entry_.call_sign);
|
field_rect = draw_field(painter, field_rect, s, "Call", entry_.call_sign);
|
||||||
field_rect = draw_field(painter, field_rect, s, "Dest", entry_.destination);
|
field_rect = draw_field(painter, field_rect, s, "Dest", entry_.destination);
|
||||||
|
@ -131,11 +131,11 @@ private:
|
|||||||
AISRecentEntry entry_ { };
|
AISRecentEntry entry_ { };
|
||||||
|
|
||||||
Button button_done {
|
Button button_done {
|
||||||
{ 125, 216, 96, 24 },
|
{ 125, 224, 96, 24 },
|
||||||
"Done"
|
"Done"
|
||||||
};
|
};
|
||||||
Button button_see_map {
|
Button button_see_map {
|
||||||
{ 19, 216, 96, 24 },
|
{ 19, 224, 96, 24 },
|
||||||
"See on map"
|
"See on map"
|
||||||
};
|
};
|
||||||
GeoMapView* geomap_view { nullptr };
|
GeoMapView* geomap_view { nullptr };
|
||||||
@ -169,6 +169,7 @@ private:
|
|||||||
static constexpr uint32_t initial_target_frequency = 162025000;
|
static constexpr uint32_t initial_target_frequency = 162025000;
|
||||||
static constexpr uint32_t sampling_rate = 2457600;
|
static constexpr uint32_t sampling_rate = 2457600;
|
||||||
static constexpr uint32_t baseband_bandwidth = 1750000;
|
static constexpr uint32_t baseband_bandwidth = 1750000;
|
||||||
|
|
||||||
NavigationView& nav_;
|
NavigationView& nav_;
|
||||||
|
|
||||||
AISRecentEntries recent { };
|
AISRecentEntries recent { };
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc.
|
* Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc.
|
||||||
* Copyright (C) 2016 Furrtek
|
* Copyright (C) 2016 Furrtek
|
||||||
|
* Copyleft (ↄ) 2022 NotPike
|
||||||
*
|
*
|
||||||
* This file is part of PortaPack.
|
* This file is part of PortaPack.
|
||||||
*
|
*
|
||||||
@ -121,6 +122,7 @@ void ReplayAppView::start() {
|
|||||||
auto open_error = p->open(file_path);
|
auto open_error = p->open(file_path);
|
||||||
if( open_error.is_valid() ) {
|
if( open_error.is_valid() ) {
|
||||||
file_error();
|
file_error();
|
||||||
|
return; // Fixes TX bug if there's a file error
|
||||||
} else {
|
} else {
|
||||||
reader = std::move(p);
|
reader = std::move(p);
|
||||||
}
|
}
|
||||||
@ -151,16 +153,18 @@ void ReplayAppView::start() {
|
|||||||
};
|
};
|
||||||
field_rfamp.set_value(rf_amp ? 14 : 0);
|
field_rfamp.set_value(rf_amp ? 14 : 0);
|
||||||
|
|
||||||
|
//Enable Bias Tee if selected
|
||||||
|
radio::set_antenna_bias(portapack::get_antenna_bias());
|
||||||
|
|
||||||
radio::enable({
|
radio::enable({
|
||||||
receiver_model.tuning_frequency(),
|
receiver_model.tuning_frequency(),
|
||||||
sample_rate * 8 ,
|
sample_rate * 8,
|
||||||
baseband_bandwidth,
|
baseband_bandwidth,
|
||||||
rf::Direction::Transmit,
|
rf::Direction::Transmit,
|
||||||
rf_amp, // previous code line : "receiver_model.rf_amp()," was passing the same rf_amp of all Receiver Apps
|
rf_amp, // previous code line : "receiver_model.rf_amp()," was passing the same rf_amp of all Receiver Apps
|
||||||
static_cast<int8_t>(receiver_model.lna()),
|
static_cast<int8_t>(receiver_model.lna()),
|
||||||
static_cast<int8_t>(receiver_model.vga())
|
static_cast<int8_t>(receiver_model.vga())
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReplayAppView::stop(const bool do_loop) {
|
void ReplayAppView::stop(const bool do_loop) {
|
||||||
@ -170,6 +174,7 @@ void ReplayAppView::stop(const bool do_loop) {
|
|||||||
if (do_loop && check_loop.value()) {
|
if (do_loop && check_loop.value()) {
|
||||||
start();
|
start();
|
||||||
} else {
|
} else {
|
||||||
|
radio::set_antenna_bias(false); //Turn off Bias Tee
|
||||||
radio::disable();
|
radio::disable();
|
||||||
button_play.set_bitmap(&bitmap_play);
|
button_play.set_bitmap(&bitmap_play);
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,8 @@ namespace tpms {
|
|||||||
|
|
||||||
namespace format {
|
namespace format {
|
||||||
|
|
||||||
|
static bool use_kpa = true;
|
||||||
|
|
||||||
std::string type(Reading::Type type) {
|
std::string type(Reading::Type type) {
|
||||||
return to_string_dec_uint(toUType(type), 2);
|
return to_string_dec_uint(toUType(type), 2);
|
||||||
}
|
}
|
||||||
@ -43,7 +45,11 @@ std::string id(TransponderID id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string pressure(Pressure pressure) {
|
std::string pressure(Pressure pressure) {
|
||||||
|
if(use_kpa){
|
||||||
return to_string_dec_int(pressure.kilopascal(), 3);
|
return to_string_dec_int(pressure.kilopascal(), 3);
|
||||||
|
}
|
||||||
|
return to_string_dec_int(pressure.psi(), 3);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string temperature(Temperature temperature) {
|
std::string temperature(Temperature temperature) {
|
||||||
@ -142,7 +148,7 @@ TPMSAppView::TPMSAppView(NavigationView&) {
|
|||||||
&field_rf_amp,
|
&field_rf_amp,
|
||||||
&field_lna,
|
&field_lna,
|
||||||
&field_vga,
|
&field_vga,
|
||||||
&recent_entries_view,
|
&options_type,
|
||||||
});
|
});
|
||||||
|
|
||||||
radio::enable({
|
radio::enable({
|
||||||
@ -160,6 +166,17 @@ TPMSAppView::TPMSAppView(NavigationView&) {
|
|||||||
};
|
};
|
||||||
options_band.set_by_value(target_frequency());
|
options_band.set_by_value(target_frequency());
|
||||||
|
|
||||||
|
options_type.on_change = [this](size_t, int32_t i) {
|
||||||
|
if (i == 0){
|
||||||
|
tpms::format::use_kpa = true;
|
||||||
|
} else if (i == 1){
|
||||||
|
tpms::format::use_kpa = false;
|
||||||
|
}
|
||||||
|
update_type();
|
||||||
|
};
|
||||||
|
|
||||||
|
options_type.set_selected_index(0, true);
|
||||||
|
|
||||||
logger = std::make_unique<TPMSLogger>();
|
logger = std::make_unique<TPMSLogger>();
|
||||||
if( logger ) {
|
if( logger ) {
|
||||||
logger->append(u"tpms.txt");
|
logger->append(u"tpms.txt");
|
||||||
@ -176,9 +193,24 @@ void TPMSAppView::focus() {
|
|||||||
options_band.focus();
|
options_band.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TPMSAppView::update_type() {
|
||||||
|
if (tpms::format::use_kpa){
|
||||||
|
remove_child(&recent_entries_view_psi);
|
||||||
|
add_child(&recent_entries_view_kpa);
|
||||||
|
recent_entries_view_kpa.set_parent_rect(view_normal_rect);
|
||||||
|
} else {
|
||||||
|
remove_child(&recent_entries_view_kpa);
|
||||||
|
add_child(&recent_entries_view_psi);
|
||||||
|
recent_entries_view_psi.set_parent_rect(view_normal_rect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TPMSAppView::set_parent_rect(const Rect new_parent_rect) {
|
void TPMSAppView::set_parent_rect(const Rect new_parent_rect) {
|
||||||
View::set_parent_rect(new_parent_rect);
|
View::set_parent_rect(new_parent_rect);
|
||||||
recent_entries_view.set_parent_rect({ 0, header_height, new_parent_rect.width(), new_parent_rect.height() - header_height });
|
|
||||||
|
view_normal_rect = { 0, header_height, new_parent_rect.width(), new_parent_rect.height() - header_height };
|
||||||
|
|
||||||
|
update_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TPMSAppView::on_packet(const tpms::Packet& packet) {
|
void TPMSAppView::on_packet(const tpms::Packet& packet) {
|
||||||
@ -191,13 +223,23 @@ void TPMSAppView::on_packet(const tpms::Packet& packet) {
|
|||||||
const auto reading = reading_opt.value();
|
const auto reading = reading_opt.value();
|
||||||
auto& entry = ::on_packet(recent, TPMSRecentEntry::Key { reading.type(), reading.id() });
|
auto& entry = ::on_packet(recent, TPMSRecentEntry::Key { reading.type(), reading.id() });
|
||||||
entry.update(reading);
|
entry.update(reading);
|
||||||
recent_entries_view.set_dirty();
|
|
||||||
|
if(tpms::format::use_kpa){
|
||||||
|
recent_entries_view_kpa.set_dirty();
|
||||||
|
} else {
|
||||||
|
recent_entries_view_psi.set_dirty();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TPMSAppView::on_show_list() {
|
void TPMSAppView::on_show_list() {
|
||||||
recent_entries_view.hidden(false);
|
if(tpms::format::use_kpa){
|
||||||
recent_entries_view.focus();
|
recent_entries_view_kpa.hidden(false);
|
||||||
|
recent_entries_view_kpa.focus();
|
||||||
|
} else {
|
||||||
|
recent_entries_view_psi.hidden(false);
|
||||||
|
recent_entries_view_psi.focus();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TPMSAppView::on_band_changed(const uint32_t new_band_frequency) {
|
void TPMSAppView::on_band_changed(const uint32_t new_band_frequency) {
|
||||||
|
@ -121,6 +121,8 @@ private:
|
|||||||
|
|
||||||
static constexpr ui::Dim header_height = 1 * 16;
|
static constexpr ui::Dim header_height = 1 * 16;
|
||||||
|
|
||||||
|
ui::Rect view_normal_rect { };
|
||||||
|
|
||||||
RSSI rssi {
|
RSSI rssi {
|
||||||
{ 21 * 8, 0, 6 * 8, 4 },
|
{ 21 * 8, 0, 6 * 8, 4 },
|
||||||
};
|
};
|
||||||
@ -138,6 +140,15 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
OptionsField options_type {
|
||||||
|
{ 5 * 8, 0 * 16 },
|
||||||
|
3,
|
||||||
|
{
|
||||||
|
{ "kPa", 0 },
|
||||||
|
{ "PSI", 1 }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
RFAmpField field_rf_amp {
|
RFAmpField field_rf_amp {
|
||||||
{ 13 * 8, 0 * 16 }
|
{ 13 * 8, 0 * 16 }
|
||||||
};
|
};
|
||||||
@ -153,7 +164,7 @@ private:
|
|||||||
TPMSRecentEntries recent { };
|
TPMSRecentEntries recent { };
|
||||||
std::unique_ptr<TPMSLogger> logger { };
|
std::unique_ptr<TPMSLogger> logger { };
|
||||||
|
|
||||||
const RecentEntriesColumns columns { {
|
const RecentEntriesColumns columns_kpa { {
|
||||||
{ "Tp", 2 },
|
{ "Tp", 2 },
|
||||||
{ "ID", 8 },
|
{ "ID", 8 },
|
||||||
{ "kPa", 3 },
|
{ "kPa", 3 },
|
||||||
@ -161,12 +172,23 @@ private:
|
|||||||
{ "Cnt", 3 },
|
{ "Cnt", 3 },
|
||||||
{ "Fl", 2 },
|
{ "Fl", 2 },
|
||||||
} };
|
} };
|
||||||
TPMSRecentEntriesView recent_entries_view { columns, recent };
|
TPMSRecentEntriesView recent_entries_view_kpa { columns_kpa, recent };
|
||||||
|
|
||||||
|
const RecentEntriesColumns columns_psi { {
|
||||||
|
{ "Tp", 2 },
|
||||||
|
{ "ID", 8 },
|
||||||
|
{ "PSI", 3 },
|
||||||
|
{ "C", 3 },
|
||||||
|
{ "Cnt", 3 },
|
||||||
|
{ "Fl", 2 },
|
||||||
|
} };
|
||||||
|
TPMSRecentEntriesView recent_entries_view_psi { columns_psi, recent };
|
||||||
|
|
||||||
uint32_t target_frequency_ = initial_target_frequency;
|
uint32_t target_frequency_ = initial_target_frequency;
|
||||||
|
|
||||||
void on_packet(const tpms::Packet& packet);
|
void on_packet(const tpms::Packet& packet);
|
||||||
void on_show_list();
|
void on_show_list();
|
||||||
|
void update_type();
|
||||||
|
|
||||||
void on_band_changed(const uint32_t new_band_frequency);
|
void on_band_changed(const uint32_t new_band_frequency);
|
||||||
|
|
||||||
|
@ -24,6 +24,10 @@
|
|||||||
|
|
||||||
#include "baseband_api.hpp"
|
#include "baseband_api.hpp"
|
||||||
#include "audio.hpp"
|
#include "audio.hpp"
|
||||||
|
|
||||||
|
#include "wm8731.hpp"
|
||||||
|
using wolfson::wm8731::WM8731;
|
||||||
|
|
||||||
#include "tonesets.hpp"
|
#include "tonesets.hpp"
|
||||||
#include "portapack_hal.hpp"
|
#include "portapack_hal.hpp"
|
||||||
#include "string_format.hpp"
|
#include "string_format.hpp"
|
||||||
@ -34,6 +38,10 @@
|
|||||||
using namespace tonekey;
|
using namespace tonekey;
|
||||||
using namespace portapack;
|
using namespace portapack;
|
||||||
|
|
||||||
|
|
||||||
|
WM8731 audio_codec_wm8731 { i2c0, 0x1a };
|
||||||
|
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
void MicTXView::focus() {
|
void MicTXView::focus() {
|
||||||
@ -178,7 +186,7 @@ void MicTXView::rxaudio(bool is_on) {
|
|||||||
|
|
||||||
baseband::run_image(portapack::spi_flash::image_tag_mic_tx);
|
baseband::run_image(portapack::spi_flash::image_tag_mic_tx);
|
||||||
audio::output::stop();
|
audio::output::stop();
|
||||||
audio::input::start();
|
audio::input::start(ak4951_alc_GUI_selected); // set up audio input = mic config of any audio coded AK4951/WM8731, (in WM8731 parameter will be ignored)
|
||||||
portapack::pin_i2s0_rx_sda.mode(3);
|
portapack::pin_i2s0_rx_sda.mode(3);
|
||||||
configure_baseband();
|
configure_baseband();
|
||||||
}
|
}
|
||||||
@ -203,10 +211,12 @@ MicTXView::MicTXView(
|
|||||||
|
|
||||||
baseband::run_image(portapack::spi_flash::image_tag_mic_tx);
|
baseband::run_image(portapack::spi_flash::image_tag_mic_tx);
|
||||||
|
|
||||||
|
|
||||||
|
if ( audio_codec_wm8731.detected() ) {
|
||||||
add_children({
|
add_children({
|
||||||
&labels,
|
&labels_WM8731, // we have audio codec WM8731, same MIC menu as original.
|
||||||
&vumeter,
|
&vumeter,
|
||||||
&options_gain,
|
&options_gain, // MIC GAIN float factor on the GUI.
|
||||||
// &check_va,
|
// &check_va,
|
||||||
&field_va,
|
&field_va,
|
||||||
&field_va_level,
|
&field_va_level,
|
||||||
@ -230,6 +240,37 @@ MicTXView::MicTXView(
|
|||||||
&tx_button
|
&tx_button
|
||||||
});
|
});
|
||||||
|
|
||||||
|
} else {
|
||||||
|
add_children({
|
||||||
|
&labels_AK4951, // we have audio codec AK4951, enable Automatic Level Control
|
||||||
|
&vumeter,
|
||||||
|
&options_gain,
|
||||||
|
&options_ak4951_alc_mode,
|
||||||
|
// &check_va,
|
||||||
|
&field_va,
|
||||||
|
&field_va_level,
|
||||||
|
&field_va_attack,
|
||||||
|
&field_va_decay,
|
||||||
|
&field_bw,
|
||||||
|
&field_rfgain,
|
||||||
|
&field_rfamp,
|
||||||
|
&options_mode,
|
||||||
|
&field_frequency,
|
||||||
|
&options_tone_key,
|
||||||
|
&check_rogerbeep,
|
||||||
|
&check_rxactive,
|
||||||
|
&field_volume,
|
||||||
|
&field_rxbw,
|
||||||
|
&field_squelch,
|
||||||
|
&field_rxfrequency,
|
||||||
|
&field_rxlna,
|
||||||
|
&field_rxvga,
|
||||||
|
&field_rxamp,
|
||||||
|
&tx_button
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
tone_keys_populate(options_tone_key);
|
tone_keys_populate(options_tone_key);
|
||||||
options_tone_key.on_change = [this](size_t i, int32_t) {
|
options_tone_key.on_change = [this](size_t i, int32_t) {
|
||||||
tone_key_index = i;
|
tone_key_index = i;
|
||||||
@ -242,6 +283,12 @@ MicTXView::MicTXView(
|
|||||||
};
|
};
|
||||||
options_gain.set_selected_index(1); // x1.0
|
options_gain.set_selected_index(1); // x1.0
|
||||||
|
|
||||||
|
options_ak4951_alc_mode.on_change = [this](size_t, int8_t v) {
|
||||||
|
ak4951_alc_GUI_selected = v;
|
||||||
|
audio::input::start(ak4951_alc_GUI_selected);
|
||||||
|
};
|
||||||
|
// options_ak4951_alc_mode.set_selected_index(0);
|
||||||
|
|
||||||
tx_frequency = transmitter_model.tuning_frequency();
|
tx_frequency = transmitter_model.tuning_frequency();
|
||||||
field_frequency.set_value(transmitter_model.tuning_frequency());
|
field_frequency.set_value(transmitter_model.tuning_frequency());
|
||||||
field_frequency.set_step(receiver_model.frequency_step());
|
field_frequency.set_step(receiver_model.frequency_step());
|
||||||
@ -478,7 +525,7 @@ MicTXView::MicTXView(
|
|||||||
set_tx(false);
|
set_tx(false);
|
||||||
|
|
||||||
audio::set_rate(audio::Rate::Hz_24000);
|
audio::set_rate(audio::Rate::Hz_24000);
|
||||||
audio::input::start();
|
audio::input::start(ak4951_alc_GUI_selected); // originally , audio::input::start(); (we added parameter)
|
||||||
}
|
}
|
||||||
|
|
||||||
MicTXView::~MicTXView() {
|
MicTXView::~MicTXView() {
|
||||||
|
@ -83,6 +83,7 @@ private:
|
|||||||
bool rx_enabled { false };
|
bool rx_enabled { false };
|
||||||
uint32_t tone_key_index { };
|
uint32_t tone_key_index { };
|
||||||
float mic_gain { 1.0 };
|
float mic_gain { 1.0 };
|
||||||
|
uint8_t ak4951_alc_GUI_selected { 0 };
|
||||||
uint32_t audio_level { 0 };
|
uint32_t audio_level { 0 };
|
||||||
uint32_t va_level { };
|
uint32_t va_level { };
|
||||||
uint32_t attack_ms { };
|
uint32_t attack_ms { };
|
||||||
@ -106,8 +107,8 @@ private:
|
|||||||
bool enable_lsb { false };
|
bool enable_lsb { false };
|
||||||
|
|
||||||
|
|
||||||
Labels labels {
|
Labels labels_WM8731 {
|
||||||
{ { 3 * 8, 1 * 8 }, "MIC. GAIN:", Color::light_grey() },
|
{ { 3 * 8, 1 * 8 }, "MIC-GAIN:", Color::light_grey() },
|
||||||
{ { 3 * 8, 3 * 8 }, "F:", Color::light_grey() },
|
{ { 3 * 8, 3 * 8 }, "F:", Color::light_grey() },
|
||||||
{ { 15 * 8, 3 * 8 }, "BW: FM kHz", Color::light_grey() },
|
{ { 15 * 8, 3 * 8 }, "BW: FM kHz", Color::light_grey() },
|
||||||
{ { 3 * 8, 5 * 8 }, "GAIN:", Color::light_grey() },
|
{ { 3 * 8, 5 * 8 }, "GAIN:", Color::light_grey() },
|
||||||
@ -118,8 +119,29 @@ private:
|
|||||||
{ {12 * 8, 10 * 8 }, "ATT:", Color::light_grey() },
|
{ {12 * 8, 10 * 8 }, "ATT:", Color::light_grey() },
|
||||||
{ {20 * 8, 10 * 8 }, "DEC:", Color::light_grey() },
|
{ {20 * 8, 10 * 8 }, "DEC:", Color::light_grey() },
|
||||||
{ { 4 * 8, ( 13 * 8 ) - 2 }, "TONE KEY:", Color::light_grey() },
|
{ { 4 * 8, ( 13 * 8 ) - 2 }, "TONE KEY:", Color::light_grey() },
|
||||||
{ { 9 * 8, 23 * 8 }, "VOL:", Color::light_grey() },
|
{ { 7 * 8, 23 * 8 }, "VOL:", Color::light_grey() },
|
||||||
{ {17 * 8, 23 * 8 }, "FM RXBW:", Color::light_grey() },
|
{ {15 * 8, 23 * 8 }, "FM RXBW:", Color::light_grey() },
|
||||||
|
{ {17 * 8, 25 * 8 }, "SQ:", Color::light_grey() },
|
||||||
|
{ { 5 * 8, 25 * 8 }, "F:", Color::light_grey() },
|
||||||
|
{ { 5 * 8, 27 * 8 }, "LNA:", Color::light_grey()},
|
||||||
|
{ {12 * 8, 27 * 8 }, "VGA:", Color::light_grey()},
|
||||||
|
{ {19 * 8, 27 * 8 }, "AMP:", Color::light_grey()}
|
||||||
|
};
|
||||||
|
Labels labels_AK4951 {
|
||||||
|
{ { 3 * 8, 1 * 8 }, "MIC-GAIN:", Color::light_grey() },
|
||||||
|
{ { 17 * 8, 1 * 8 }, "ALC", Color::light_grey() },
|
||||||
|
{ { 3 * 8, 3 * 8 }, "F:", Color::light_grey() },
|
||||||
|
{ { 15 * 8, 3 * 8 }, "BW: FM kHz", Color::light_grey() },
|
||||||
|
{ { 3 * 8, 5 * 8 }, "GAIN:", Color::light_grey() },
|
||||||
|
{ {11 * 8, 5 * 8 }, "Amp:", Color::light_grey() },
|
||||||
|
{ { 18 * 8, (5 * 8) }, "Mode:", Color::light_grey() },
|
||||||
|
{ { 3 * 8, 8 * 8 }, "TX Activation:", Color::light_grey() },
|
||||||
|
{ { 4 * 8, 10 * 8 }, "LVL:", Color::light_grey() },
|
||||||
|
{ {12 * 8, 10 * 8 }, "ATT:", Color::light_grey() },
|
||||||
|
{ {20 * 8, 10 * 8 }, "DEC:", Color::light_grey() },
|
||||||
|
{ { 4 * 8, ( 13 * 8 ) - 2 }, "TONE KEY:", Color::light_grey() },
|
||||||
|
{ { 7 * 8, 23 * 8 }, "VOL:", Color::light_grey() },
|
||||||
|
{ {15 * 8, 23 * 8 }, "FM RXBW:", Color::light_grey() },
|
||||||
{ {17 * 8, 25 * 8 }, "SQ:", Color::light_grey() },
|
{ {17 * 8, 25 * 8 }, "SQ:", Color::light_grey() },
|
||||||
{ { 5 * 8, 25 * 8 }, "F:", Color::light_grey() },
|
{ { 5 * 8, 25 * 8 }, "F:", Color::light_grey() },
|
||||||
{ { 5 * 8, 27 * 8 }, "LNA:", Color::light_grey()},
|
{ { 5 * 8, 27 * 8 }, "LNA:", Color::light_grey()},
|
||||||
@ -135,7 +157,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
OptionsField options_gain {
|
OptionsField options_gain {
|
||||||
{ 13 * 8, 1 * 8 },
|
{ 12 * 8, 1 * 8 },
|
||||||
4,
|
4,
|
||||||
{
|
{
|
||||||
{ "x0.5", 5 },
|
{ "x0.5", 5 },
|
||||||
@ -145,6 +167,25 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
OptionsField options_ak4951_alc_mode {
|
||||||
|
{ 20 * 8, 1 * 8 }, // Coordinates are: int:x (px), int:y (px)
|
||||||
|
11,
|
||||||
|
{
|
||||||
|
{ " OFF-20kHz", 0 }, // Nothing changed from ORIGINAL,keeping ALL programm. AK4951 Dig. block->OFF)
|
||||||
|
{ "+12dB-6kHz", 1 }, // ALC-> on, (+12dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
{ "+09dB-6kHz", 2 }, // ALC-> on, (+09dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
{ "+06dB-6kHz", 3 }, // ALC-> on, (+06dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
{ "+03dB-2kHz", 4 }, // ALC-> on, (+03dB's) Auto Vol max + Wind Noise cancel + LPF 3,5k + Pre-amp Mic (+21dB=original)+ EQ boosting ~<2kHz (f0~1k1,fb:1,7K, k=1,8)
|
||||||
|
{ "+03dB-4kHz", 5 }, // ALC-> on, (+03dB's) Auto Vol max + Wind Noise cancel + LPF 4kHz + Pre-amp Mic (+21dB=original)+ EQ boosting ~<3kHz (f0~1k4,fb~2,4k, k=1,8)
|
||||||
|
{ "+03dB-6kHz", 6 }, // ALC-> on, (+03dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
{ "+00dB-6kHz", 7 }, // ALC-> on, (+00dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
{ "-03dB-6kHz", 8 }, // ALC-> on, (-03dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
{ "-06dB-6kHz", 9 }, // ALC-> on, (-06dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
{ "-09dB-6kHz", 10 }, // ALC-> on, (-09dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz - Pre-amp MIC -3dB (18dB's)
|
||||||
|
{ "-12dB-6kHz", 11 }, // ALC-> on, (-12dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz - Pre-amp MIC -6dB (15dB's)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
FrequencyField field_frequency {
|
FrequencyField field_frequency {
|
||||||
{ 5 * 8, 3 * 8 },
|
{ 5 * 8, 3 * 8 },
|
||||||
};
|
};
|
||||||
@ -244,7 +285,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
NumberField field_volume {
|
NumberField field_volume {
|
||||||
{ 13 * 8, 23 * 8 },
|
{ 11* 8, 23 * 8 },
|
||||||
2,
|
2,
|
||||||
{ 0, 99 },
|
{ 0, 99 },
|
||||||
1,
|
1,
|
||||||
@ -252,7 +293,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
OptionsField field_rxbw {
|
OptionsField field_rxbw {
|
||||||
{ 25 * 8, 23 * 8},
|
{ 23* 8, 23 * 8},
|
||||||
3,
|
3,
|
||||||
{
|
{
|
||||||
{"8k5", 0},
|
{"8k5", 0},
|
||||||
|
@ -168,8 +168,8 @@ void speaker_mute() {
|
|||||||
|
|
||||||
namespace input {
|
namespace input {
|
||||||
|
|
||||||
void start() {
|
void start(int8_t alc_mode) {
|
||||||
audio_codec->microphone_enable();
|
audio_codec->microphone_enable(alc_mode); // added user-GUI selection for AK4951, ALC mode parameter.
|
||||||
i2s::i2s0::rx_start();
|
i2s::i2s0::rx_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ public:
|
|||||||
virtual volume_range_t headphone_gain_range() const = 0;
|
virtual volume_range_t headphone_gain_range() const = 0;
|
||||||
virtual void set_headphone_volume(const volume_t volume) = 0;
|
virtual void set_headphone_volume(const volume_t volume) = 0;
|
||||||
|
|
||||||
virtual void microphone_enable() = 0;
|
virtual void microphone_enable(int8_t alc_mode) = 0; // added user-GUI AK4951 ,selected ALC mode.
|
||||||
virtual void microphone_disable() = 0;
|
virtual void microphone_disable() = 0;
|
||||||
|
|
||||||
virtual size_t reg_count() const = 0;
|
virtual size_t reg_count() const = 0;
|
||||||
@ -59,7 +59,7 @@ public:
|
|||||||
|
|
||||||
namespace output {
|
namespace output {
|
||||||
|
|
||||||
void start();
|
void start(); // this other start(),no changed. ,in namespace output , used to config audio playback mode,
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
void mute();
|
void mute();
|
||||||
@ -72,7 +72,7 @@ void speaker_unmute();
|
|||||||
|
|
||||||
namespace input {
|
namespace input {
|
||||||
|
|
||||||
void start();
|
void start(int8_t alc_mode); // added parameter user-GUI select AK4951-ALC mode for config mic path,(recording mode in datasheet),
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
} /* namespace input */
|
} /* namespace input */
|
||||||
|
@ -27,6 +27,16 @@
|
|||||||
|
|
||||||
namespace std {
|
namespace std {
|
||||||
|
|
||||||
|
int database::retrieve_mid_record(MidDBRecord* record, std::string search_term){
|
||||||
|
|
||||||
|
file_path = "AIS/mids.db";
|
||||||
|
index_item_length = 4;
|
||||||
|
record_length = 32;
|
||||||
|
|
||||||
|
result = std::database::retrieve_record(file_path, index_item_length, record_length, record, search_term);
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
int database::retrieve_airline_record(AirlinesDBRecord* record, std::string search_term){
|
int database::retrieve_airline_record(AirlinesDBRecord* record, std::string search_term){
|
||||||
|
|
||||||
|
@ -44,6 +44,12 @@ public:
|
|||||||
#define DATABASE_NOT_FOUND -1 // database not found / could not be opened
|
#define DATABASE_NOT_FOUND -1 // database not found / could not be opened
|
||||||
#define DATABASE_RECORD_NOT_FOUND -2 // record could not be found in database
|
#define DATABASE_RECORD_NOT_FOUND -2 // record could not be found in database
|
||||||
|
|
||||||
|
struct MidDBRecord {
|
||||||
|
char country[32]; // country name
|
||||||
|
};
|
||||||
|
|
||||||
|
int retrieve_mid_record(MidDBRecord* record, std::string search_term);
|
||||||
|
|
||||||
struct AirlinesDBRecord {
|
struct AirlinesDBRecord {
|
||||||
char airline[32]; // airline name
|
char airline[32]; // airline name
|
||||||
char country[32]; // country name
|
char country[32]; // country name
|
||||||
|
@ -212,90 +212,347 @@ void AK4951::speaker_disable() {
|
|||||||
set_speaker_power(false);
|
set_speaker_power(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AK4951::microphone_enable() {
|
void AK4951::microphone_enable(int8_t alc_mode) {
|
||||||
// map.r.digital_mic.DMIC = 0;
|
// alc_mode =0 = (OFF =same as original code = NOT using AK4951 Programmable digital filter block),
|
||||||
// update(Register::DigitalMic);
|
// alc_mode >1 (with DIGITAL FILTER BLOCK , example : 1:(+12dB) , 2:(+9dB)", 3:(+6dB), ...)
|
||||||
|
|
||||||
const uint_fast8_t mgain = 0b0111;
|
// map.r.digital_mic.DMIC = 0; // originally commented code
|
||||||
map.r.signal_select_1.MGAIN20 = mgain & 7;
|
// update(Register::DigitalMic); // originally commented code
|
||||||
map.r.signal_select_1.PMMP = 1;
|
|
||||||
map.r.signal_select_1.MPSEL = 1; // MPWR2 pin
|
|
||||||
map.r.signal_select_1.MGAIN3 = (mgain >> 3) & 1;
|
|
||||||
update(Register::SignalSelect1);
|
|
||||||
|
|
||||||
map.r.signal_select_2.INL = 0b01; // Lch input signal = LIN2
|
uint_fast8_t mgain =0b0111; // Pre-amp mic (Original code, =0b0111 (+21dB's=7x3dBs),(Max is NOT 0b1111!, it is 0b1010=+30dBs=10x3dBs)
|
||||||
map.r.signal_select_2.INR = 0b01; // Rch input signal = RIN2
|
|
||||||
map.r.signal_select_2.MICL = 0; // MPWR = 2.4V
|
|
||||||
update(Register::SignalSelect2);
|
|
||||||
|
|
||||||
// map.r.r_ch_mic_gain_setting.MGR = 0x80; // Microphone sensitivity correction = 0dB.
|
map.r.signal_select_2.INL = 0b01; // Lch input signal = LIN2 , our ext. MONO MIC is connected here LIN2 in Portapack.
|
||||||
// update(Register::RchMicGainSetting);
|
map.r.signal_select_2.INR = 0b01; // Rch input signal = RIN2 , Not used ,not connected ,but no problem.
|
||||||
/*
|
map.r.signal_select_2.MICL = 0; // MPWR = 2.4V (it has two possible settings , 2.4V or 2.0V) , (majority smarthphones around 2V , range 1V-5V)
|
||||||
map.r.timer_select.FRN = ?;
|
update(Register::SignalSelect2);
|
||||||
map.r.timer_select.FRATT = ?;
|
|
||||||
map.r.timer_select.ADRST = 0b??;
|
|
||||||
update(Register::TimerSelect);
|
|
||||||
|
|
||||||
map.r.alc_timer_select. = ?;
|
// ------Common code part, = original setting conditions, it is fine for all user-GUI alc_modes: OFF , and ALC modes .*/
|
||||||
update(Register::ALCTimerSelect);
|
map.r.digital_filter_select_1.HPFAD = 1; // HPF1 ON (after ADC);page 40 datasheet, HPFAD bit controls the ON/OFF of the HPF1 (HPF ON is recommended).
|
||||||
map.r.alc_mode_control_1. = ?;
|
map.r.digital_filter_select_1.HPFC = 0b11; // HPF Cut off frequency of high pass filter from 236.8 Hz @fs=48k ("00":3.7Hz, "01":14,8Hz, "10":118,4Hz)
|
||||||
map.r.alc_mode_control_1.ALC = 1;
|
update(Register::DigitalFilterSelect1);
|
||||||
update(Register::ALCModeControl1);
|
|
||||||
|
|
||||||
map.r.alc_mode_control_2.REF = ?;
|
// map.r.r_ch_mic_gain_setting.MGR = 0x80; // Microphone sensitivity correction = 0dB., (not used by now , original code cond.)
|
||||||
update(Register::ALCModeControl2);
|
// update(Register::RchMicGainSetting); // (those two lines , not activated, same as original)
|
||||||
*/
|
|
||||||
// map.r.l_ch_input_volume_control.IV = 0xe1;
|
// pre-load 4 byes LPF coefficicients (.lpf_coefficient_0,1,2,3), FSA 14..0, FSB 14..0 , (fcut initial 6kHz, fs 48Khz).
|
||||||
// update(Register::LchInputVolumeControl);
|
// it will be default pre-loading coeff. for al ALC modes, LPF bit is activated down, for all ALC digital modes.
|
||||||
// map.r.r_ch_input_volume_control.IV = 0xe1;
|
map.r.lpf_coefficient_0.l = 0x5F; // Pre-loading here LPF 6kHz, 1st Order from digital Block , Fc=6000 Hz, fs = 48khz
|
||||||
// update(Register::RchInputVolumeControl);
|
map.r.lpf_coefficient_1.h = 0x09; // LPF bit is activated down, for all ALC digital modes.
|
||||||
/*
|
map.r.lpf_coefficient_2.l = 0xBF; // Writting reg to AK4951, with "update", following instructions.
|
||||||
map.r.auto_hpf_control.STG = 0b00;
|
map.r.lpf_coefficient_3.h = 0x32;
|
||||||
map.r.auto_hpf_control.SENC = 0b011;
|
|
||||||
map.r.auto_hpf_control.AHPF = 0;
|
update(Register::LPFCoefficient0); // Writing pre-loaded 4 bytes LPF CoefFiecients 14 bits (FSA13..0, FSB13..0
|
||||||
update(Register::AutoHPFControl);
|
update(Register::LPFCoefficient1); // In this case , LPF 6KHz , when we activate the LPF block.
|
||||||
*/
|
update(Register::LPFCoefficient2);
|
||||||
map.r.digital_filter_select_1.HPFAD = 1; // HPF1 (after ADC) = on
|
update(Register::LPFCoefficient3);
|
||||||
map.r.digital_filter_select_1.HPFC = 0b11; // 2336.8 Hz @ fs=48k
|
|
||||||
update(Register::DigitalFilterSelect1);
|
// Reset , setting OFF all 5 x Digital Equalizer filters
|
||||||
/*
|
map.r.digital_filter_select_3.EQ1 = 0; // EQ1 Coeffic Setting , (0: Disable-default, audio data passes EQ1 block by 0dB gain). When EQ1="1”, the settings of E1A15-0, E1B15-0 and E1C15-0 bits are enabled
|
||||||
map.r.digital_filter_select_2.HPF = 0;
|
map.r.digital_filter_select_3.EQ2 = 0; // EQ2 Coeffic Setting , (0: Disable-default, audio data passes EQ2 block by 0dB gain). When EQ2="1”, the settings of E2A15-0, E2B15-0 and E2C15-0 bits are enabled
|
||||||
map.r.digital_filter_select_2.LPF = 0;
|
map.r.digital_filter_select_3.EQ3 = 0; // EQ3 Coeffic Setting , (0: Disable-default, audio data passes EQ3 block by 0dB gain). When EQ3="1”, the settings of E3A15-0, E3B15-0 and E3C15-0 bits are enabled
|
||||||
map.r.digital_filter_select_2.FIL3 = 0;
|
map.r.digital_filter_select_3.EQ4 = 0; // EQ4 Coeffic Setting , (0: Disable-default, audio data passes EQ4 block by 0dB gain). When EQ4="1”, the settings of E4A15-0, E4B15-0 and E4C15-0 bits are enabled
|
||||||
map.r.digital_filter_select_2.EQ0 = 0;
|
map.r.digital_filter_select_3.EQ5 = 0; // EQ5 Coeffic Setting , (0: Disable-default, audio data passes EQ5 block by 0dB gain). When EQ5="1”, the settings of E5A15-0, E5B15-0 and E5C15-0 bits are enabled
|
||||||
map.r.digital_filter_select_2.GN = 0b00;
|
update(Register::DigitalFilterSelect3); // A,B,C EQ1 Coefficients are already pre-loaded in ak4951.hpp
|
||||||
|
|
||||||
|
|
||||||
|
if (alc_mode==0) { // Programmable Digital Filter OFF, same as original condition., no Digital ALC, nor Wind Noise Filter, LPF , EQ
|
||||||
|
|
||||||
|
map.r.digital_filter_select_2.LPF = 0; // LPF-Block, Coeffic Setting Enable (OFF-Default), When LPF bit is “0”, audio data passes the LPF block by 0dB gain.
|
||||||
update(Register::DigitalFilterSelect2);
|
update(Register::DigitalFilterSelect2);
|
||||||
|
|
||||||
map.r.digital_filter_select_3.EQ1 = 0;
|
// Pre-loading AUDIO PATH with all DIGITAL BLOCK by pased, see, audio path block diagramm AK4951 datasheet + Table Playback mode -Recording mode.
|
||||||
map.r.digital_filter_select_3.EQ2 = 0;
|
// Digital filter block PATH is BY PASSED (we can swith off DIG. BLOCK power , PMPFIL=0) .The Path in Recording Mode 2 & Playback Mode 2 (NO DIG FILTER BLOCK AT ALL, not for MIC recording, nor for Playback)
|
||||||
map.r.digital_filter_select_3.EQ3 = 0;
|
map.r.digital_filter_mode.ADCPF = 1; // ADCPF bit swith ("0" Mic after ADC Output connected (recording mode) to the DIGITAL FILTER BLOCK. ("1" Playback mode)
|
||||||
map.r.digital_filter_select_3.EQ4 = 0;
|
map.r.digital_filter_mode.PFSDO = 0; // ADC bit switch ("0" : 1st order HPF) connectedto the Output. By bass DIGITAL block .
|
||||||
map.r.digital_filter_select_3.EQ5 = 0;
|
map.r.digital_filter_mode.PFDAC = 0b00; // (Input selector for DAC (not used in MIC), SDTI= Audio Serial Data Input Pin)
|
||||||
update(Register::DigitalFilterSelect3);
|
update(Register::DigitalFilterMode); // Writing the Audio Path : NO DIGITAL BLOCK or DIG BLOCK FOR MIC , Audio mode path : Playback mode /-Recording mode.
|
||||||
*/
|
|
||||||
map.r.digital_filter_mode.PFSDO = 0; // ADC (+ 1st order HPF) Output
|
|
||||||
map.r.digital_filter_mode.ADCPF = 1; // ADC Output (default)
|
|
||||||
update(Register::DigitalFilterMode);
|
|
||||||
|
|
||||||
// ... Set coefficients ...
|
map.r.power_management_1.PMADL = 1; // ADC Lch = Lch input signal. Mic Amp Lch and ADC Lch Power Management
|
||||||
|
map.r.power_management_1.PMADR = 1; // ADC Rch = Rch input signal. Mic Amp Rch and ADC Rch Power Management
|
||||||
map.r.power_management_1.PMADL = 1; // ADC Lch = Lch input signal
|
map.r.power_management_1.PMPFIL = 0; // Pre-loading , Programmable Dig. filter OFF ,filter unused, routed around.(original value = 0 )
|
||||||
map.r.power_management_1.PMADR = 1; // ADC Rch = Rch input signal
|
update(Register::PowerManagement1); // Activating the Power management of the used blocks . (Mic ADC always + Dig Block filter , when used )
|
||||||
map.r.power_management_1.PMPFIL = 0; // Programmable filter unused, routed around.
|
|
||||||
update(Register::PowerManagement1);
|
|
||||||
|
|
||||||
// 1059/fs, 22ms @ 48kHz
|
// 1059/fs, 22ms @ 48kHz
|
||||||
chThdSleepMilliseconds(22);
|
chThdSleepMilliseconds(22);
|
||||||
|
|
||||||
|
} else { // ( alc_mode !=0)
|
||||||
|
|
||||||
|
switch(alc_mode) { // Pre-loading register values depending on user-GUI selection (they will be sended below, with "update(Register_name::xxx )".
|
||||||
|
|
||||||
|
case 1: // ALC-> on, (+12dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
map.r.alc_mode_control_2.REF = 0xC0; // REF7-0 bits,max gain at ALC recovery operation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, C0H=+12dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0xC0; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0xC0; // Right Input Dig Vol Setting, same comment as above , The value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
// Already Pre-loaded, "map.r.lpf_coefficient", 6Khz - LPF 1st Order from digital Block,Fc=6000Hz,fs = 48khz
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: // ALC-> on, (+09dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
map.r.alc_mode_control_2.REF = 0xB8; // REF7-0 bits,max gain at ALC recoveryoperation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, B8H= +9dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0xB8; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0xB8; // Right Input Dig Vol Setting, same comment as above , The value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
// Already Pre-loaded, "map.r.lpf_coefficient", 6Khz - LPF 1st Order from digital Block,Fc=6000Hz,fs = 48khz
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3: // ALC-> on, (+06dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
map.r.alc_mode_control_2.REF = 0xB0; // 0xB8 , REF7-0 bits,max gain at ALC recoveryoperation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, B0H= +6dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0xB0; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0xB0; // Right Input Dig Vol Setting, same comment as above , Then value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
// Already Pre-loaded, "map.r.lpf_coefficient", 6Khz - LPF 1st Order from digital Block,Fc=6000Hz,fs = 48khz
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4: // ALC-> on, (+03dB's) Auto Vol max + Wind Noise cancel + Pre-amp Mic (+21dB=original)
|
||||||
|
// + EQ boosting ~<2kHz (f0:1,1k, fb:1,7K, k=1,8) && + LPF 3,5k
|
||||||
|
map.r.alc_mode_control_2.REF = 0xA8; // 0xA8 , REF7-0 bits,max gain at ALC recoveryoperation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, A8H= +3dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0xA8; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0xA8; // Right Input Dig Vol Setting, same comment as above , Then value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
//The EQn (n=1, 2, 3, 4 or 5) coefficient must be set when EQn bit = “0” or PMPFIL bit = “0”.
|
||||||
|
map.r.digital_filter_select_3.EQ1 = 1; // EQ1 Coeffic Setting , (0: Disable-default, audio data passes EQ1 block by 0dB gain). When EQ1="1”, the settings of E1A15-0, E1B15-0 and E1C15-0 bits are enabled
|
||||||
|
update(Register::DigitalFilterSelect3); // A,B,C EQ1 Coefficients are already pre-loaded in ak4951.hpp
|
||||||
|
|
||||||
|
map.r.lpf_coefficient_0.l = 0x0D; // Pre-loading here LPF 3,5k , 1st Order from digital Block , Fc=3.500 Hz, fs = 48khz
|
||||||
|
map.r.lpf_coefficient_1.h = 0x06; // LPF bit is activated down, for all ALC digital modes.
|
||||||
|
map.r.lpf_coefficient_2.l = 0x1A; // Writting reg to AK4951 , down with update....
|
||||||
|
map.r.lpf_coefficient_3.h = 0x2C;
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5: // ALC-> on, (+03dB's) Auto Vol max + Wind Noise cancel + Pre-amp Mic (+21dB=original)
|
||||||
|
// + EQ boosting ~<3kHz (f0~1k4,fb~2,4k,k=1,8) && LPF 4kHz
|
||||||
|
map.r.alc_mode_control_2.REF = 0xA8; // 0xA0 , REF7-0 bits,max gain at ALC recoveryoperation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, A8H= +3dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0xA8; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0xA8; // Right Input Dig Vol Setting, same comment as above , Then value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
map.r.digital_filter_select_3.EQ2 = 1; // EQ2 Coeffic Setting , (0: Disable-default, audio data passes EQ2 block by 0dB gain). When EQ2="1”, the settings of E2A15-0, E2B15-0 and E2C15-0 bits are enabled
|
||||||
|
update(Register::DigitalFilterSelect3);
|
||||||
|
|
||||||
|
map.r.lpf_coefficient_0.l = 0xC3; // Pre-loading here LPF 4k , 1st Order from digital Block , Fc=4000 Hz, fs = 48khz
|
||||||
|
map.r.lpf_coefficient_1.h = 0x06; // LPF bit is activated down, for all ALC digital modes.
|
||||||
|
map.r.lpf_coefficient_2.l = 0x86; // Writting reg to AK4951 , down with update....
|
||||||
|
map.r.lpf_coefficient_3.h = 0x2D;
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6: // ALC-> on, (+03dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
map.r.alc_mode_control_2.REF = 0xA8; // REF7-0 bits,max gain at ALC recoveryoperation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, A0H= 0dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0xA8; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0xA8; // Right Input Dig Vol Setting, same comment as above , Then value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
// Already Pre-loaded, "map.r.lpf_coefficient", 6Khz - LPF 1st Order from digital Block,Fc=6000Hz,fs = 48khz
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7: // ALC-> on, (+00dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
map.r.alc_mode_control_2.REF = 0xA0; // REF7-0 bits,max gain at ALC recoveryoperation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, A0H= 0dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0xA0; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0xA0; // Right Input Dig Vol Setting, same comment as above , Then value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
// Already Pre-loaded, "map.r.lpf_coefficient", 6Khz - LPF 1st Order from digital Block,Fc=6000Hz,fs = 48khz
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8: // ALC-> on, (-03dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
map.r.alc_mode_control_2.REF = 0x98; //REF7-0 bits,max gain at ALC recovery operation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, 98H=-03dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0x98; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0x98; // Right Input Dig Vol Setting, same comment as above , Then value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
// Already Pre-loaded, "map.r.lpf_coefficient", 6Khz - LPF 1st Order from digital Block,Fc=6000Hz,fs = 48khz
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 9: // ALC-> on, (-06dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz + Pre-amp Mic (+21dB=original)
|
||||||
|
map.r.alc_mode_control_2.REF = 0x90; // REF7-0 bits,max gain at ALC recovery operation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, 90H=-06dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0x90; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0x90; // Right Input Dig Vol Setting, same comment as above , Then value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
// Already Pre-loaded, "map.r.lpf_coefficient", 6Khz - LPF 1st Order from digital Block,Fc=6000Hz,fs = 48khz
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10: // ALC-> on, (-09dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz - Pre-amp MIC -3dB (18dB's)
|
||||||
|
// Reduce also Pre-amp Mic -3dB's (+18dB's)
|
||||||
|
mgain = 0b0110; // Pre-amp mic Mic Gain Pre-amp (+18dB), Original=0b0111 (+21dB's =7x3dBs),
|
||||||
|
|
||||||
|
map.r.alc_mode_control_2.REF = 0x88; // REF7-0 bits,max gain at ALC recovery operation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, 88H=-09dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0x88; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0x88; // Right Input Dig Vol Setting, same comment as above , Then value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
// Already Pre-loaded, "map.r.lpf_coefficient", 6Khz - LPF 1st Order from digital Block,Fc=6000Hz,fs = 48khz
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 11: // ALC-> on, (-12dB's) Auto Vol max + Wind Noise cancel + LPF 6kHz - Pre-amp MIC -6dB (15dB's)
|
||||||
|
// Reduce also Pre-amp Mic -6dB's (+15dB's)
|
||||||
|
mgain = 0b0101; // Pre-amp mic Mic Gain Pre-amp (+15dB), (Original=0b0111 (+21dB's= 7x3dBs),
|
||||||
|
|
||||||
|
map.r.alc_mode_control_2.REF = 0x80; // REF7-0 bits,max gain at ALC recovery operation,(FFH +36dBs , D0H +18dBs, A0H 0dBs, 80H=-12dBs)
|
||||||
|
map.r.l_ch_input_volume_control.IV = 0x80; // Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
map.r.r_ch_input_volume_control.IV = 0x80; // Right Input Dig Vol Setting, same comment as above , Then value of IVOL should be <= than REF’s
|
||||||
|
|
||||||
|
// Already Pre-loaded, "map.r.lpf_coefficient", 6Khz - LPF 1st Order from digital Block,Fc=6000Hz,fs = 48khz
|
||||||
|
// LPF bit is activated down, for all ALC digital modes.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------DIGITAL ALC (Automatic Level Control ) --- --------
|
||||||
|
map.r.alc_mode_control_1.ALC = 0; // LMTH2-0, WTM1-0, RGAIN2-0, REF7-0, RFST1-0, EQFC1-0, FRATT, FRN and ALCEQN bits (needs to be set up with ALC disable = 0)
|
||||||
|
update(Register::ALCModeControl1);
|
||||||
|
|
||||||
|
map.r.timer_select.FRN = 0; // (FRN= 0 Fast Recovery mode , enable )
|
||||||
|
map.r.timer_select.FRATT = 0; // Fast Recovery Ref. Volume Atten. Amount -0,00106dB's, timing 4/fs (default)
|
||||||
|
map.r.timer_select.ADRST = 0b00; // initial offset ADC cycles , 22ms @fs=48Khz.
|
||||||
|
update(Register::TimerSelect);
|
||||||
|
|
||||||
|
map.r.alc_timer_select.RFST = 0b00; // RFST1-0: ALC Fast Recovery Speed Default: “00” (0.0032dB)
|
||||||
|
map.r.alc_timer_select.WTM = 0b00; // ALC Recovery Operation Waiting Period 128/fs = 2,7 mseg (min=default)
|
||||||
|
map.r.alc_timer_select.EQFC = 0b10; // Selecting default, fs 48Khz , ALCEQ: First order zero pole high pass filter fc2=100Hz, fc1=150Hz
|
||||||
|
map.r.alc_timer_select.IVTM = 0; // IVTM bit set the vol transition time ,236/fs = 4,9msecs (min) (default was 19,7msegs.)
|
||||||
|
update(Register::ALCTimerSelect);
|
||||||
|
|
||||||
|
map.r.alc_mode_control_1.LMTH10 = 0b11; // ALC Limiter Detec Level/ Recovery Counter Reset; lower 2 bits (Ob111=-8,4dbs), (default 0b000=-2,5dBs)
|
||||||
|
map.r.alc_mode_control_1.RGAIN = 0b000; // ALC Recovery Gain Step, max step , max speed. Default: “000” (0.00424dB)
|
||||||
|
map.r.alc_mode_control_1.ALC = 1; // ALC Enable . (we are now, NOT in MANUAL volume mode, only becomes manual when (ALC=“0” while ADCPF=“1”. )
|
||||||
|
map.r.alc_mode_control_1.LMTH2 = 1; // ALC Limiter Detection Level/ Recovery Counter Reset Level,Upper bit,default 0b000
|
||||||
|
map.r.alc_mode_control_1.ALCEQN = 1; // ALC EQ Off =1 not used by now, 0: ALC EQ On (default)
|
||||||
|
update(Register::ALCModeControl1);
|
||||||
|
|
||||||
|
// map.r.alc_mode_control_2.REF = 0x??; // Pre-loaded in top part. Maximum gain at ALC recovery operation,.(FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
update(Register::ALCModeControl2);
|
||||||
|
|
||||||
|
// map.r.l_ch_input_volume_control.IV = 0x??; // Pre-loaded in top part. Left, Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
update(Register::LchInputVolumeControl);
|
||||||
|
|
||||||
|
// map.r.r_ch_input_volume_control.IV = 0x??; // Pre-loaded in top part. Right,Input Digital Volume Setting, (FFH +36dBs , D0H +18dBs, A0H 0dBs, 70H=-18dBs)
|
||||||
|
update(Register::RchInputVolumeControl);
|
||||||
|
|
||||||
|
|
||||||
|
//---------------Switch ON, Digital Automatic Wind Noise Filter reduction -------------------
|
||||||
|
// Difficult to realise that Dynamic HPF Wind noise filter benefit, maybe because we have another fixed HPF 236.8 Hz .
|
||||||
|
// Anyway , we propose to activate it , with default setting conditions.
|
||||||
|
map.r.power_management_1.PMPFIL = 0; // (*1) To programm SENC, STG , we need PMPFIL = 0 . (but this disconnect Digital block power supply.
|
||||||
|
update(Register::PowerManagement1); // Updated PMPFIL to 0 . (*1)
|
||||||
|
|
||||||
|
map.r.auto_hpf_control.STG = 0b00; // (00=LOW ATTENUATION Level), lets put 11 (HIGH ATTENUATION Level) (default 00)
|
||||||
|
map.r.auto_hpf_control.SENC = 0b011; // (000=LOW sensitivity detection)… 111((MAX sensitivity detection) (default 011)
|
||||||
|
map.r.auto_hpf_control.AHPF = 1; // Autom. Wind noise filter ON (AHPF bit=“1”).It atten. wind noise when detecting ,and adjusts the atten. level dynamically.
|
||||||
|
update(Register::AutoHPFControl);
|
||||||
|
|
||||||
|
// We are in Digital Block ON , (Wind Noise Filter+ALC+LPF+EQ),==> needs at the end , PMPFIL=1 , Program. Dig.filter ON
|
||||||
|
// map.r.power_management_1.PMPFIL = 1; // that instruction is at the end , we can skp pre-loading Programmable Dig. filter ON (*1)
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Writing AUDIO PATH diagramm, Changing Audio mode path : Playback mode1 /-Recording mode2. (Figure 37 AK4951 datasheet, Table 27. Recording Playback Mode)
|
||||||
|
// When changing those modes, PMPFIL bit must be “0”, it is OK (*1)
|
||||||
|
map.r.digital_filter_mode.ADCPF = 1; // ADCPF bit swith ("0" Mic after ADC Output connected (recording mode) to the DIGITAL FILTER BLOCK. ("1" Playback mode)
|
||||||
|
map.r.digital_filter_mode.PFSDO = 1; // ADC (+ 1st order HPF) Output
|
||||||
|
map.r.digital_filter_mode.PFDAC = 0b00; // (Input selector for DAC (not used in MIC), SDTI= Audio Serial Data Input Pin)
|
||||||
|
update(Register::DigitalFilterMode); // Writing the Audio Path : NO DIGITAL BLOCK or DIG BLOCK FOR MIC , Audio mode path : Playback mode /-Recording mode.
|
||||||
|
|
||||||
|
// The EQn (n=1, 2, 3, 4 or 5) coefficient must be set when EQn bit = “0” or PMPFIL bit = “0”., but we are already (*1)
|
||||||
|
// map.r.power_management_1.PMPFIL = 0; // In the previous Wind Noise Filter , we already set up PPFIL = 0
|
||||||
|
// update(Register::PowerManagement1); // Activating the Power management of the used blocks . (Mic ADC always + Dig Block filter , when used )
|
||||||
|
|
||||||
|
// ... Set EQ & LPF coefficients ---------------------------------
|
||||||
|
|
||||||
|
// writting to the IC ak4951 reg. settings defined in Ak4951.hpp , the 30 bytes , EQ coefficient = 5 (EQ1,2,3,4,5) x 3 (A,B,C coefficients) x 2 bytes (16 bits)
|
||||||
|
update(Register::E1Coefficient0); // we could pre-load here,ex ,"map.r.e1_coefficient_0.l = 0x50;" , EQ1 Coefficient A : A7...A0, but already done in ak4951.hpp
|
||||||
|
update(Register::E1Coefficient1); // we could pre-load here,ex ,"map.r.e1_coefficient_1.h = 0xFE;" , EQ1 Coefficient A : A15..A8, " "
|
||||||
|
update(Register::E1Coefficient2); // we could pre-load here,ex ,"map.r.e1_coefficient_2.l = 0x29;" , EQ1 Coefficient B : B7...B0, " "
|
||||||
|
update(Register::E1Coefficient3); // we could pre-load here,ex ,"map.r.e1_coefficient_3.h = 0xC5;" , EQ1 Coefficient B : B15..B8, " "
|
||||||
|
update(Register::E1Coefficient4); // we could pre-load here,ex ,"map.r.e1_coefficient_4.l = 0xA0;" , EQ1 Coefficient C : C7...C0, " "
|
||||||
|
update(Register::E1Coefficient5); // we could pre-load here,ex ,"map.r.e1_coefficient_5.h = 0x1C;" , EQ1 Coefficient C : C15..C8, " "
|
||||||
|
|
||||||
|
update(Register::E2Coefficient0); // writing pre-loaded EQ2 coefficcients
|
||||||
|
update(Register::E2Coefficient1);
|
||||||
|
update(Register::E2Coefficient2);
|
||||||
|
update(Register::E2Coefficient3);
|
||||||
|
update(Register::E2Coefficient4);
|
||||||
|
update(Register::E2Coefficient5);
|
||||||
|
|
||||||
|
// Already pre-loaded LPF coefficients to 6k, 3,5k or 4k ,(LPF 6Khz all digital alc modes top , except when 3k5 , 4k)
|
||||||
|
update(Register::LPFCoefficient0); // Writing pre-loaded 4 bytes LPF CoefFiecients 14 bits (FSA13..0, FSB13..0
|
||||||
|
update(Register::LPFCoefficient1);
|
||||||
|
update(Register::LPFCoefficient2);
|
||||||
|
update(Register::LPFCoefficient3);
|
||||||
|
|
||||||
|
// Activating LPF block , (and re-configuring the rest of bits of the same register)
|
||||||
|
map.r.digital_filter_select_2.HPF = 0; // HPF2-Block, Coeffic Setting Enable (OFF-Default), When HPF bit is “0”, audio data passes the HPF2 block by is 0dB gain.
|
||||||
|
map.r.digital_filter_select_2.LPF = 1; // LPF-Block, Coeffic Setting Enable (OFF-Default), When LPF bit is “0”, audio data passes the LPF block by 0dB gain.
|
||||||
|
map.r.digital_filter_select_2.FIL3 = 0; // Stereo_Emphasis_Filter-Block,(OFF-Default) Coefficient Setting Enable , OFF , Disable.
|
||||||
|
map.r.digital_filter_select_2.EQ0 = 0; // Gain Compensation-Block, (OFF-Default) Coeffic Setting Enable, When EQ0 bit = “0” audio data passes the EQ0 block by 0dB gain.
|
||||||
|
map.r.digital_filter_select_2.GN = 0b00; // Gain Setting of the Gain Compensation Block Default: “00”-Default (0dB)
|
||||||
|
update(Register::DigitalFilterSelect2);
|
||||||
|
|
||||||
|
// Acitivating digital block , power supply
|
||||||
|
map.r.power_management_1.PMADL = 1; // ADC Lch = Lch input signal. Mic Amp Lch and ADC Lch Power Management
|
||||||
|
map.r.power_management_1.PMADR = 1; // ADC Rch = Rch input signal. Mic Amp Rch and ADC Rch Power Management
|
||||||
|
map.r.power_management_1.PMPFIL = 1; // Pre-loaded in top part. Orig value=0, Programmable Digital filter unused (not power up), routed around.
|
||||||
|
update(Register::PowerManagement1); // Activating the Power management of the used blocks . (Mic ADC always + Dig Block filter , when used )
|
||||||
|
|
||||||
|
// 1059/fs, 22ms @ 48kHz
|
||||||
|
chThdSleepMilliseconds(22);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Common part for all alc_mode , --------------------------
|
||||||
|
// const uint_fast8_t mgain = 0b0111; // Already pre-loaded , in above switch case .
|
||||||
|
map.r.signal_select_1.MGAIN20 = mgain & 7; // writing 3 lower bits of mgain , (pre-amp mic gain).
|
||||||
|
map.r.signal_select_1.PMMP = 1; // Activating DC Mic Power supply through 2kohms res., similar majority smartphones headphone+mic jack, "plug-in-power"
|
||||||
|
map.r.signal_select_1.MPSEL = 1; // MPWR2 pin ,selecting output voltage to MPWR2 pin, that we are using in portapack ext. MIC)
|
||||||
|
map.r.signal_select_1.MGAIN3 = (mgain >> 3) & 1; // writing 4th upper bit of mgain (pre-amp mic gain).
|
||||||
|
update(Register::SignalSelect1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void AK4951::microphone_disable() {
|
void AK4951::microphone_disable() {
|
||||||
map.r.power_management_1.PMADL = 0;
|
map.r.power_management_1.PMADL = 0; // original code , disable Power managem.Mic ADC L
|
||||||
map.r.power_management_1.PMADR = 0;
|
map.r.power_management_1.PMADR = 0; // original code , disable Power managem.Mic ADC R
|
||||||
map.r.power_management_1.PMPFIL = 0;
|
map.r.power_management_1.PMPFIL = 0; // original code , disable Power managem. all Programmable Dig. block
|
||||||
update(Register::PowerManagement1);
|
update(Register::PowerManagement1);
|
||||||
|
|
||||||
map.r.alc_mode_control_1.ALC = 0;
|
map.r.alc_mode_control_1.ALC = 0; // original code , Restore , disable ALC block.
|
||||||
update(Register::ALCModeControl1);
|
update(Register::ALCModeControl1);
|
||||||
|
|
||||||
|
map.r.auto_hpf_control.AHPF = 0; //----------- new code addition , Restore disable Wind noise filter OFF (AHPF bit=“0”).
|
||||||
|
update(Register::AutoHPFControl);
|
||||||
|
|
||||||
|
//Restore original AUDIO PATH , condition, (Digital filter block PATH is BY PASSED) (we can also swith off DIG. BLOCK power , PMPFIL=0)
|
||||||
|
// The Path in Recording Mode 2 & Playback Mode 2 , (NO DIG FILTER BLOCK AT ALL, not for MIC recording, nor for Playback)
|
||||||
|
map.r.digital_filter_mode.ADCPF = 1; // new code addition , ADCPF bit swith ("0" Mic after ADC Output connected (recording mode) to the DIGITAL FILTER BLOCK. ("1" Playback mode)
|
||||||
|
map.r.digital_filter_mode.PFSDO = 0; // new code addition , ADC bit switch ("0" : 1st order HPF) connectedto the Output. By bass DIGITAL block .
|
||||||
|
map.r.digital_filter_mode.PFDAC = 0b00; // new code addition , (Input selector for DAC (not used in MIC), SDTI= Audio Serial Data Input Pin)
|
||||||
|
update(Register::DigitalFilterMode); // Writing the Audio Path : NO DIGITAL BLOCK or DIG BLOCK FOR MIC , Audio mode path : Playback mode /-Recording mode.
|
||||||
|
|
||||||
|
// Restore original condition , LPF , OFF . same as when not using DIGITAL Programmable block
|
||||||
|
map.r.digital_filter_select_2.LPF = 0; // LPF-Block, Coeffic Setting Enable (OFF-Default), When LPF bit is “0”, audio data passes the LPF block by 0dB gain.
|
||||||
|
update(Register::DigitalFilterSelect2);
|
||||||
|
|
||||||
|
map.r.lpf_coefficient_0.l = 0x00; // Pre-loading here LPF 6k , 1st Order from digital Block , Fc=6000 Hz, fs = 48khz
|
||||||
|
map.r.lpf_coefficient_1.h = 0x00; // LPF bit is activated down, for all ALC digital modes.
|
||||||
|
map.r.lpf_coefficient_2.l = 0x00; // Writting reg to AK4951 , down with update....
|
||||||
|
map.r.lpf_coefficient_3.h = 0x00;
|
||||||
|
|
||||||
|
update(Register::LPFCoefficient0); // Writing pre-loaded 4 bytes LPF CoefFiecients 14 bits (FSA13..0, FSB13..0
|
||||||
|
update(Register::LPFCoefficient1);
|
||||||
|
update(Register::LPFCoefficient2);
|
||||||
|
update(Register::LPFCoefficient3);
|
||||||
|
|
||||||
|
// Switch off all EQ 1,2,3,4,5
|
||||||
|
map.r.digital_filter_select_3.EQ1 = 0; // EQ1 Coeffic Setting , (0: Disable-default, audio data passes EQ1 block by 0dB gain). When EQ1="1”, the settings of E1A15-0, E1B15-0 and E1C15-0 bits are enabled
|
||||||
|
map.r.digital_filter_select_3.EQ2 = 0; // EQ2 Coeffic Setting , (0: Disable-default, audio data passes EQ2 block by 0dB gain). When EQ2="1”, the settings of E2A15-0, E2B15-0 and E2C15-0 bits are enabled
|
||||||
|
map.r.digital_filter_select_3.EQ3 = 0; // EQ3 Coeffic Setting , (0: Disable-default, audio data passes EQ3 block by 0dB gain). When EQ3="1”, the settings of E3A15-0, E3B15-0 and E3C15-0 bits are enabled
|
||||||
|
map.r.digital_filter_select_3.EQ4 = 0; // EQ4 Coeffic Setting , (0: Disable-default, audio data passes EQ4 block by 0dB gain). When EQ4="1”, the settings of E4A15-0, E4B15-0 and E4C15-0 bits are enabled
|
||||||
|
map.r.digital_filter_select_3.EQ5 = 0; // EQ5 Coeffic Setting , (0: Disable-default, audio data passes EQ5 block by 0dB gain). When EQ5="1”, the settings of E5A15-0, E5B15-0 and E5C15-0 bits are enabled
|
||||||
|
update(Register::DigitalFilterSelect3);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reg_t AK4951::read(const address_t reg_address) {
|
reg_t AK4951::read(const address_t reg_address) {
|
||||||
|
@ -773,40 +773,41 @@ constexpr RegisterMap default_after_reset { Register_Type {
|
|||||||
.REV = 0b1100,
|
.REV = 0b1100,
|
||||||
},
|
},
|
||||||
|
|
||||||
.e1_coefficient_0 = { .l = 0x00 },
|
// just pre-loading into memory, 30 bytes = EQ 1,2,3,4,5 x A,B,C (2 x bytes) coefficients, but it will be written from ak4951.cpp
|
||||||
.e1_coefficient_1 = { .h = 0x00 },
|
.e1_coefficient_0 = { .l = 0xCA }, //EQ1 Coefficient A : A7...A0, BW : 300Hz - 1700Hz (fo = 1150Hz , fb= 1700Hz) , k=1,8 peaking
|
||||||
.e1_coefficient_2 = { .l = 0x00 },
|
.e1_coefficient_1 = { .h = 0x05 }, //EQ1 Coefficient A : A15..A8
|
||||||
.e1_coefficient_3 = { .h = 0x00 },
|
.e1_coefficient_2 = { .l = 0xEB }, //EQ1 Coefficient B : B7...B0
|
||||||
.e1_coefficient_4 = { .l = 0x00 },
|
.e1_coefficient_3 = { .h = 0x38 }, //EQ1 Coefficient B : B15...B8
|
||||||
.e1_coefficient_5 = { .h = 0x00 },
|
.e1_coefficient_4 = { .l = 0x6F }, //EQ1 Coefficient C : C7...C0
|
||||||
|
.e1_coefficient_5 = { .h = 0xE6 }, //EQ1 Coefficient C : C15..C8
|
||||||
|
|
||||||
.e2_coefficient_0 = { .l = 0x00 },
|
.e2_coefficient_0 = { .l = 0x05 }, //EQ2 Coefficient A : A7...A0, BW : 250Hz - 2700Hz (fo = 1475Hz , fb= 2450Hz) , k=1,8 peaking
|
||||||
.e2_coefficient_1 = { .h = 0x00 },
|
.e2_coefficient_1 = { .h = 0x08 }, //EQ2 Coefficient A : A15..A8
|
||||||
.e2_coefficient_2 = { .l = 0x00 },
|
.e2_coefficient_2 = { .l = 0x11 }, //EQ2 Coefficient B : B7...B0
|
||||||
.e2_coefficient_3 = { .h = 0x00 },
|
.e2_coefficient_3 = { .h = 0x36 }, //EQ2 Coefficient B : B15...B8
|
||||||
.e2_coefficient_4 = { .l = 0x00 },
|
.e2_coefficient_4 = { .l = 0xE9 }, //EQ2 Coefficient C : C7...C0
|
||||||
.e2_coefficient_5 = { .h = 0x00 },
|
.e2_coefficient_5 = { .h = 0xE8 }, //EQ2 Coefficient C : C15..C8
|
||||||
|
|
||||||
.e3_coefficient_0 = { .l = 0x00 },
|
.e3_coefficient_0 = { .l = 0x00 }, //EQ3 Coefficient A : A7...A0, not used currently
|
||||||
.e3_coefficient_1 = { .h = 0x00 },
|
.e3_coefficient_1 = { .h = 0x00 }, //EQ3 Coefficient A : A15..A8
|
||||||
.e3_coefficient_2 = { .l = 0x00 },
|
.e3_coefficient_2 = { .l = 0x00 }, //EQ3 Coefficient B : B7...B0
|
||||||
.e3_coefficient_3 = { .h = 0x00 },
|
.e3_coefficient_3 = { .h = 0x00 }, //EQ3 Coefficient B : B15...B8
|
||||||
.e3_coefficient_4 = { .l = 0x00 },
|
.e3_coefficient_4 = { .l = 0x00 }, //EQ3 Coefficient C : C7...C0
|
||||||
.e3_coefficient_5 = { .h = 0x00 },
|
.e3_coefficient_5 = { .h = 0x00 }, //EQ3 Coefficient C : C15..C8
|
||||||
|
|
||||||
.e4_coefficient_0 = { .l = 0x00 },
|
.e4_coefficient_0 = { .l = 0x00 }, //EQ4 Coefficient A : A7...A0, not used currently
|
||||||
.e4_coefficient_1 = { .h = 0x00 },
|
.e4_coefficient_1 = { .h = 0x00 }, //EQ4 Coefficient A : A15..A8
|
||||||
.e4_coefficient_2 = { .l = 0x00 },
|
.e4_coefficient_2 = { .l = 0x00 }, //EQ4 Coefficient B : B7...B0
|
||||||
.e4_coefficient_3 = { .h = 0x00 },
|
.e4_coefficient_3 = { .h = 0x00 }, //EQ4 Coefficient B : B15...B8
|
||||||
.e4_coefficient_4 = { .l = 0x00 },
|
.e4_coefficient_4 = { .l = 0x00 }, //EQ4 Coefficient C : C7...C0
|
||||||
.e4_coefficient_5 = { .h = 0x00 },
|
.e4_coefficient_5 = { .h = 0x00 }, //EQ4 Coefficient C : C15..C8
|
||||||
|
|
||||||
.e5_coefficient_0 = { .l = 0x00 },
|
.e5_coefficient_0 = { .l = 0x00 }, //EQ5 Coefficient A : A7...A0, not used currently
|
||||||
.e5_coefficient_1 = { .h = 0x00 },
|
.e5_coefficient_1 = { .h = 0x00 }, //EQ5 Coefficient A : A15..A8
|
||||||
.e5_coefficient_2 = { .l = 0x00 },
|
.e5_coefficient_2 = { .l = 0x00 }, //EQ5 Coefficient B : B7...B0
|
||||||
.e5_coefficient_3 = { .h = 0x00 },
|
.e5_coefficient_3 = { .h = 0x00 }, //EQ5 Coefficient B : B15...B8
|
||||||
.e5_coefficient_4 = { .l = 0x00 },
|
.e5_coefficient_4 = { .l = 0x00 }, //EQ5 Coefficient C : C7...C0
|
||||||
.e5_coefficient_5 = { .h = 0x00 },
|
.e5_coefficient_5 = { .h = 0x00 }, //EQ5 Coefficient C : C15..C8
|
||||||
} };
|
} };
|
||||||
|
|
||||||
class AK4951 : public audio::Codec {
|
class AK4951 : public audio::Codec {
|
||||||
@ -839,7 +840,7 @@ public:
|
|||||||
void set_headphone_volume(const volume_t volume) override;
|
void set_headphone_volume(const volume_t volume) override;
|
||||||
void headphone_mute();
|
void headphone_mute();
|
||||||
|
|
||||||
void microphone_enable();
|
void microphone_enable(int8_t alc_mode); // added user GUI parameter , to set up AK4951 ALC mode.
|
||||||
void microphone_disable();
|
void microphone_disable();
|
||||||
|
|
||||||
size_t reg_count() const override {
|
size_t reg_count() const override {
|
||||||
|
@ -142,7 +142,23 @@ static int32_t rect_distances(
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (std::abs(perpendicular_axis_end - perpendicular_axis_start) + 1) * (on_axis_distance + 1);
|
|
||||||
|
switch(direction) {
|
||||||
|
case KeyEvent::Right:
|
||||||
|
case KeyEvent::Left:
|
||||||
|
return ((std::abs(perpendicular_axis_end - perpendicular_axis_start) + 1) ^ 3) * sqrt((on_axis_distance + 1));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case KeyEvent::Up:
|
||||||
|
case KeyEvent::Down:
|
||||||
|
return (sqrt(std::abs(perpendicular_axis_end - perpendicular_axis_start) + 1)) * ((on_axis_distance + 1) ^ 3);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FocusManager::update(
|
void FocusManager::update(
|
||||||
|
@ -345,8 +345,9 @@ public:
|
|||||||
void speaker_disable() {};
|
void speaker_disable() {};
|
||||||
|
|
||||||
|
|
||||||
void microphone_enable() override {
|
void microphone_enable(int8_t alc_mode) override {
|
||||||
// TODO: Implement
|
(void)alc_mode; // to avoid "unused warning" when compiling. (@WM8731 we do not use that parameter)
|
||||||
|
// TODO: Implement,
|
||||||
}
|
}
|
||||||
|
|
||||||
void microphone_disable() override {
|
void microphone_disable() override {
|
||||||
|
295
firmware/tools/make_mids_db/MaritimeIdentificationDigits.csv
Executable file
295
firmware/tools/make_mids_db/MaritimeIdentificationDigits.csv
Executable file
@ -0,0 +1,295 @@
|
|||||||
|
Digit,Allocated to
|
||||||
|
201,Albania (Republic of)
|
||||||
|
202,Andorra (Principality of)
|
||||||
|
203,Austria
|
||||||
|
204,Portugal - Azores
|
||||||
|
205,Belgium
|
||||||
|
206,Belarus (Republic of)
|
||||||
|
207,Bulgaria (Republic of)
|
||||||
|
208,Vatican City State
|
||||||
|
209,Cyprus (Republic of)
|
||||||
|
210,Cyprus (Republic of)
|
||||||
|
211,Germany (Federal Republic of)
|
||||||
|
212,Cyprus (Republic of)
|
||||||
|
213,Georgia
|
||||||
|
214,Moldova (Republic of)
|
||||||
|
215,Malta
|
||||||
|
216,Armenia (Republic of)
|
||||||
|
218,Germany (Federal Republic of)
|
||||||
|
219,Denmark
|
||||||
|
220,Denmark
|
||||||
|
224,Spain
|
||||||
|
225,Spain
|
||||||
|
226,France
|
||||||
|
227,France
|
||||||
|
228,France
|
||||||
|
229,Malta
|
||||||
|
230,Finland
|
||||||
|
231,Denmark - Faroe Islands
|
||||||
|
232,United Kingdom of Great Britain and Northern Ireland
|
||||||
|
233,United Kingdom of Great Britain and Northern Ireland
|
||||||
|
234,United Kingdom of Great Britain and Northern Ireland
|
||||||
|
235,United Kingdom of Great Britain and Northern Ireland
|
||||||
|
236,United Kingdom of Great Britain and Northern Ireland - Gibraltar
|
||||||
|
237,Greece
|
||||||
|
238,Croatia (Republic of)
|
||||||
|
239,Greece
|
||||||
|
240,Greece
|
||||||
|
241,Greece
|
||||||
|
242,Morocco (Kingdom of)
|
||||||
|
243,Hungary
|
||||||
|
244,Netherlands (Kingdom of the)
|
||||||
|
245,Netherlands (Kingdom of the)
|
||||||
|
246,Netherlands (Kingdom of the)
|
||||||
|
247,Italy
|
||||||
|
248,Malta
|
||||||
|
249,Malta
|
||||||
|
250,Ireland
|
||||||
|
251,Iceland
|
||||||
|
252,Liechtenstein (Principality of)
|
||||||
|
253,Luxembourg
|
||||||
|
254,Monaco (Principality of)
|
||||||
|
255,Portugal - Madeira
|
||||||
|
256,Malta
|
||||||
|
257,Norway
|
||||||
|
258,Norway
|
||||||
|
259,Norway
|
||||||
|
261,Poland (Republic of)
|
||||||
|
262,Montenegro
|
||||||
|
263,Portugal
|
||||||
|
264,Romania
|
||||||
|
265,Sweden
|
||||||
|
266,Sweden
|
||||||
|
267,Slovak Republic
|
||||||
|
268,San Marino (Republic of)
|
||||||
|
269,Switzerland (Confederation of)
|
||||||
|
270,Czech Republic
|
||||||
|
271,Turkey
|
||||||
|
272,Ukraine
|
||||||
|
273,Russian Federation
|
||||||
|
274,North Macedonia (Republic of)
|
||||||
|
275,Latvia (Republic of)
|
||||||
|
276,Estonia (Republic of)
|
||||||
|
277,Lithuania (Republic of)
|
||||||
|
278,Slovenia (Republic of)
|
||||||
|
279,Serbia (Republic of)
|
||||||
|
301,United Kingdom of Great Britain and Northern Ireland - Anguilla
|
||||||
|
303,United States of America - Alaska (State of)
|
||||||
|
304,Antigua and Barbuda
|
||||||
|
305,Antigua and Barbuda
|
||||||
|
306,"Netherlands (Kingdom of the) - Bonaire, Sint Eustatius and Saba"
|
||||||
|
306,Netherlands (Kingdom of the) - Curaçao
|
||||||
|
306,Netherlands (Kingdom of the) - Sint Maarten (Dutch part)
|
||||||
|
307,Netherlands (Kingdom of the) - Aruba
|
||||||
|
308,Bahamas (Commonwealth of the)
|
||||||
|
309,Bahamas (Commonwealth of the)
|
||||||
|
310,United Kingdom of Great Britain and Northern Ireland - Bermuda
|
||||||
|
311,Bahamas (Commonwealth of the)
|
||||||
|
312,Belize
|
||||||
|
314,Barbados
|
||||||
|
316,Canada
|
||||||
|
319,United Kingdom of Great Britain and Northern Ireland - Cayman Islands
|
||||||
|
321,Costa Rica
|
||||||
|
323,Cuba
|
||||||
|
325,Dominica (Commonwealth of)
|
||||||
|
327,Dominican Republic
|
||||||
|
329,France - Guadeloupe (French Department of)
|
||||||
|
330,Grenada
|
||||||
|
331,Denmark - Greenland
|
||||||
|
332,Guatemala (Republic of)
|
||||||
|
334,Honduras (Republic of)
|
||||||
|
336,Haiti (Republic of)
|
||||||
|
338,United States of America
|
||||||
|
339,Jamaica
|
||||||
|
341,Saint Kitts and Nevis (Federation of)
|
||||||
|
343,Saint Lucia
|
||||||
|
345,Mexico
|
||||||
|
347,France - Martinique (French Department of)
|
||||||
|
348,United Kingdom of Great Britain and Northern Ireland - Montserrat
|
||||||
|
350,Nicaragua
|
||||||
|
351,Panama (Republic of)
|
||||||
|
352,Panama (Republic of)
|
||||||
|
353,Panama (Republic of)
|
||||||
|
354,Panama (Republic of)
|
||||||
|
355,Panama (Republic of)
|
||||||
|
356,Panama (Republic of)
|
||||||
|
357,Panama (Republic of)
|
||||||
|
358,United States of America - Puerto Rico
|
||||||
|
359,El Salvador (Republic of)
|
||||||
|
361,France - Saint Pierre and Miquelon (Territorial Collectivity of)
|
||||||
|
362,Trinidad and Tobago
|
||||||
|
364,United Kingdom of Great Britain and Northern Ireland - Turks and Caicos Islands
|
||||||
|
366,United States of America
|
||||||
|
367,United States of America
|
||||||
|
368,United States of America
|
||||||
|
369,United States of America
|
||||||
|
370,Panama (Republic of)
|
||||||
|
371,Panama (Republic of)
|
||||||
|
372,Panama (Republic of)
|
||||||
|
373,Panama (Republic of)
|
||||||
|
374,Panama (Republic of)
|
||||||
|
375,Saint Vincent and the Grenadines
|
||||||
|
376,Saint Vincent and the Grenadines
|
||||||
|
377,Saint Vincent and the Grenadines
|
||||||
|
378,United Kingdom of Great Britain and Northern Ireland - British Virgin Islands
|
||||||
|
379,United States of America - United States Virgin Islands
|
||||||
|
401,Afghanistan
|
||||||
|
403,Saudi Arabia (Kingdom of)
|
||||||
|
405,Bangladesh (People's Republic of)
|
||||||
|
408,Bahrain (Kingdom of)
|
||||||
|
410,Bhutan (Kingdom of)
|
||||||
|
412,China (People's Republic of)
|
||||||
|
413,China (People's Republic of)
|
||||||
|
414,China (People's Republic of)
|
||||||
|
416,China (People's Republic of) - Taiwan (Province of China)
|
||||||
|
417,Sri Lanka (Democratic Socialist Republic of)
|
||||||
|
419,India (Republic of)
|
||||||
|
422,Iran (Islamic Republic of)
|
||||||
|
423,Azerbaijan (Republic of)
|
||||||
|
425,Iraq (Republic of)
|
||||||
|
428,Israel (State of)
|
||||||
|
431,Japan
|
||||||
|
432,Japan
|
||||||
|
434,Turkmenistan
|
||||||
|
436,Kazakhstan (Republic of)
|
||||||
|
437,Uzbekistan (Republic of)
|
||||||
|
438,Jordan (Hashemite Kingdom of)
|
||||||
|
440,Korea (Republic of)
|
||||||
|
441,Korea (Republic of)
|
||||||
|
443,"State of Palestine (In accordance with Resolution 99 Rev. Dubai, 2018)"
|
||||||
|
445,Democratic People's Republic of Korea
|
||||||
|
447,Kuwait (State of)
|
||||||
|
450,Lebanon
|
||||||
|
451,Kyrgyz Republic
|
||||||
|
453,China (People's Republic of) - Macao (Special Administrative Region of China)
|
||||||
|
455,Maldives (Republic of)
|
||||||
|
457,Mongolia
|
||||||
|
459,Nepal (Federal Democratic Republic of)
|
||||||
|
461,Oman (Sultanate of)
|
||||||
|
463,Pakistan (Islamic Republic of)
|
||||||
|
466,Qatar (State of)
|
||||||
|
468,Syrian Arab Republic
|
||||||
|
470,United Arab Emirates
|
||||||
|
471,United Arab Emirates
|
||||||
|
472,Tajikistan (Republic of)
|
||||||
|
473,Yemen (Republic of)
|
||||||
|
475,Yemen (Republic of)
|
||||||
|
477,China (People's Republic of) - Hong Kong (Special Administrative Region of China)
|
||||||
|
478,Bosnia and Herzegovina
|
||||||
|
501,France - Adelie Land
|
||||||
|
503,Australia
|
||||||
|
506,Myanmar (Union of)
|
||||||
|
508,Brunei Darussalam
|
||||||
|
510,Micronesia (Federated States of)
|
||||||
|
511,Palau (Republic of)
|
||||||
|
512,New Zealand
|
||||||
|
514,Cambodia (Kingdom of)
|
||||||
|
515,Cambodia (Kingdom of)
|
||||||
|
516,Australia - Christmas Island (Indian Ocean)
|
||||||
|
518,New Zealand - Cook Islands
|
||||||
|
520,Fiji (Republic of)
|
||||||
|
523,Australia - Cocos (Keeling) Islands
|
||||||
|
525,Indonesia (Republic of)
|
||||||
|
529,Kiribati (Republic of)
|
||||||
|
531,Lao People's Democratic Republic
|
||||||
|
533,Malaysia
|
||||||
|
536,United States of America - Northern Mariana Islands (Commonwealth of the)
|
||||||
|
538,Marshall Islands (Republic of the)
|
||||||
|
540,France - New Caledonia
|
||||||
|
542,New Zealand - Niue
|
||||||
|
544,Nauru (Republic of)
|
||||||
|
546,France - French Polynesia
|
||||||
|
548,Philippines (Republic of the)
|
||||||
|
550,Timor-Leste (Democratic Republic of)
|
||||||
|
553,Papua New Guinea
|
||||||
|
555,United Kingdom of Great Britain and Northern Ireland - Pitcairn Island
|
||||||
|
557,Solomon Islands
|
||||||
|
559,United States of America - American Samoa
|
||||||
|
561,Samoa (Independent State of)
|
||||||
|
563,Singapore (Republic of)
|
||||||
|
564,Singapore (Republic of)
|
||||||
|
565,Singapore (Republic of)
|
||||||
|
566,Singapore (Republic of)
|
||||||
|
567,Thailand
|
||||||
|
570,Tonga (Kingdom of)
|
||||||
|
572,Tuvalu
|
||||||
|
574,Viet Nam (Socialist Republic of)
|
||||||
|
576,Vanuatu (Republic of)
|
||||||
|
577,Vanuatu (Republic of)
|
||||||
|
578,France - Wallis and Futuna Islands
|
||||||
|
601,South Africa (Republic of)
|
||||||
|
603,Angola (Republic of)
|
||||||
|
605,Algeria (People's Democratic Republic of)
|
||||||
|
607,France - Saint Paul and Amsterdam Islands
|
||||||
|
608,United Kingdom of Great Britain and Northern Ireland - Ascension Island
|
||||||
|
609,Burundi (Republic of)
|
||||||
|
610,Benin (Republic of)
|
||||||
|
611,Botswana (Republic of)
|
||||||
|
612,Central African Republic
|
||||||
|
613,Cameroon (Republic of)
|
||||||
|
615,Congo (Republic of the)
|
||||||
|
616,Comoros (Union of the)
|
||||||
|
617,Cabo Verde (Republic of)
|
||||||
|
618,France - Crozet Archipelago
|
||||||
|
619,Côte d'Ivoire (Republic of)
|
||||||
|
620,Comoros (Union of the)
|
||||||
|
621,Djibouti (Republic of)
|
||||||
|
622,Egypt (Arab Republic of)
|
||||||
|
624,Ethiopia (Federal Democratic Republic of)
|
||||||
|
625,Eritrea
|
||||||
|
626,Gabonese Republic
|
||||||
|
627,Ghana
|
||||||
|
629,Gambia (Republic of the)
|
||||||
|
630,Guinea-Bissau (Republic of)
|
||||||
|
631,Equatorial Guinea (Republic of)
|
||||||
|
632,Guinea (Republic of)
|
||||||
|
633,Burkina Faso
|
||||||
|
634,Kenya (Republic of)
|
||||||
|
635,France - Kerguelen Islands
|
||||||
|
636,Liberia (Republic of)
|
||||||
|
637,Liberia (Republic of)
|
||||||
|
638,South Sudan (Republic of)
|
||||||
|
642,Libya (State of)
|
||||||
|
644,Lesotho (Kingdom of)
|
||||||
|
645,Mauritius (Republic of)
|
||||||
|
647,Madagascar (Republic of)
|
||||||
|
649,Mali (Republic of)
|
||||||
|
650,Mozambique (Republic of)
|
||||||
|
654,Mauritania (Islamic Republic of)
|
||||||
|
655,Malawi
|
||||||
|
656,Niger (Republic of the)
|
||||||
|
657,Nigeria (Federal Republic of)
|
||||||
|
659,Namibia (Republic of)
|
||||||
|
660,France - Reunion (French Department of)
|
||||||
|
661,Rwanda (Republic of)
|
||||||
|
662,Sudan (Republic of the)
|
||||||
|
663,Senegal (Republic of)
|
||||||
|
664,Seychelles (Republic of)
|
||||||
|
665,United Kingdom of Great Britain and Northern Ireland - Saint Helena
|
||||||
|
666,Somalia (Federal Republic of)
|
||||||
|
667,Sierra Leone
|
||||||
|
668,Sao Tome and Principe (Democratic Republic of)
|
||||||
|
669,Eswatini (Kingdom of)
|
||||||
|
670,Chad (Republic of)
|
||||||
|
671,Togolese Republic
|
||||||
|
672,Tunisia
|
||||||
|
674,Tanzania (United Republic of)
|
||||||
|
675,Uganda (Republic of)
|
||||||
|
676,Democratic Republic of the Congo
|
||||||
|
677,Tanzania (United Republic of)
|
||||||
|
678,Zambia (Republic of)
|
||||||
|
679,Zimbabwe (Republic of)
|
||||||
|
701,Argentine Republic
|
||||||
|
710,Brazil (Federative Republic of)
|
||||||
|
720,Bolivia (Plurinational State of)
|
||||||
|
725,Chile
|
||||||
|
730,Colombia (Republic of)
|
||||||
|
735,Ecuador
|
||||||
|
740,United Kingdom of Great Britain and Northern Ireland - Falkland Islands (Malvinas)
|
||||||
|
745,France - Guiana (French Department of)
|
||||||
|
750,Guyana
|
||||||
|
755,Paraguay (Republic of)
|
||||||
|
760,Peru
|
||||||
|
765,Suriname (Republic of)
|
||||||
|
770,Uruguay (Eastern Republic of)
|
||||||
|
775,Venezuela (Bolivarian Republic of)
|
|
13
firmware/tools/make_mids_db/README.md
Normal file
13
firmware/tools/make_mids_db/README.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Make mids.db
|
||||||
|
|
||||||
|
Licensed under [GNU GPL v3](../../../LICENSE)
|
||||||
|
|
||||||
|
Python3 script creates a MID (Marine Identification Digit) database.
|
||||||
|
MID is part of MMSI and determines (among other things) the conutry.
|
||||||
|
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
- Copy Excel file from https://www.itu.int/en/ITU-R/terrestrial/fmd/Pages/mid.aspx
|
||||||
|
- Convert it to a csv document
|
||||||
|
- Run Python 3 script: `./make_mids_db.py`
|
||||||
|
- Copy file to /AIS folder on SDCARD
|
55
firmware/tools/make_mids_db/make_mid_db.py
Executable file
55
firmware/tools/make_mids_db/make_mid_db.py
Executable file
@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Copyright (C) 2022 ArjanOnwezen
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; see the file COPYING. If not, write to
|
||||||
|
# the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
# Boston, MA 02110-1301, USA.
|
||||||
|
#
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------------------
|
||||||
|
# Create mids.db, used for AIS receiver application, using converted Excel file on page:
|
||||||
|
# https://www.itu.int/en/ITU-R/terrestrial/fmd/Pages/mid.aspx
|
||||||
|
# as a source.
|
||||||
|
# MID stands for Marine Identification Digits and can be used to determine conutry of
|
||||||
|
# vessel or coastal station.
|
||||||
|
# -------------------------------------------------------------------------------------
|
||||||
|
import csv
|
||||||
|
import re
|
||||||
|
import unicodedata
|
||||||
|
mid_codes=bytearray()
|
||||||
|
countries=bytearray()
|
||||||
|
row_count=0
|
||||||
|
|
||||||
|
database=open("mids.db", "wb")
|
||||||
|
|
||||||
|
with open('MaritimeIdentificationDigits.csv', 'rt') as csv_file:
|
||||||
|
sorted_lines=sorted(csv_file.readlines())
|
||||||
|
|
||||||
|
for row in csv.reader(sorted_lines, quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL, skipinitialspace=True):
|
||||||
|
mid_code=row[0]
|
||||||
|
# Normalize some unicode characters
|
||||||
|
#unicodedata.normalize('NFKD', row[3][:32]).encode('ascii', 'ignore')
|
||||||
|
country=unicodedata.normalize('NFKD', "".join(re.split("\(|\)|\[|\]", row[1].split('-')[-1].replace(" of Great Britain and Northern Ireland" , ""))[::2])).replace("Democratic People's Republic of Korea", "North-Korea").strip().encode('ascii', 'ignore')[:32]
|
||||||
|
if len(mid_code) == 3 :
|
||||||
|
country_padding=bytearray()
|
||||||
|
print(mid_code,' - ', country)
|
||||||
|
mid_codes=mid_codes+bytearray(mid_code+'\0', encoding='ascii')
|
||||||
|
country_padding=bytearray('\0' * (32 - len(country)), encoding='ascii')
|
||||||
|
countries=countries+country+country_padding
|
||||||
|
row_count+=1
|
||||||
|
|
||||||
|
database.write(mid_codes+countries)
|
||||||
|
print("Total of", row_count, "MID codes stored in database")
|
||||||
|
|
BIN
firmware/tools/make_mids_db/mids.db
Normal file
BIN
firmware/tools/make_mids_db/mids.db
Normal file
Binary file not shown.
BIN
sdcard/AIS/mids.db
Normal file
BIN
sdcard/AIS/mids.db
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user