A1210/Core/Src/my.c

558 lines
14 KiB
C

#include "my.h"
#include "main.h"
#include "stm32f4xx_hal.h"
#include "struct.h"
#include "ssd1306.h"
extern UserData_TypeDef currentData;
extern uint16_t correctedKu[13];
extern float kNormToDAC;
char pString[16] = {0}; //Íóæíà äëÿ FloatToASCII
void setDAC(void);
void sh_applysetting(UserData_TypeDef * currentData){
sh_SetOutGain(currentData->IKU);
sh_SetFvch(currentData->IFV);
sh_SetFnch(currentData->IFN);
sh_SetPlavZeml(currentData->IPZ);
setDAC();
}
void sh_SetOutGain(uint16_t IKU){
switch (IKU){
case Ku0_1:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_RESET);
break;
case Ku0_2:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_RESET);
break;
case Ku0_5:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_RESET);
break;
case Ku1:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_RESET);
break;
/*HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);//âàðèê äëÿ ïðîâåðêè
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_RESET);*/
case Ku2:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_RESET);
break;
case Ku5:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_RESET);
break;
case Ku10:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET);
/*HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET);*/
break;
case Ku20:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET);
break;
case Ku50:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET);
break;
case Ku100:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET);
/* HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET); */
break;
case Ku200:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET);
break;
case Ku500:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET);
break;
case Ku1000:
HAL_GPIO_WritePin(A0_GPIO_Port, A0_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A1_GPIO_Port, A1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A4_GPIO_Port, A4_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A5_GPIO_Port, A5_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(K10_GPIO_Port, K10_Pin, GPIO_PIN_SET);
break;
}
};
void sh_SetFvch(uint16_t IFV){ //DA9 IA2 IA3
switch (IFV){
case Hp0_2:
HAL_GPIO_WritePin(A2_GPIO_Port, A2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A3_GPIO_Port, A3_Pin, GPIO_PIN_RESET);
break;
case Hp1:
HAL_GPIO_WritePin(A2_GPIO_Port, A2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A3_GPIO_Port, A3_Pin, GPIO_PIN_RESET);
break;
case Hp2:
HAL_GPIO_WritePin(A2_GPIO_Port, A2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A3_GPIO_Port, A3_Pin, GPIO_PIN_SET);
break;
case Hp10:
HAL_GPIO_WritePin(A2_GPIO_Port, A2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A3_GPIO_Port, A3_Pin, GPIO_PIN_SET);
break;
}
};
void sh_SetFnch(uint16_t IFN){
// IA6 IA7 IA8
//{0.1, 0.3, 1, 3, 10, 30, 100};
//Lp100, Lp300, Lp1000, Lp3000, Lp10000, Lp30000, Lp100000
switch (IFN){
case Lp100:
HAL_GPIO_WritePin(A6_GPIO_Port, A6_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A7_GPIO_Port, A7_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A8_GPIO_Port, A8_Pin, GPIO_PIN_RESET);
break;
case Lp300:
HAL_GPIO_WritePin(A6_GPIO_Port, A6_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A7_GPIO_Port, A7_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A8_GPIO_Port, A8_Pin, GPIO_PIN_RESET);
break;
case Lp1000:
HAL_GPIO_WritePin(A6_GPIO_Port, A6_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A7_GPIO_Port, A7_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A8_GPIO_Port, A8_Pin, GPIO_PIN_RESET);
break;
case Lp3000:
HAL_GPIO_WritePin(A6_GPIO_Port, A6_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A7_GPIO_Port, A7_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A8_GPIO_Port, A8_Pin, GPIO_PIN_RESET);
break;
case Lp10000:
HAL_GPIO_WritePin(A6_GPIO_Port, A6_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A7_GPIO_Port, A7_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A8_GPIO_Port, A8_Pin, GPIO_PIN_SET);
break;
case Lp30000:
HAL_GPIO_WritePin(A6_GPIO_Port, A6_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A7_GPIO_Port, A7_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A8_GPIO_Port, A8_Pin, GPIO_PIN_SET);
break;
case Lp100000:
HAL_GPIO_WritePin(A6_GPIO_Port, A6_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(A7_GPIO_Port, A7_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(A8_GPIO_Port, A8_Pin, GPIO_PIN_SET);
break;
}
};
void sh_SetPlavZeml(uint16_t IPZ){
if(IPZ==1){
HAL_GPIO_WritePin(PZ_GPIO_Port, PZ_Pin, GPIO_PIN_RESET);}
else
if(IPZ==0){
HAL_GPIO_WritePin(PZ_GPIO_Port, PZ_Pin, GPIO_PIN_SET);}
};
void setDAC(void){
uint16_t DVD=0;
setOffsetKuDisplay(); //todo:Êîñòûëü!! íóæíî ïîðàáîòàòü íàä àðõèòåêòóðîé, à íå ñ÷èòàòü êàê ïðèäåòñÿ
DVD = correctedKu[currentData.IKU]/kNormToDAC; // Äåëèì êîðååêòèðîâàííûé ìíîæèòåëü íà êîýôèöèåíò
WRDAC(DVD); //todo: äåëèì uint íà float - íàäåþñü çàðàáîòàåò
}
void WRDAC(uint16_t DVD)
{
uint8_t i;
uint16_t dvd = DVD;
dvd <<= 4;
for(i = 0; i < 12; i++)
{
if(dvd & 0x8000)
HAL_GPIO_WritePin(STD_GPIO_Port, STD_Pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(STD_GPIO_Port, STD_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);
dvd <<= 1;
}
HAL_GPIO_WritePin(FL_GPIO_Port, FL_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(FL_GPIO_Port, FL_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(STD_GPIO_Port, STD_Pin, GPIO_PIN_SET);
}
void DrawSome(int16_t some, uint8_t x, uint8_t y, uint8_t mode){
if (some<10) OLED_DrawNum(some, x, y, mode);
else if(some>=10&&some<=15) OLED_DrawChar((some+55), x, y, mode); //îòîáðàæàåì êàê HEX todo: ïðîâåðü
else OLED_DrawChar(some, x, y, mode);
}
int asciiToFloat4(uint16_t str[]){
/////îïðåäåëÿåì ãäå òî÷êà
float res=0;
int dotFounded=0;
int dotPos=0;
for (int i=0; i<=5; i++){
if (str[i]=='~'){ ///todo ñäåëàòü ïðîâåðêó íà íåñêîëüêî òî÷åê
if(dotFounded==0){dotFounded=1; dotPos=i;} //ñòàâèì ôëàã íàéäåííîé òî÷êè ïðèñâàèâàåì ïîçèöèþ
else return 1; //èíà÷å âîçâðàùàåì îøèáêó 1
}
}
float symbol[6];
symbol[0]=str[0];
symbol[1]=str[1];
symbol[2]=str[2];
symbol[3]=str[3];
symbol[4]=str[4];
symbol[5]=str[5];
if(dotFounded==0){
res=(float)symbol[0]*100000+(float)symbol[1]*10000+(float)symbol[2]*1000+(float)symbol[3]*100+(float)symbol[4]*10+(float)symbol[5];
memcpy(&currentData.SENS, &res, sizeof(float)); ///äåëàåì ïðÿìîå êîïèðîâàíèå èíà÷å âîçâðàùàåò íåïîíÿòíî ÷òî
return 0;
}
switch(dotPos){
case 0:
res=(float)symbol[1]/(float)10
+symbol[2]/(float)100
+symbol[3]/(float)1000
+symbol[4]/(float)10000
+symbol[5]/(float)100000;
break;
case 1:
res=symbol[0]
+(float)symbol[2]/10
+(float)symbol[3]/100
+(float)symbol[4]/1000
+(float)symbol[5]/10000;
break;
case 2:
res=symbol[0]*10
+(float)symbol[1]
+(float)symbol[3]/10
+(float)symbol[4]/100
+(float)symbol[5]/1000;
break;
case 3:
res=symbol[0]*100
+(float)symbol[1]*(float)10
+(float)symbol[2]
+(float)symbol[4]/10
+(float)symbol[5]/100;
break;
case 4:
res=symbol[0]*1000
+(float)symbol[1]*100
+(float)symbol[2]*10
+(float)symbol[3]
+(float)symbol[5]/10;
break;
case 5:
res=symbol[0]*10000
+(float)symbol[1]*1000
+(float)symbol[2]*100
+(float)symbol[3]*10
+(float)symbol[4];
break;
default:
break;
}
memcpy(&currentData.SENS, &res, sizeof(float));
return 0;
}
uint16_t readkey(void)
{
uint16_t key = 0;
if(HAL_GPIO_ReadPin(OK_BTN_GPIO_Port, OK_BTN_Pin) == GPIO_PIN_RESET)
key |= OK_BTN_Pin;
if(HAL_GPIO_ReadPin(UP_BTN_GPIO_Port, UP_BTN_Pin) == GPIO_PIN_RESET)
key |= UP_BTN_Pin;
if(HAL_GPIO_ReadPin(DN_BTN_GPIO_Port, DN_BTN_Pin) == GPIO_PIN_RESET)
key |= DN_BTN_Pin;
// if(HAL_GPIO_ReadPin(ON_GPIO_Port, ON_Pin) == GPIO_PIN_RESET) //todo: íîðìàëüíî ñäåëàòü êíîïêó âêëþ÷åíèÿ
// key |= ON_Pin;
return key;
}
__IO uint16_t repeat = 0;
uint16_t kbhit(void)
{
volatile uint16_t key;
static uint32_t dreb = 0; //äðåáåçã
static uint8_t first = 1; //ïðèçíàê ïåðâîãî ìîìåíòà íàæàòèÿ êíîïêè
static uint16_t rep = 50;
do
{
key = readkey();
if(!key)
{
if(dreb)
dreb--;
else first = 1;
}
else
{
if(dreb < 3)
dreb++;
}
//////
//for(int i=30000; i>0; i--){;} /// ïîêà ÷òî âìåñòî àíòèäðåáåçãà
//////
}
while((dreb > 0) && (dreb < 3));
if(!key) //åñëè êíîïêè îòïóùåíû
{
first = 1; //äîñòîâåðíî êíîïêè îòïóùåíû
return 0; //âåðíóòü 0
}
else //èíà÷å
{
if(first) //îïðåäåëèòü êíîïêó
{ //òîëüêî îäèí ðàç
first = 0; //çà íàæàòèå
repeat = rep = 32;
return key; //âåðíóòü â ãëàâíóþ ôóíêöèþ ñîñòîÿíèå êëàâèàòóðû
}
else
{
if(repeat)
return 0; //èìèòàöèÿ ñâîáîäíîé êëàâèàòóðû
else
{
if(rep > 0)
rep >>= 1;
else rep = 32;
repeat = rep;
//if(key == KEY_RESET_Pin)
return 0;
return key;
}
}
}
}
char* FloatToASCII(float Val, int32_t RoundTo)
{
uint8_t idx = 0;
int32_t i;
float value, F, I;
uint32_t rnd = 0;
uint32_t Tmp32 = 0;
uint32_t Int32 = 0;
uint32_t Frac32 = 0;
uint32_t _I32 = 0;
uint32_t _F32 = 0;
uint32_t d = 0, dd = 0;
char tmparray[32];
volatile bool minus = false;
memset(tmparray, 0, 32);
memset(pString, 0, 16);
value = Val;
if(value < 0)
minus = true;
if((Val >= 10000.00000f)/* || (Val <= 0)*/)
{
if(Val <= 0)
{
pString[0] = '0';
pString[1] = '~';
pString[2] = '0';
pString[3] = '\0';
}
else
{
pString[0] = '1';
pString[1] = '0';
pString[2] = '0';
pString[3] = '0';
pString[4] = '0';
pString[5] = '\0';
}
return pString;
}
value = ABS(Val);
rnd = ABS(RoundTo);
if(RoundTo < 0)
{
F = modff(value, &I);
while(rnd)
{
F *= 10.0f;
rnd--;
d++;
}
F = roundf(F);
dd = 1;
for(i = 0; i < d; i++)
dd *= 10;
if((uint32_t) F == dd)
{
F = 0;
I += 1;
}
}
else
{
I = roundf(value);
F = 0.0f;
}
Int32 = (uint32_t) I;
Frac32 = (uint32_t) F;
_I32 = Int32;
_F32 = Frac32;
idx = 0;
tmparray[idx++] = '\0';
if((Int32 == 0) && (Frac32 == 0))
{
if(RoundTo < 0)
{
for(i = 0; i < abs(RoundTo); i++)
tmparray[idx++] = '0';
tmparray[idx++] = '~';
}
tmparray[idx++] = '0';
}
else
{
if(RoundTo < 0)
{
for(i = 0; i < abs(RoundTo); i++)
{
Tmp32 = Frac32;
Frac32 /= 10;
Tmp32 = Tmp32 - Frac32 * 10;
tmparray[idx++] = '0' + Tmp32;
}
tmparray[idx++] = '~';
}
if(Int32 != 0)
{
while(Int32)
{
Tmp32 = Int32;
Int32 /= 10;
Tmp32 = Tmp32 - Int32 * 10;
tmparray[idx++] = '0' + Tmp32;
}
}
else
tmparray[idx++] = '0';
if(minus)
{
if((_I32 != 0) || (_F32 != 0))
tmparray[idx++] = '-';
}
}
for(i = 0; i < idx; i++)
pString[i] = tmparray[idx - i - 1];
return pString;
}