254 lines
9.4 KiB
C
254 lines
9.4 KiB
C
//
|
||
// 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;
|
||
} |