// // 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; }