200 lines
6.6 KiB
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;
|
|
}
|