SMART_COMPONENTS_AudioCodec/AudioCodec.c

254 lines
9.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by ilya on 27.03.24.
//
#include "AudioCodec.h"
#include "SystemDelayInterface.h"
#define AudioCodecWrite(REG,DATA) xAudioCodecWrite_Register8b_Data8b(env->codec,(uint8_t)REG,(uint8_t)DATA)
#define ACAddConfig(REG,DATA) {.reg = (uint8_t)REG, .data = (uint8_t)DATA}
#define AddConfigReg(REG,DATA) AudioCodec_AddRegisterData(&env->audioCodecConfig,REG,DATA)
#define AddConfigRegNAU(REG,BIT,DATA) AudioCodec_AddRegisterData(&env->audioCodecConfig,REG<<1|0b#BIT,DATA)
void ProtMethodsAdd_CodecSetGeinCard(tAudioCodec *env) {
if (env != NULL) {
env->volume_levels[0] = PA_CODEC_GAIN_57dB;
env->volume_levels[1] = PA_CODEC_GAIN_56dB;
env->volume_levels[2] = PA_CODEC_GAIN_55dB;
env->volume_levels[3] = PA_CODEC_GAIN_54dB;
env->volume_levels[4] = PA_CODEC_GAIN_53dB;
env->volume_levels[5] = PA_CODEC_GAIN_52dB;
env->volume_levels[6] = PA_CODEC_GAIN_51dB;
env->volume_levels[7] = PA_CODEC_GAIN_50dB;
env->volume_levels[8] = PA_CODEC_GAIN_49dB;
env->volume_levels[9] = PA_CODEC_GAIN_48dB;
env->volume_levels[10] = PA_CODEC_GAIN_47dB;
env->volume_levels[11] = PA_CODEC_GAIN_46dB;
env->volume_levels[12] = PA_CODEC_GAIN_45dB;
env->volume_levels[13] = PA_CODEC_GAIN_44dB;
env->volume_levels[14] = PA_CODEC_GAIN_43dB;
env->volume_levels[15] = PA_CODEC_GAIN_42dB;
env->volume_levels[16] = PA_CODEC_GAIN_41dB;
env->volume_levels[17] = PA_CODEC_GAIN_40dB;
env->volume_levels[18] = PA_CODEC_GAIN_39dB;
env->volume_levels[19] = PA_CODEC_GAIN_38dB;
env->volume_levels[20] = PA_CODEC_GAIN_37dB;
env->volume_levels[21] = PA_CODEC_GAIN_36dB;
env->volume_levels[22] = PA_CODEC_GAIN_35dB;
env->volume_levels[23] = PA_CODEC_GAIN_34dB;
env->volume_levels[24] = PA_CODEC_GAIN_33dB;
env->volume_levels[25] = PA_CODEC_GAIN_32dB;
env->volume_levels[26] = PA_CODEC_GAIN_31dB;
env->volume_levels[27] = PA_CODEC_GAIN_30dB;
env->volume_levels[28] = PA_CODEC_GAIN_29dB;
env->volume_levels[29] = PA_CODEC_GAIN_28dB;
env->volume_levels[30] = PA_CODEC_GAIN_27dB;
env->volume_levels[31] = PA_CODEC_GAIN_26dB;
env->volume_levels[32] = PA_CODEC_GAIN_25dB;
env->volume_levels[33] = PA_CODEC_GAIN_24dB;
env->volume_levels[34] = PA_CODEC_GAIN_23dB;
env->volume_levels[35] = PA_CODEC_GAIN_22dB;
env->volume_levels[36] = PA_CODEC_GAIN_21dB;
env->volume_levels[37] = PA_CODEC_GAIN_20dB;
env->volume_levels[38] = PA_CODEC_GAIN_19dB;
env->volume_levels[39] = PA_CODEC_GAIN_18dB;
env->volume_levels[40] = PA_CODEC_GAIN_17dB;
env->volume_levels[41] = PA_CODEC_GAIN_16dB;
env->volume_levels[42] = PA_CODEC_GAIN_15dB;
env->volume_levels[43] = PA_CODEC_GAIN_14dB;
env->volume_levels[44] = PA_CODEC_GAIN_13dB;
env->volume_levels[45] = PA_CODEC_GAIN_12dB;
env->volume_levels[46] = PA_CODEC_GAIN_11dB;
env->volume_levels[47] = PA_CODEC_GAIN_10dB;
env->volume_levels[48] = PA_CODEC_GAIN_09dB;
env->volume_levels[49] = PA_CODEC_GAIN_08dB;
env->volume_levels[50] = PA_CODEC_GAIN_07dB;
env->volume_levels[51] = PA_CODEC_GAIN_06dB;
env->volume_levels[52] = PA_CODEC_GAIN_05dB;
env->volume_levels[53] = PA_CODEC_GAIN_04dB;
env->volume_levels[54] = PA_CODEC_GAIN_03dB;
env->volume_levels[55] = PA_CODEC_GAIN_02dB;
env->volume_levels[56] = PA_CODEC_GAIN_01dB;
env->volume_levels[57] = PA_CODEC_GAIN_00dB;
env->volume_levels[58] = PA_CODEC_GAIN_1dB;
env->volume_levels[59] = PA_CODEC_GAIN_2dB;
env->volume_levels[60] = PA_CODEC_GAIN_3dB;
env->volume_levels[61] = PA_CODEC_GAIN_4dB;
env->volume_levels[62] = PA_CODEC_GAIN_5dB;
env->volume_levels[63] = PA_CODEC_GAIN_6dB;
}
}
uint8_t ProtMethods_CodecGetLvlVoltIndex(tAudioCodec *env, uint8_t indexValule) {
for(uint8_t i=0; i < sizeof(env->volume_levels); i++){
if(env->volume_levels[i] == indexValule){
return i;
}
}
return 0;
}
bool AudioCodec_AddRegisterData(tAudioCodecConfig *env, uint8_t reg, uint32_t data){
if(env->regCounter < AUDIO_CODEC_CONFIG_LIMIT){
env->configList[env->regCounter].reg = reg;
env->configList[env->regCounter].data = data;
env->regCounter++;
return true;
}else{
return false;
}
}
void AudioCodec_SetOneRegistr(tAudioCodec *env, uint8_t adr, uint16_t reg){
bool res;
if( (adr == 0x01) || (adr == 0x04) ){
AddConfigReg(adr<<1|0b1, reg);
} else {
res = AddConfigReg(adr<<1|0b0, reg);
}
// res = res;
}
void AudioCodec_SetVolumeLevel(tAudioCodec *env, uint16_t level) {
AudioCodecWrite(0x36<<1|0b0, level);
}
void AudioCodec_GetVolumeLevel(tAudioCodec *env, uint16_t *level) {
uint16_t res = *level;
if(xAudioCodecReadRegister(env->codec, 0x36, &res) > 0){
*level = res;
} else {
*level = 55;
}
}
void AudioCodec_DumpConf(tAudioCodec *env, uint16_t volume_level){
*env->volume_level = volume_level;
EraGlonassUveosDumper_ForceDump(env->dumper);
}
void AudioCodec_InitConfig(tAudioCodec *env) {
AddConfigReg(0x00<<1|0b0,0b0001110001);
AddConfigReg(0x01<<1|0b0,0b0000011001);
AddConfigReg(0x02<<1|0b0,0b0000010101);
AddConfigReg(0x03<<1|0b0,0b0001100101);
AddConfigReg(0x04<<1|0b0,0b0100011000);
AddConfigReg(0x05<<1|0b0,0b0000000000);
AddConfigReg(0x06<<1|0b0,0b0000000000);
AddConfigReg(0x07<<1|0b0,0b0000001010);
AddConfigReg(0x2D<<1|0b0,0b0000000010);
AddConfigReg(0x2F<<1|0b0,0b0000000000);
AddConfigReg(0x36<<1|0b0,0b0000111010);
switch(*env->carType)
{
case UNDEFINDET_CAR:
///Установка аудио профиля в модуле GSM по умолчанию
AddConfigReg(0x36<<1|0b0,0b0000111010);
break;
case SGR_MICRO_BUSS_M2G_CAR:
///Установка аудио профиля в модуле GSM для микроавтобуса УАЗ M2G
AddConfigReg(0x36<<1|0b0,0b0000111010);
break;
case PATRIOT_M1G_CAR:
///Установка аудио профиля в модуле GSM для Patriot УАЗ M1G
AddConfigReg(0x36<<1|0b0,0b0000110110);
break;
case PROFI_N1_CAR :
///Установка аудио профиля в модуле GSM для УАЗ Profi
AddConfigReg(0x36<<1|0b0,0b0000110101);
break;
case KIND_M2G_BUSS :
///Установка аудио профиля в модуле GSM для УАЗ Школьный автобус
AddConfigReg(0x36<<1|0b0,0b0000110110);
break;
case HUNTER_N1G :
///Установка аудио профиля в модуле GSM для УАЗ Patriot Хантер
AddConfigReg(0x36<<1|0b0,0b0000110110);
break;
case SGR_DUMP_TRUCK_N1G :
///Установка аудио профиля в модуле GSM для УАЗ самосвал
AddConfigReg(0x36<<1|0b0,0b0000111010);
break;
default:
break;
}
///========================================== UAZ ==========================================
// AddConfigReg(0x00<<1|0b0,0b0001110001);
// AddConfigReg(0x01<<1|0b0,0b0000011001);
// AddConfigReg(0x02<<1|0b0,0b0000010101);
// AddConfigReg(0x03<<1|0b0,0b0001100101);
// AddConfigReg(0x04<<1|0b0,0b0100011000);
// AddConfigReg(0x05<<1|0b0,0b0000000000);
// AddConfigReg(0x06<<1|0b0,0b0000000000);
// AddConfigReg(0x07<<1|0b0,0b0000001010);
// AddConfigReg(0x2D<<1|0b0,0b0000000010);
// AddConfigReg(0x2F<<1|0b0,0b0000000000);
// AddConfigReg(0x36<<1|0b0,0b0000111010);
}
void AudioCodec_SetVolumeExternal(tAudioCodec *env, uint16_t *volume_level){
if(*volume_level <= 63){
env->volume_level = volume_level;
AudioCodec_SetVolumeLevel(env,env->volume_levels[*volume_level]);
}
}
void AudioCodec_Init(tAudioCodec *env,
tI2cIO *codec,
tAtCmd *atCmd,
tString128 *codecConfig,
tEraGlonassUveosDumperInterface *dumper,
eCarType *carType
){
env->carType = carType;
env->state = false;
env->dumper = dumper;
env->codec = codec;
env->atCmd = atCmd;
env->codecConfig = codecConfig;
SystemDelayMs(500);
ProtMethodsAdd_CodecSetGeinCard(env);
AudioCodec_InitConfig(env);
}
bool xAudioCodec_WriteConfig(tAudioCodec *env){
bool res = true;
if (env->codec != NULL) {
for (uint8_t i = 0; i < env->audioCodecConfig.regCounter; i++) {
if(AudioCodecWrite(
env->audioCodecConfig.configList[i].reg,
env->audioCodecConfig.configList[i].data
) == true
)
{
if(res != false) {
res = true;
}
}
else {
res = false;
}
}
} else {
res = false;
}
return res;
}
bool AudioCodec_StartUp(tAudioCodec *env){
bool res = xAudioCodec_WriteConfig(env);
if(env->volume_level != NULL)
{
AudioCodecWrite(0x36<<1|0b0, env->volume_levels[*env->volume_level]);
}
env->state = res;
return res;
}