MIPI_BaseC_WebinarFRTK/23_Seminar10/05_sensor_serial_p17.c

147 lines
3.5 KiB
C
Raw Normal View History

2024-11-13 09:22:28 +03:00
#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;
}