source: S-port/trunk/Core/Src/ini.c@ 1

Last change on this file since 1 was 1, checked in by AlexLir, 3 years ago
File size: 5.4 KB
Line 
1#include "ini.h"
2#include "stdint.h"
3#include "string.h"
4#include "stdlib.h"
5#include "cmsis_os.h"
6
7extern xSemaphoreHandle MutexAccessFlash;
8uint32_t substr(char *str, uint32_t PosStart, char end, char *s);
9
10FIL iniFile;
11 /*
12Чтение строкового типа.
13 Если секция или ключ не найдены или файл не открывается , то возвращаемое значение будет 0, усли ключ и секция найденны успешно, то = 1
14
15 path - Имя файла для чтения
16 section - Имя секции для поиска
17 key - Имя ключа для поиска
18 value - Указатель на переменную в которую записать результат
19 */
20_Bool ini_ReadString(const TCHAR* path, const char* section, const char* key, char* value)
21{
22 _Bool SectFind = 0;
23 uint8_t State = 0;
24 char *p, BufferRead[128] = {0};
25
26 if((section == NULL) || (key == NULL)) return 0;
27
28 xSemaphoreTake(MutexAccessFlash, portMAX_DELAY);// пытаемся взять мьютекс для чтения файла конфигурации
29 if(f_open(&iniFile, path, FA_READ) == FR_OK)
30 {
31 for(;State != 3;)
32 {
33 switch(State)
34 {
35 case 0:
36 memset(value, NULL, strlen(value));
37 if(f_gets(BufferRead, 64, &iniFile) != NULL) // то все считалось
38 {
39 if(!SectFind)State = 1;
40 else State = 2;
41 }
42 else if(f_eof(&iniFile) != 0) State = 3;//конец файла, выходим
43 break;
44 case 1: // поиск секции
45 p = strchr(BufferRead, '[');
46 if(p != NULL)
47 {
48 if(substr(p, 1, ']', value) != 0)
49 {
50 if(strncmp(value, section, strlen(section)) == 0) SectFind = 1;// если найдена нужная секция выставляем флаг
51 }
52 }
53 State = 0; // переходим для взатия новой строки
54 break;
55 case 2: // поиск ключа
56 if(strncmp(BufferRead, key, strlen(key)) == 0) // найден нужный ключ
57 {
58 p = strchr(BufferRead, '=');
59 if(p != NULL)
60 {
61 if(substr(p, 1, '\n', value) != 0)
62 {
63 f_close(&iniFile);
64 xSemaphoreGive(MutexAccessFlash);
65 return 1;
66 }
67 else State = 3;
68 }
69 else State = 0;
70 }
71 else State = 0;
72 break;
73 }
74 }
75 f_close(&iniFile);
76 }
77 xSemaphoreGive(MutexAccessFlash);
78 return 0;
79}
80
81/*
82Чтение числового типа
83 Если секция или ключ не найдены или файл не открывается , то возвращает Defvalue,
84
85 path - Имя файла для чтения
86 section - Имя секции для поиска
87 key - Имя ключа для поиска
88Defvalue - Значение по умолчанию если нет ключа
89*/
90uint16_t ini_ReadInteger(const TCHAR* path, const char* section, const char* key, uint16_t Defvalue, uint8_t radix)
91{
92 char buf[16] = {0};
93
94 if((section == NULL) || (key == NULL)) return 0;
95
96 if(ini_ReadString(path, section, key, buf) != 0) {
97 if(radix == 16) return (strtol((char*)&buf[0], NULL, 16));
98 else if(radix == 10)return (strtol((char*)&buf[0], NULL, 10));
99 }
100 return Defvalue;
101}
102
103//uint16_t ini_geth(const TCHAR* path, const char* section, const char* key, uint16_t Defvalue)
104//{
105// char buf[16] = {0};
106// if((section == NULL) || (key == NULL)) return 0;
107// if(ini_ReadString(path, section, key, buf) != 0)return (strtol(buf, NULL, 16));
108// return Defvalue;
109//}
110
111/*Читает все значения ключа и заносит в массив ValueBuffer*/
112_Bool ini_ReadKeyValue(const TCHAR* path, const char* section, const char* key, uint16_t *ValueBuffer)
113{
114 char buf[64] = {0}, *end;
115 if((section == NULL) || (key == NULL)) return 0;
116
117 if(ini_ReadString(path, section, key, buf) != 0){
118 ValueBuffer[0] = strtol(buf, &end, 10);
119 for(uint8_t i = 1; *end != '\0'; i++) ValueBuffer[i] = strtol(end + 1, &end, 10);
120 return 1;
121 }
122 return 0;
123}
124
125uint32_t substr(char *str, uint32_t PosStart, char end, char *s) // возвращает длину подстроки, 0 если нет конечного символа
126{
127 uint8_t len = 0;
128 uint8_t PosEnd = 0;
129 uint8_t StrLen = strlen(str);
130 if(StrLen == 0) return 0;
131
132 for(; str[PosStart + PosEnd] != end; PosEnd++)
133 {
134 len++;
135 if(StrLen == len) return 0;
136 }
137 for(uint8_t i = 0; i < len; i++) s[i] = str[i + PosStart];
138 s[len] = '\0';
139 return len;
140}
Note: See TracBrowser for help on using the repository browser.