AudioRecorderSimcomSim7600E/Src/AudioRecorderSimComSim7600E.c

200 lines
6.6 KiB
C

//
// Created by zemon on 29.11.22.
//
#include <memory.h>
#include "AudioRecorderSimComSim7600E.h"
#include "SystemDelayInterface.h"
void AudioRecordSimComSim7600E_Init(tAudioRecorder *env, tAtCmd *atCmd){
env->atCmd = atCmd;
env->recorderIsBusy = false;
}
static bool AudioRecorderSimComSim7600E_Start(tAudioRecorder *env, char *name, uint16_t nameLen, uint32_t timeout) { ;
if (env->recorderIsBusy == false) {
env->recorderIsBusy = true;
}
if (osMutexAcquire(env->atCmd->access, 1000) == osOK) {
AtCommandResult result = AT_ERROR;
if(AtGsmSimComSim7600E_RecAudioFileTo(env->atCmd, name, nameLen) == AT_OK){
result = AtCmdWaitOk(env->atCmd, 10, 10);
if (env->recorderIsBusy == true) {
env->recorderIsBusy = false;
}
osMutexRelease(env->atCmd->access);
return result;
} else {
if (env->recorderIsBusy == true) {
env->recorderIsBusy = false;
}
osMutexRelease(env->atCmd->access);
return AT_ERROR;
}
}
if (env->recorderIsBusy == true) {
env->recorderIsBusy = false;
}
return AT_ERROR;
}
static AtCommandResult AudioRecorderSimComSim7600E_WaitStopToEndRecord(tAudioRecorder *env, uint32_t timeout) {
AtCommandResult result = AT_ERROR;
env->recorderIsBusy = true;
result = AtGsmSimComSim7600E_RecorderAudioFileStopNotSubmit(env->atCmd);
if (result== AT_OK) {
result = AtGsmSimComSim7600E_RecorderAudioFileWaitToStop(env->atCmd);
if (result == AT_OK) {
if (env->recorderIsBusy == true) {
env->recorderIsBusy = false;
}
return AT_OK;
}
}
return AT_ERROR;
}
static bool AudioRecordSimComSim7600E_StartToEnd(tAudioRecorder *env, char *name, uint16_t nameLen) {
AtCommandResult res;
res = AudioRecorderSimComSim7600E_Start(env, name, nameLen, 0);
return res;
}
static bool AudioRecordSimComSim7600E_Start(tAudioRecorder *env, char *name, uint16_t nameLen) {
char fileName[nameLen + 4];
memcpy(fileName, name, nameLen);
stpncpy(fileName + nameLen, ".wav", 4);
AtCommandResult result = AT_ERROR;
uint32_t end = SystemGetMs() + 5000;
while (end > SystemGetMs()){
if (osMutexAcquire(env->atCmd->access, 500) == osOK) {
result = AtGsmSimComSim7600E_RecorderAudioFileStart(env->atCmd, fileName, nameLen + 4);
if(result == AT_OK) {
osMutexRelease(env->atCmd->access);
return true;
}
osMutexRelease(env->atCmd->access);
SystemDelayMs(100);
}
}
return result;
}
static bool AtGsmSimComSim7600E_RecordrerAudioFileDel(tAudioRecorder *env, char *name, uint16_t nameLen) {
env->recorderIsBusy = true;
char fileName[nameLen + 4];
memcpy(fileName, name, nameLen);
stpncpy(fileName + nameLen, ".wav", 4);
AtCommandResult result = AT_ERROR;
uint32_t end = SystemGetMs() + 500;
while (end > SystemGetMs()){
if (osMutexAcquire(env->atCmd->access, 1000) == osOK) {
result = AtGsmSimComSim7600E_DeleteAudioFile(env->atCmd, fileName, nameLen + 4);
if(result == AT_OK){
osMutexRelease(env->atCmd->access);
env->recorderIsBusy = false;
return result;
}
osMutexRelease(env->atCmd->access);
env->recorderIsBusy = false;
}
SystemDelayMs(100);
}
env->recorderIsBusy = false;
return result;
}
static bool AudioRecordSimComSim7600E_StopToEnd(tAudioRecorder *env, uint32_t timeout) {
AtCommandResult result = AT_ERROR;
uint32_t tm = SystemGetMs() + timeout;
while (tm > SystemGetMs()) {
SystemDelayMs(1);
}
env->recorderIsBusy = true;
if (osMutexAcquire(env->atCmd->access, 1000) == osOK) {
result = AudioRecorderSimComSim7600E_WaitStopToEndRecord(env, timeout);
osMutexRelease(env->atCmd->access);
env->recorderIsBusy = false;
return result;
}
env->recorderIsBusy = false;
return result;
}
static bool AudioRecordSimComSim7600E_Stop(tAudioRecorder *env) {
AtCommandResult result = AT_ERROR;
result = AtGsmSimComSim7600E_RecorderAudioFileStop(env->atCmd);
return result;
}
static bool AudioPlayerSimComSim7600E_StopRecord(tAudioRecorder *env, uint64_t timeout) {
AtCommandResult result = AT_ERROR;
if (osMutexAcquire(env->atCmd->access, 1000) == osOK) {
result = AtGsmSimComSim7600E_RecorderAudioFileWaitStop(env->atCmd, timeout) == AT_OK;
osMutexRelease(env->atCmd->access);
}
if(result == AT_OK){
if(env->recorderIsBusy == true){
env->recorderIsBusy = false;
}
return result;
} else {
AudioRecordSimComSim7600E_Stop(env);
if(env->recorderIsBusy == true){
env->recorderIsBusy = false;
}
return result;
}
}
bool AudioRecordSimComSim7600E_IsBusy(tAudioRecorder *env, uint32_t timeout) {
if(env->recorderIsBusy){
return true;
} else {
return false;
}
}
static bool AudioPlayerSimComSim7600E_WaitStop(tAudioRecorder *env, uint32_t timeout) {
AtCommandResult result = AT_ERROR;
if (osMutexAcquire(env->atCmd->access, 1000) == osOK) {
result = AtGsmSimComSim7600E_RecorderAudioFileWaitStop(env->atCmd, timeout) == AT_OK;
if(result == AT_OK){
osMutexRelease(env->atCmd->access);
if(env->recorderIsBusy == true){
env->recorderIsBusy = false;
}
return result;
} else {
AudioPlayerSimComSim7600E_StopRecord(env, timeout);
osMutexRelease(env->atCmd->access);
if(env->recorderIsBusy == true){
env->recorderIsBusy = false;
}
return result;
}
}
return result;
}
tAudioRecorderInterface AudioRecordSimComSim7600E_GetInterface(tAudioRecorder *env) {
tAudioRecorderInterface result = {
.env = env,
.start = (audioRecordStart) AudioRecordSimComSim7600E_Start,
.recordToEnd = (audioRecordStartToEnd) AudioRecordSimComSim7600E_StartToEnd,
.stop = (audioRecordStop) AudioRecordSimComSim7600E_Stop,
.stopToEnd = (audioRecordStopToEnd) AudioRecordSimComSim7600E_StopToEnd,
.del = (audioRecordDel) AtGsmSimComSim7600E_RecordrerAudioFileDel,
.waitStop = (audioRecordWaitStop) AudioPlayerSimComSim7600E_WaitStop,
.IsBusy = (audioRecordIsBusy) AudioRecordSimComSim7600E_IsBusy,
};
return result;
}