MIPI_BaseC_WebinarFRTK/23_Seminar10/05_sensor_serial_p17.c
2024-11-13 09:22:28 +03:00

147 lines
3.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#define SIZE 30
struct sensor {
uint8_t day;
uint8_t month;
uint16_t year;
int8_t t;
};
void cgangeIJ(struct sensor* info,int i, int j){
struct sensor temp;
temp=info[i];
info[i]=info[j];
info[j]=temp;
}
//упорядочивающую его по неубыванию температуры
void SortByT(struct sensor* info,int n){
for(int i=0; i<n; ++i)
for(int j=i; j<n; ++j)
if(info[i].t>=info[j].t)
cgangeIJ(info,i,j);
}
unsigned int DateToInt(struct sensor* info){
return info->year << 16 | info->month << 8 | info->day;
}
//упорядочивающую его по дате
void SortByDate(struct sensor* info,int n){
for(int i=0; i<n; ++i)
for(int j=i; j<n; ++j)
if(DateToInt(info+i)>= DateToInt(info+j))
cgangeIJ(info,i,j);
}
void AddRecord(struct sensor* info,int number,
uint16_t year,uint8_t month,uint8_t day,int8_t t){
info[number].year = year;
info[number].month = month;
info[number].day = day;
info[number].t = t;
}
struct data
{
uint32_t number;
struct sensor info[SIZE];
} d;
void load_bin(struct sensor* info,int number)
{
//Проверка на открытие файла
FILE* f = fopen("sensor.bin","rb");
//Проверка на считанные данные
fread(info,number*sizeof(struct sensor),1,f);
fclose(f);
}
void save_bin(struct sensor* info,int number)
{
FILE* f = fopen("sensor.bin","wb");
fwrite(info,number*sizeof(struct sensor),1,f);
fclose(f);
}
void load_bin_d(struct data* d)
{
//Проверка на открытие файла
FILE* f = fopen("sensor.bin","rb");
//Проверка на считанные данные
fread(&d->number,sizeof(d->number),1,f);
fread(d->info,d->number*sizeof(struct sensor),1,f);
fclose(f);
}
void save_bin_d(struct data* d)
{
FILE* f = fopen("sensor.bin","wb");
fwrite(&d->number,sizeof(d->number),1,f);
fwrite(d->info,d->number*sizeof(struct sensor),1,f);
fclose(f);
}
int AddInfo(struct sensor* info){
int counter=0;
AddRecord(info,counter++,2021,9,16,9);
AddRecord(info,counter++,2022,9,2,-9);
AddRecord(info,counter++,2021,1,7,8);
AddRecord(info,counter++,2021,9,5,1);
return counter;
}
void print(struct sensor* info,int number){
printf("===================================\n");
for(int i=0;i<number;i++)
printf("%04d-%02d-%02d t=%3d\n",
info[i].year,
info[i].month,
info[i].day,
info[i].t);
}
union sensor_serdes
{
struct data _data;
uint8_t bytes[sizeof(struct data)];
};
void load_bin_des(union sensor_serdes * d)
{
FILE* f = fopen("sensor.bin","rb");
fread(d->bytes,sizeof(d->_data.number),1,f);
fread(d->bytes+sizeof(d->_data.number),
d->_data.number*sizeof(struct sensor),1,f);
fclose(f);
}
void save_bin_ser(union sensor_serdes* d)
{
FILE* f = fopen("sensor.bin","wb");
fwrite(d->bytes,sizeof(d->_data.number),1,f);
fwrite(d->bytes+sizeof(d->_data.number),
d->_data.number*sizeof(struct sensor),1,f);
fclose(f);
}
int main(int argc, char **argv)
{
struct data d;
union sensor_serdes* ds = (union sensor_serdes*)&d;
d.number=AddInfo(d.info);
print(d.info,d.number);
save_bin_ser(ds);
printf("\nSort by t\n");
SortByT(d.info,d.number);
print(d.info,d.number);
printf("\nSort by date\n");
SortByDate(d.info,d.number);
print(d.info,d.number);
load_bin_des(ds);
print(d.info,d.number);
return 0;
}