commit 1644b8f31d5258a722f47ea65f582dad38631a64 Author: cfif Date: Mon Jun 2 13:26:40 2025 +0300 Init diff --git a/Accel.c b/Accel.c new file mode 100644 index 0000000..9836097 --- /dev/null +++ b/Accel.c @@ -0,0 +1,143 @@ +// +// Created by ilya on 25.03.24. +// +#include +#include +#include "Accel.h" +#include "CmsisRtosThreadUtils.h" +#include "ext_telematica.h" +#include "at32f435_437_clock.h" + +crm_clocks_freq_type crm_clocks_freq_struct = {0}; +tAccel ACCEL; + +bool Accel_GetNext(tAccel *env, vector3 *value, uint32_t timeout) { + return osMessageQueueGet(env->dataQueue, value, 0, timeout) == osOK; +} + +void Accel_Clear(tAccel *env) { + osMessageQueueReset(env->dataQueue); +} + +void Accel_Init(tAccel *env, tSpiPortIO *accelIO) { + + env->errorDataFlag = true; + AccelQma6100P_Init(&env->accel, accelIO); +// InitThreadAtrStatic(&env->thread.attr, "Accel", env->thread.controlBlock, env->thread.stack, osPriorityNormal); +// env->thread.id = 0; + env->dataQueue = osMessageQueueNew(128, sizeof(vector3), NULL); + + env->accelDataFlow = (tAccelDataFlowInterface) { + .env = env, + .getNext = (accelDataGetNextCall) Accel_GetNext, + .clear = (accelDataClearCall) Accel_Clear, + }; + +} + +void Accel_StartDevice(tAccel *env) { + AccelQma6100P_ConfigureDefaults(&env->accel); +} + +bool Accel_WaitReady(tAccel *env, uint32_t timeout) { + + uint32_t time_end = SystemGetMs() + timeout; + + float len; + do { + len = vector3Len(env->current); + } while ((time_end > SystemGetMs()) && len < 0.1f); + + return len > 0.1f; +} + + +static _Noreturn void Accel_Thread(tAccel *env) { + //todo нужно переделать под таймер и семафор + for (;;) { + if (AccelQma6100P_Read(&env->accel, &env->current)) { + + if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) + EXT_ENV_ADR_TELE.tele_func(&env->accel.xyz, TELE_MODULE_ACCEL_DATA); + + osMessageQueuePut(env->dataQueue, &env->current, 0, 0); + env->errorDataFlag = true; + } else { + env->errorDataFlag = false; + } + SystemDelayMs(1); + } +} + +void Accel_StartThread(tAccel *env) { +// if (!env->thread.id) { +// env->thread.id = osThreadNew((osThreadFunc_t) (Accel_Thread), (void *) (env), &env->thread.attr); +// } +} + +void TMR1_Accel_TmrStart(tAccel *env){ + /* get system clock */ + crm_clocks_freq_get(&crm_clocks_freq_struct); + + /* enable tmr1 clock */ + crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE); + + /* tmr1 configuration */ + /* time base configuration */ + uint32_t tmr = (crm_clocks_freq_struct.apb2_freq * 2 / 10000) - 1; + tmr_base_init(TMR1, 9998, tmr/1000); + tmr_cnt_dir_set(TMR1, TMR_COUNT_UP); + + /* overflow interrupt enable */ + tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE); + + /* tmr1 hall interrupt nvic init */ + nvic_priority_group_config(NVIC_PRIORITY_GROUP_4); + nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 0x59, 0); + /* enable tmr1 */ + tmr_counter_enable(TMR1, TRUE); +} + +//uint16_t ms[1000]; +//volatile uint16_t i = 0; +//volatile uint16_t o = 0; +//volatile uint32_t ttt = 0; +//volatile uint32_t aa = 0; +osStatus_t stat = osError; + +void TMR1_OVF_TMR10_IRQHandler(void) +{ + if(tmr_interrupt_flag_get(TMR1, TMR_OVF_FLAG) == SET) + { + if(ACCEL.errorDataFlag == true) { + if (AccelQma6100P_Read(&ACCEL.accel, &ACCEL.current)) { + + if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) + EXT_ENV_ADR_TELE.tele_func(&ACCEL.accel.xyz, TELE_MODULE_ACCEL_DATA); + + stat = osMessageQueuePut(ACCEL.dataQueue, &ACCEL.current, 0, 0); + if (stat != osOK) { + asm("nop"); + } + ACCEL.errorDataFlag = true; + +// if(o == 1000){ +// o=0; +// } +// aa = SystemGetMs(); +// if(ttt > aa){ +// ++i; +// } else { +// ms[o] = i; +// i=0; +// o++; +// ttt = SystemGetMs()+1000; +// } + + } else { + ACCEL.errorDataFlag = false; + } + } + tmr_flag_clear(TMR1, TMR_OVF_FLAG); + } +} \ No newline at end of file diff --git a/Accel.h b/Accel.h new file mode 100644 index 0000000..c6d565a --- /dev/null +++ b/Accel.h @@ -0,0 +1,41 @@ +// +// Created by ilya on 25.03.24. +// + +#ifndef SMART_COMPONENTS_ACCEL_H +#define SMART_COMPONENTS_ACCEL_H + +#include +#include "AccelDataFlowInterface.h" +#include "Accel_QMA6100P.h" + +typedef struct { + tAccelQma6100P accel; + tAccelDataFlowInterface accelDataFlow; + + osMessageQueueId_t dataQueue; + volatile bool errorDataFlag; + vector3 current; + +// struct { +// osThreadId_t id; +// uint32_t stack[256]; +// StaticTask_t controlBlock; +// osThreadAttr_t attr; +// } thread; + +} tAccel; + +extern tAccel ACCEL; + +void Accel_Init(tAccel *env, tSpiPortIO *accelIO); + +void Accel_StartDevice(tAccel *env); + +void Accel_StartThread(tAccel *env); +void Accel_Clear(tAccel *env); +void TMR1_Accel_TmrStart(tAccel *env); + +bool Accel_WaitReady(tAccel *env, uint32_t timeout); + +#endif //SMART_COMPONENTS_ACCEL_H diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..9589ff8 --- /dev/null +++ b/modular.json @@ -0,0 +1,13 @@ +{ + "dep": [ + + ], + "cmake": { + "inc_dirs": [ + "./" + ], + "srcs": [ + "./**.c" + ] + } +} \ No newline at end of file