Перенос на новую организацию GONEC

This commit is contained in:
cfif 2025-01-24 13:22:32 +03:00
commit 5c43556afb
26 changed files with 11526 additions and 0 deletions

19
Inc/auth.h Normal file
View File

@ -0,0 +1,19 @@
//
// Created by cfif on 13.02.23.
//
#ifndef GONEC_GSM_AUTH_H
#define GONEC_GSM_AUTH_H
#include "DeviceStorageIni.h"
typedef enum {
AUTH_NONE = 0,
AUTH_USER = 1,
AUTH_INTEG = 2,
AUTH_ADMIN = 3
} typeAuth;
typeAuth Auth(tDeviceStorageIni *storage, char *authStr);
#endif //GONEC_GSM_AUTH_H

90
Inc/fs_base_func.h Normal file
View File

@ -0,0 +1,90 @@
//
// Created by cfif on 30.01.23.
//
#include "string.h"
#include "inttypes.h"
//#include "stream.h"
#include "stdbool.h"
#include "time.h"
#include "RtcIO.h"
#include "fs_interface.h"
#include "md5alg.h"
#ifndef GONEC_GSM_FS_BASE_FUNC_H
#define GONEC_GSM_FS_BASE_FUNC_H
void toAddPrefixStr(char *out, char *in, size_t len);
bool CopyFileFs_crc_md5(tFs *fs, uint32_t typeCrc, md5a_context *md5ctx, char *filenameTo, char *filenameFrom,
uint32_t offset, uint32_t initCrc32);
void getDelFileDirDatTracert(tFs *fs, char *path);
void getPath(char *pathIn, char *pathOut, int count_dir);
unsigned char crc8(unsigned char *pcBlock, unsigned char len);
uint8_t SF04_CheckCrc(const uint8_t data[], uint8_t nbrOfBytes);
void reportScan(char *str, uint32_t AT);
FRESULT scan_files(char *path, uint32_t *globDirCount, uint32_t *globFileCount);
void getDelFilesDirDat(tFs *fs, char *path, char *ext);
void getDelFileDirDat(tFs *fs, char *path, char *ext);
// Получение указателя на расширение файла
char *getVoidExt(char *buf);
// Получение имени файла лога
size_t getFileNameLog(tRtcIO *rtc, char *buf, size_t len);
// Создание файла из буфера
bool createFileFromBuf(tFs *fs, char *path_fileName, char *buf, size_t buf_len, bool isCreate);
// Получение строки дата
size_t getDateStr(tRtcIO *rtc, char *buf, size_t len);
// Получение максимального id включая поддиректории
uint32_t getNameMaxDirId(tFs *fs, char *path, char *ext);
// Получение максимального id без поддиректорий
uint32_t getNameMaxFileId(tFs *fs, char *path, char *ext);
// Получение строки дата
size_t getNameDir(tRtcIO *rtc, char *buf, size_t len);
// Получение строки дата время в UTC
size_t getDataTimeUTC(time_t *timestamp, char *buf, size_t len);
// Получение строки дата/время
size_t getDataTime(time_t *timestamp, char *buf, size_t len);
bool CopyFileFs(tFs *fs, char *filenameTo, char *filenameFrom, uint32_t offset);
bool CopyFileFsSize(tFs *fs, char *filenameTo, char *filenameFrom, uint32_t offset, uint32_t max);
bool
CopyFileTrucSizeFs(tFs *fs, uint32_t typeCrc, md5a_context *md5ctx, uint32_t *crc32, uint8_t *md5sum,
uint32_t *crc32sumFile, uint8_t *md5sumFile,
char *filenameTo, char *filenameFrom, uint32_t offset, uint32_t truncBytes, uint32_t size);
void getDelFilesDirClean(tFs *fs, char *path);
// Удаление всех файлов в директории
bool delDirFileFs(tFs *fs, char *dir);
// Удаление всех файлов с директориями
FRESULT deleteAllDir(tFs *fs, char *path);
// Получене crc
uint32_t GetCrcFileFs(tFs *fs, char *filename, uint32_t offset);
// Получене crc
uint32_t GetCrcFileisOpenFs(tFs *fs, FIL *fsrc, uint32_t offset);
void getDelFilesDir(tFs *fs, char *path);
uint32_t CrcFileFs(tFs *fs, char *filename);
#endif //GONEC_GSM_FS_BASE_FUNC_H

41
Inc/fsdata.h Normal file
View File

@ -0,0 +1,41 @@
/*
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* This file is part of the lwIP TCP/IP stack.
*
* Author: Adam Dunkels <adam@sics.se>
*
*/
#ifndef LWIP_FSDATA_H
#define LWIP_FSDATA_H
#include "lwip/apps/httpd_opts.h"
#include "lwip/apps/fs.h"
/* THIS FILE IS DEPRECATED AND WILL BE REMOVED IN THE FUTURE */
/* content was moved to fs.h to simplify #include structure */
#endif /* LWIP_FSDATA_H */

35
Inc/http_server.h Normal file
View File

@ -0,0 +1,35 @@
//
// Created by cfif on 20.10.22.
//
#ifndef ARTERY_PROJECT_HTTP_SERVER_H
#define ARTERY_PROJECT_HTTP_SERVER_H
#include "cmsis_os2.h"
#define FileTableDescriptorAddress 0x08350000
typedef struct {
char name[64];
uint32_t size;
uint32_t address;
} tFileTableDescriptor;
#include "RtcArtery.h"
#include "httpd_post.h"
#include "DeviceStorageIni.h"
#include "TaskAdc.h"
#include "Gpios.h"
#include "ModemLog.h"
void httpd_init(tExternal *external, tRtcIO *rtc, tTaskAdc *taskAdc, tDeviceStorageIni *storage, tFs *fs,
tSpiPorts *spiPorts,
tFirmwareLoader *firmwareMainLoader,
tFirmwareLoader *firmwareBootLoader,
tModemMain *modemMain, osMutexId_t accessHTTP, osMutexId_t accessMODEM, osMutexId_t accessLOG,
osMutexId_t accessLOG2,
tGpios *gpios, tFileLogger *flog, tModemMainLog *modemMainLog);
//void httpd_init();
#endif //ARTERY_PROJECT_HTTP_SERVER_H

255
Inc/httpd.h Normal file
View File

@ -0,0 +1,255 @@
/**
* @file
* HTTP server
*/
/*
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* This file is part of the lwIP TCP/IP stack.
*
* Author: Adam Dunkels <adam@sics.se>
*
* This version of the file has been modified by Texas Instruments to offer
* simple server-side-include (SSI) and Common Gateway Interface (CGI)
* capability.
*/
#ifndef LWIP_HDR_APPS_HTTPD_H
#define LWIP_HDR_APPS_HTTPD_H
#include "httpd_opts.h"
#include "lwip/err.h"
#include "lwip/pbuf.h"
#ifdef __cplusplus
extern "C" {
#endif
#if LWIP_HTTPD_CGI
/**
* @ingroup httpd
* Function pointer for a CGI script handler.
*
* This function is called each time the HTTPD server is asked for a file
* whose name was previously registered as a CGI function using a call to
* http_set_cgi_handlers. The iIndex parameter provides the index of the
* CGI within the cgis array passed to http_set_cgi_handlers. Parameters
* pcParam and pcValue provide access to the parameters provided along with
* the URI. iNumParams provides a count of the entries in the pcParam and
* pcValue arrays. Each entry in the pcParam array contains the name of a
* parameter with the corresponding entry in the pcValue array containing the
* value for that parameter. Note that pcParam may contain multiple elements
* with the same name if, for example, a multi-selection list control is used
* in the form generating the data.
*
* The function should return a pointer to a character string which is the
* path and filename of the response that is to be sent to the connected
* browser, for example "/thanks.htm" or "/response/error.ssi".
*
* The maximum number of parameters that will be passed to this function via
* iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in
* the incoming HTTP request above this number will be discarded.
*
* Requests intended for use by this CGI mechanism must be sent using the GET
* method (which encodes all parameters within the URI rather than in a block
* later in the request). Attempts to use the POST method will result in the
* request being ignored.
*
*/
typedef const char *(*tCGIHandler)(int iIndex, int iNumParams, char *pcParam[],
char *pcValue[]);
/**
* @ingroup httpd
* Structure defining the base filename (URL) of a CGI and the associated
* function which is to be called when that URL is requested.
*/
typedef struct
{
const char *pcCGIName;
tCGIHandler pfnCGIHandler;
} tCGI;
void http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers);
#endif /* LWIP_HTTPD_CGI */
#if LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI
#if LWIP_HTTPD_CGI_SSI
/* we have to prototype this struct here to make it available for the handler */
struct fs_file;
/** Define this generic CGI handler in your application.
* It is called once for every URI with parameters.
* The parameters can be stored to the object passed as connection_state, which
* is allocated to file->state via fs_state_init() from fs_open() or fs_open_custom().
* Content creation via SSI or complete dynamic files can retrieve the CGI params from there.
*/
extern void httpd_cgi_handler(struct fs_file *file, const char* uri, int iNumParams,
char **pcParam, char **pcValue
#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE
, void *connection_state
#endif /* LWIP_HTTPD_FILE_STATE */
);
#endif /* LWIP_HTTPD_CGI_SSI */
#endif /* LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI */
#if LWIP_HTTPD_SSI
/**
* @ingroup httpd
* Function pointer for the SSI tag handler callback.
*
* This function will be called each time the HTTPD server detects a tag of the
* form <!--#name--> in files with extensions mentioned in the g_pcSSIExtensions
* array (currently .shtml, .shtm, .ssi, .xml, .json) where "name" appears as
* one of the tags supplied to http_set_ssi_handler in the tags array. The
* returned insert string, which will be appended after the the string
* "<!--#name-->" in file sent back to the client, should be written to pointer
* pcInsert. iInsertLen contains the size of the buffer pointed to by
* pcInsert. The iIndex parameter provides the zero-based index of the tag as
* found in the tags array and identifies the tag that is to be processed.
*
* The handler returns the number of characters written to pcInsert excluding
* any terminating NULL or HTTPD_SSI_TAG_UNKNOWN when tag is not recognized.
*
* Note that the behavior of this SSI mechanism is somewhat different from the
* "normal" SSI processing as found in, for example, the Apache web server. In
* this case, the inserted text is appended following the SSI tag rather than
* replacing the tag entirely. This allows for an implementation that does not
* require significant additional buffering of output data yet which will still
* offer usable SSI functionality. One downside to this approach is when
* attempting to use SSI within JavaScript. The SSI tag is structured to
* resemble an HTML comment but this syntax does not constitute a comment
* within JavaScript and, hence, leaving the tag in place will result in
* problems in these cases. In order to avoid these problems, define
* LWIP_HTTPD_SSI_INCLUDE_TAG as zero in your lwip options file, or use JavaScript
* style block comments in the form / * # name * / (without the spaces).
*/
typedef u16_t (*tSSIHandler)(
#if LWIP_HTTPD_SSI_RAW
const char* ssi_tag_name,
#else /* LWIP_HTTPD_SSI_RAW */
int iIndex,
#endif /* LWIP_HTTPD_SSI_RAW */
char *pcInsert, int iInsertLen
#if LWIP_HTTPD_SSI_MULTIPART
, u16_t current_tag_part, u16_t *next_tag_part
#endif /* LWIP_HTTPD_SSI_MULTIPART */
#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE
, void *connection_state
#endif /* LWIP_HTTPD_FILE_STATE */
);
/** Set the SSI handler function
* (if LWIP_HTTPD_SSI_RAW==1, only the first argument is used)
*/
void http_set_ssi_handler(tSSIHandler pfnSSIHandler,
const char **ppcTags, int iNumTags);
/** For LWIP_HTTPD_SSI_RAW==1, return this to indicate the tag is unknown.
* In this case, the webserver writes a warning into the page.
* You can also just return 0 to write nothing for unknown tags.
*/
#define HTTPD_SSI_TAG_UNKNOWN 0xFFFF
#endif /* LWIP_HTTPD_SSI */
#if LWIP_HTTPD_SUPPORT_POST
/* These functions must be implemented by the application */
/**
* @ingroup httpd
* Called when a POST request has been received. The application can decide
* whether to accept it or not.
*
* @param connection Unique connection identifier, valid until httpd_post_end
* is called.
* @param uri The HTTP header URI receiving the POST request.
* @param http_request The raw HTTP request (the first packet, normally).
* @param http_request_len Size of 'http_request'.
* @param content_len Content-Length from HTTP header.
* @param response_uri Filename of response file, to be filled when denying the
* request
* @param response_uri_len Size of the 'response_uri' buffer.
* @param post_auto_wnd Set this to 0 to let the callback code handle window
* updates by calling 'httpd_post_data_recved' (to throttle rx speed)
* default is 1 (httpd handles window updates automatically)
* @return ERR_OK: Accept the POST request, data may be passed in
* another err_t: Deny the POST request, send back 'bad request'.
*/
err_t httpd_post_begin(void *connection, const char *uri, const char *http_request,
u16_t http_request_len, int content_len, char *response_uri,
u16_t response_uri_len, u8_t *post_auto_wnd);
/**
* @ingroup httpd
* Called for each pbuf of data that has been received for a POST.
* ATTENTION: The application is responsible for freeing the pbufs passed in!
*
* @param connection Unique connection identifier.
* @param p Received data.
* @return ERR_OK: Data accepted.
* another err_t: Data denied, http_post_get_response_uri will be called.
*/
err_t httpd_post_receive_data(void *connection, struct pbuf *p);
/**
* @ingroup httpd
* Called when all data is received or when the connection is closed.
* The application must return the filename/URI of a file to send in response
* to this POST request. If the response_uri buffer is untouched, a 404
* response is returned.
*
* @param connection Unique connection identifier.
* @param response_uri Filename of response file, to be filled when denying the request
* @param response_uri_len Size of the 'response_uri' buffer.
*/
void httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len);
#if LWIP_HTTPD_POST_MANUAL_WND
void httpd_post_data_recved(void *connection, u16_t recved_len);
#endif /* LWIP_HTTPD_POST_MANUAL_WND */
#endif /* LWIP_HTTPD_SUPPORT_POST */
void httpd_init(void);
#if HTTPD_ENABLE_HTTPS
struct altcp_tls_config;
void httpd_inits(struct altcp_tls_config *conf);
#endif
#ifdef __cplusplus
}
#endif
#endif /* LWIP_HDR_APPS_HTTPD_H */

90
Inc/httpd_TablesPostGet.h Normal file
View File

@ -0,0 +1,90 @@
//
// Created by cfif on 13.12.22.
//
#ifndef GONEC_ARTERY_HTTPD_TABLESPOSTGET_H
#define GONEC_ARTERY_HTTPD_TABLESPOSTGET_H
#include "httpd_post.h"
#include "httpd_get.h"
#include "Settings_General.h"
#include "Settings_Basic_Access.h"
#include "Settings_Frequency_Speed.h"
#include "Settings_Tracert.h"
#include "Settings_Transceiver.h"
#include "Settings_Network.h"
#include "Settings_Date_Time.h"
#include "Settings_RS485_Bluetooth.h"
#include "httpd_post_handlers.h"
#include "httpd_get_handlers.h"
#include "JSONSettings.h"
#include "httpd_types.h"
typedef enum {
ID_Post_Var = 0,
ID_Post_Message_Create_Cmd = 1,
ID_Post_Message_Create_Msg2 = 2,
ID_Post_Message_Create_Msg3 = 3,
ID_Post_Key_Load = 4,
ID_Post_Update_Web_File = 5,
ID_Post_Update_Main_Init_File = 6,
ID_Post_Update_Main_Write_File = 7,
ID_Post_Update_Write_Crypto = 8,
ID_Post_Update_Write_Modem = 9,
ID_Post_Update_Init_Write_Modem = 10,
ID_Post_Update_Start_Modem = 11,
ID_Post_Update_Init_Write_Crypto = 12,
ID_Post_Update_Start_Crypto = 13,
ID_Post_Update_Start_Main = 14,
ID_Post_Write_Other_File = 15,
ID_Post_sendmsg2 = 16,
ID_Post_Update_Boot_Init_File = 17,
ID_Post_Update_Boot_Write_File = 18
} idPost_t;
typedef enum {
ID_Get_Settings = 0,
ID_Get_Key_File = 1,
ID_Get_Messages_Inbox = 2,
ID_Get_Messages_Outbox = 3,
ID_Get_Messages_Sentbox = 4,
ID_Get_Messages_Content_Inbox = 5,
ID_Get_Messages_Content_Outbox = 6,
ID_Get_Messages_Content_Sentbox = 7,
ID_Get_Messages_Meta_Content_Inbox = 8,
ID_Get_Messages_Meta_Content_Outbox = 9,
ID_Get_Messages_Meta_Content_Sentbox = 10,
ID_Get_Get_Version = 11
} idGet_t;
struct tablePostGetSetting {
const void *json;
const char *path;
};
typedef idPostResult_t (*tPostMethod)(tHttpPostSetting *env);
typedef idPostResult_t (*tGetMethod)(tHttpSetting *env);
struct tablePost {
const char *path;
uint8_t id;
};
struct tableGet {
const char *path;
uint8_t id;
tGetMethod method;
};
struct tableKeysAddr {
uint32_t addr;
uint8_t countPage;
};
extern const struct tablePostGetSetting tablePostGetSettings[];
extern const struct tablePost tablePosts[];
extern const struct tableGet tableGets[];
extern const struct to_json jsonResponse_Post[];
#endif //GONEC_ARTERY_HTTPD_TABLESPOSTGET_H

23
Inc/httpd_base_func.h Normal file
View File

@ -0,0 +1,23 @@
//
// Created by cfif on 12.12.22.
//
#ifndef GONEC_ARTERY_HTTPD_BASE_FUNC_H
#define GONEC_ARTERY_HTTPD_BASE_FUNC_H
size_t getDataTimeUTCex(struct tm *dateTime, char *buf, size_t len);
int extract_path_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max);
int extract_grp_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max);
uint8_t HexToData(char* string, uint8_t* bytes);
void string2hexString(char* input, int size, char* output);
void StrToStr(char *str1, char *str2);
int extract_utf8_parameters(char *inBuf, char *outBuf, int maxlen);
int extract_uri_ex_parameters(char *params, char *param_names[], char *param_vals[], int max_params);
int extract_ip_ex_parameters(char *params, char *param_names[], char *param_vals[], int max_params);
int extract_mac_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max);
int b64_decode(const char *in, unsigned char *out, size_t outlen);
#endif //GONEC_ARTERY_HTTPD_BASE_FUNC_H

19
Inc/httpd_get.h Normal file
View File

@ -0,0 +1,19 @@
//
// Created by cfif on 10.11.22.
//
#ifndef GONEC_ARTERY_HTTPD_GET_H
#define GONEC_ARTERY_HTTPD_GET_H
#include "httpd_types.h"
#include "DeviceStorageIni.h"
#include "SpiPorts.h"
#include "fs_interface.h"
#include "httpd_post.h"
#include "auth.h"
int httpd_get_begin(tHttpSetting *httpSettings, typeAuth auth, const char *uri, char *params, bool *isContentFile,
char *fileNameContent, char *bufAnswer, /*char *bigBuffer, bool *isBigBuffer,*/
uint32_t *tot_len);
#endif //GONEC_ARTERY_HTTPD_GET_H

61
Inc/httpd_get_handlers.h Normal file
View File

@ -0,0 +1,61 @@
//
// Created by cfif on 13.12.22.
//
#ifndef GONEC_ARTERY_HTTPD_GET_HANDLERS_H
#define GONEC_ARTERY_HTTPD_GET_HANDLERS_H
#include "httpd_get.h"
#include "httpd_types.h"
#include "json_func.h"
#include "fs_base_func.h"
idPostResult_t getDirMemToFile(tHttpSetting *env, uint32_t *tot_len, char *fileNameContent, char *buf, size_t buf_len, char *dir, char *flt);
// Создание и запись в файл
idPostResult_t
handlerGet_Message_Outbox_CreateTempOrRealFile_Sendmsg(tHttpSetting *env, bool isFile, char *filename, char *buf,
uint32_t buf_len, time_t timestamp, char *to,
uint32_t urgency, uint32_t chSv, uint32_t isfile, uint32_t kvs,
uint32_t type, uint32_t sos);
idPostResult_t createFileView(tHttpSetting *env, char *dir, char *fileNameContent);
// Формирование ответа с содержимым директории
idPostResult_t
getDirFile(tHttpSetting *env, uint32_t *tot_len, char *fileNameContent, char *buf, size_t buf_len, char *dir);
// Формирование ответа с содержимым директории
idPostResult_t getDirMem(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *dir, char *flt);
// Количество файлов в каталоге
int getCountDir(tHttpSetting *env, char *dir, char *flt);
// Формирование ответа с содержимым файла
idPostResult_t
getFile(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *file, int32_t pos, size_t len);
// Получение размера файла
idPostResult_t getFileSize(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *file_name);
// Удаление файла
idPostResult_t delFile(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *file_name);
// Удаление всех файлов в директории
idPostResult_t delDirFile(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *file_name);
idPostResult_t
getSampleDirMem(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *dir, uint32_t pos, uint32_t len);
// Формирование ответа с содержимым директории
idPostResult_t
getDirExFile(tHttpSetting *env, uint32_t *tot_len, char *fileNameContent, char *buf, size_t buf_len, char *dir,
uint32_t count, uint32_t pos, uint32_t len);
// Формирование ответа с содержимым директории
idPostResult_t
getDirExMem(tHttpSetting *env, uint32_t *tot_len, char *buf, size_t buf_len, char *dir, uint32_t count, uint32_t pos,
uint32_t len);
#endif //GONEC_ARTERY_HTTPD_GET_HANDLERS_H

154
Inc/httpd_post.h Normal file
View File

@ -0,0 +1,154 @@
//
// Created by cfif on 10.11.22.
//
#ifndef GONEC_ARTERY_HTTPD_POST_H
#define GONEC_ARTERY_HTTPD_POST_H
#include "inttypes.h"
#include "RtcArtery.h"
#include "DeviceStorageIni.h"
#include "httpd_types.h"
#include "SpiPorts.h"
#include "fs_interface.h"
#include <FirmwareLoader.h>
#include "ModemGonec.h"
#include "auth.h"
#include "TaskAdc.h"
#include "Gpios.h"
#include "ModemLog.h"
#include "External.h"
typedef struct {
// uint32_t *tot_len;
// Размер контента из файла
// bool *isContentFile;
// Указатель на буфер ответа
// char *bufAnswer;
// Признак использования большлго буфера
// bool *isBigBuffer;
struct {
int paramcount;
char *params_names[MAX_POST_GET_PARAMETERS];
char *params_vals[MAX_POST_GET_PARAMETERS];
} params_get_uri;
// struct {
// char filename[MAX_LEN_PATH_FS];
// char filenamePathContent[MAX_LEN_PATH_FS];
// } sdcard;
int idTempFileKey;
int idTempFileOutBox;
tRtcIO *rtc;
tDeviceStorageIni *storage;
tSpiPorts *spiPorts;
tFs *fs;
tFirmwareLoader *firmwareMainLoader;
tFirmwareLoader *firmwareBootLoader;
tModemMain *modemMain;
tTaskAdc *taskAdc;
tExternal *external;
typeAuth auth;
tFileLogger *flog;
// tAuthUser authUser;
// Мьютекс
osMutexId_t accessHTTP;
osMutexId_t accessMODEM;
osMutexId_t accessLOG;
osMutexId_t accessLOG2;
tGpios *gpios;
tModemMainLog *modemMainLog;
uint32_t countTmp;
/*
struct {
uint32_t key;
uint16_t id;
} FileSort[2048];
*/
} tHttpSetting;
typedef struct {
struct {
int paramcount;
char *params_names[MAX_POST_GET_PARAMETERS];
char *params_vals[MAX_POST_GET_PARAMETERS];
} params_post_uri;
struct {
char filename[MAX_LEN_PATH_FS];
uint32_t urgency;
uint32_t chSv;
uint32_t kvs;
char to[MAX_LEN_PATH_FS];
uint32_t isfile;
uint32_t routing;
} createPostData;
// Путь к текущему временному файлу
// char temp_filename[MAX_LEN_PATH_FS];
// Путь к файлу в хранилище
// char real_filename[MAX_LEN_PATH_FS];
char *bufAnswer;
tRtcIO *rtc;
tDeviceStorageIni *storage;
tSpiPorts *spiPorts;
tFs *fs;
tFirmwareLoader *firmwareMainLoader;
tFirmwareLoader *firmwareBootLoader;
tModemMain *modemMain;
tExternal *external;
// Признак уже сформированной квитанции
bool isAnswerGeneration;
uint32_t lenAnswerGeneration;
// tAuthUser *authUser;
int indexTableSettings;
int responsePostId;
idPostResult_t result;
uint32_t error;
// Текущая длина принятого пакета
//int packet_len;
// Счетчик длины принятых пакетов
int step_packet_len;
// Размер принимаемого контента
int content_len;
// Смещение для прошивки обновления
//uint32_t offset_update;
// Идентификатор временного файла
uint32_t idTempFileOutBox;
// Мьютекс
osMutexId_t accessHTTP;
osMutexId_t accessMODEM;
tGpios *gpios;
bool isFirst;
} tHttpPostSetting;
extern tHttpSetting httpSettings;
#endif //GONEC_ARTERY_HTTPD_POST_H

58
Inc/httpd_post_handlers.h Normal file
View File

@ -0,0 +1,58 @@
//
// Created by cfif on 12.12.22.
//
#ifndef GONEC_ARTERY_HTTPD_POST_HANDLERS_H
#define GONEC_ARTERY_HTTPD_POST_HANDLERS_H
#include "httpd_post.h"
#include "auth.h"
typedef enum {
FIRMWARE_XFSB_MAIN = 0,
FIRMWARE_XFSB_BOOT = 1
} tFirmwareLoaderXFSB;
// Создание и запись в файл
idPostResult_t handlerPost_Message_Outbox_DynamicWrfile(tHttpPostSetting *env, uint32_t offset, uint32_t len);
// Сохранение настроек
idPostResult_t handlerPost_Var(tHttpPostSetting *env, typeAuth auth);
idPostResult_t handlerPost_Update_Web_File(tHttpPostSetting *env);
// Запись прошивки
// Инициализация прошивки КОНТРОЛЛЕРА
idPostResult_t handlerPost_Update_File_EraseFlash(tHttpPostSetting *env, tFirmwareLoaderXFSB firmwareLoaderXFSB);
// Запись прошивки
idPostResult_t handlerPost_Update_File_WriteFlash(tHttpPostSetting *env, tFirmwareLoaderXFSB firmwareLoaderXFSB);
// Запуск прошивки
idPostResult_t handlerPost_Update_Start_Main(tHttpPostSetting *env);
// Создание и запись в файл
idPostResult_t handlerPost_Message_Outbox_Wrfile(tHttpPostSetting *env);
// Запись прошивки криптоплаты
idPostResult_t handlerPost_Update_Crypto_WriteFlash(tHttpPostSetting *env);
// Запись прошивки модема
idPostResult_t handlerPost_Update_Modem_WriteFlash(tHttpPostSetting *env);
// Инициализация записи прошивки модема
idPostResult_t handlerPost_Update_Init_Modem_WriteFlash(tHttpPostSetting *env);
// Запуск модема после прошивки
idPostResult_t handlerPost_Update_Start_Modem(tHttpPostSetting *env);
// Инициализация записи прошивки крипто-платы
idPostResult_t handlerPost_Update_Init_Crypto_WriteFlash(tHttpPostSetting *env);
// Запуск крипто-платы после прошивки
idPostResult_t handlerPost_Update_Start_Crypto(tHttpPostSetting *env);
// Создание и запись в файл
idPostResult_t handlerPost_Write_Other_File(tHttpPostSetting *env);
// Загрузка ключей
idPostResult_t handlerPost_Key_Load(tHttpPostSetting *env);
#endif //GONEC_ARTERY_HTTPD_POST_HANDLERS_H

154
Inc/httpd_structs.h Normal file
View File

@ -0,0 +1,154 @@
#ifndef LWIP_HTTPD_STRUCTS_H
#define LWIP_HTTPD_STRUCTS_H
#include "lwip/apps/httpd.h"
//#define LWIP_HTTPD_DYNAMIC_HEADERS 1
#ifdef __cplusplus
extern "C" {
#endif
#if LWIP_HTTPD_DYNAMIC_HEADERS
/** This struct is used for a list of HTTP header strings for various
* Copyright notice & Disclaimer
*
* The software Board Support Package (BSP) that is made available to
* download from Artery official website is the copyrighted work of Artery.
* Artery authorizes customers to use, copy, and distribute the BSP
* software and its related documentation for the purpose of design and
* development in conjunction with Artery microcontrollers. Use of the
* software is governed by this copyright notice and the following disclaimer.
*
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
*
**************************************************************************
* filename extensions. */
typedef struct {
const char *extension;
const char *content_type;
} tHTTPHeader;
/** A list of strings used in HTTP headers (see RFC 1945 HTTP/1.0 and
* RFC 2616 HTTP/1.1 for header field definitions) */
static const char *const g_psHTTPHeaderStrings[] = {
"HTTP/1.0 200 OK\r\n",
"HTTP/1.0 404 File not found\r\n",
"HTTP/1.0 400 Bad Request\r\n",
"HTTP/1.0 501 Not Implemented\r\n",
"HTTP/1.1 200 OK\r\n",
"HTTP/1.1 404 File not found\r\n",
"HTTP/1.1 400 Bad Request\r\n",
"HTTP/1.1 501 Not Implemented\r\n",
"Content-Length: ",
"Connection: Close\r\n",
"Connection: keep-alive\r\n",
"Connection: keep-alive\r\nContent-Length: ",
"Expires: Mon, 29 Apr 2060 21:44:55 GMT\r\n",
// "Server: "HTTPD_SERVER_AGENT"\r\n",
"\r\n<html><body><h2>404: The requested file cannot be found.</h2></body></html>\r\n"
#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
, "Connection: keep-alive\r\nContent-Length: 77\r\n\r\n<html><body><h2>404: The requested file cannot be found.</h2></body></html>\r\n"
#endif
};
/* Indexes into the g_psHTTPHeaderStrings array */
#define HTTP_HDR_OK 0 /* 200 OK */
#define HTTP_HDR_NOT_FOUND 1 /* 404 File not found */
#define HTTP_HDR_BAD_REQUEST 2 /* 400 Bad request */
#define HTTP_HDR_NOT_IMPL 3 /* 501 Not Implemented */
#define HTTP_HDR_OK_11 4 /* 200 OK */
#define HTTP_HDR_NOT_FOUND_11 5 /* 404 File not found */
#define HTTP_HDR_BAD_REQUEST_11 6 /* 400 Bad request */
#define HTTP_HDR_NOT_IMPL_11 7 /* 501 Not Implemented */
#define HTTP_HDR_CONTENT_LENGTH 8 /* Content-Length: (HTTP 1.0)*/
#define HTTP_HDR_CONN_CLOSE 9 /* Connection: Close (HTTP 1.1) */
#define HTTP_HDR_CONN_KEEPALIVE 10 /* Connection: keep-alive (HTTP 1.1) */
#define HTTP_HDR_KEEPALIVE_LEN 11 /* Connection: keep-alive + Content-Length: (HTTP 1.1)*/
#define HTTP_HDR_SERVER 12 /* Server: HTTPD_SERVER_AGENT */
#define DEFAULT_404_HTML 13 /* default 404 body */
#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE
#define DEFAULT_404_HTML_PERSISTENT 14 /* default 404 body, but including Connection: keep-alive */
#endif
#define HTTP_CONTENT_TYPE(contenttype) "Content-Type: "contenttype"\r\n\r\n"
#define HTTP_CONTENT_TYPE_ENCODING(contenttype, encoding) "Content-Type: "contenttype"\r\nContent-Encoding: "encoding"\r\n\r\n"
#define HTTP_HDR_HTML HTTP_CONTENT_TYPE("text/html")
#define HTTP_HDR_SSI HTTP_CONTENT_TYPE("text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache")
#define HTTP_HDR_GIF HTTP_CONTENT_TYPE("image/gif")
#define HTTP_HDR_PNG HTTP_CONTENT_TYPE("image/png")
#define HTTP_HDR_JPG HTTP_CONTENT_TYPE("image/jpeg")
#define HTTP_HDR_BMP HTTP_CONTENT_TYPE("image/bmp")
#define HTTP_HDR_ICO HTTP_CONTENT_TYPE("image/x-icon")
#define HTTP_HDR_APP HTTP_CONTENT_TYPE("application/octet-stream")
#define HTTP_HDR_JS HTTP_CONTENT_TYPE("application/javascript")
#define HTTP_HDR_RA HTTP_CONTENT_TYPE("application/javascript")
#define HTTP_HDR_CSS HTTP_CONTENT_TYPE("text/css")
#define HTTP_HDR_SWF HTTP_CONTENT_TYPE("application/x-shockwave-flash")
#define HTTP_HDR_XML HTTP_CONTENT_TYPE("text/xml")
#define HTTP_HDR_PDF HTTP_CONTENT_TYPE("application/pdf")
#define HTTP_HDR_JSON HTTP_CONTENT_TYPE("application/json")
#define HTTP_HDR_CSV HTTP_CONTENT_TYPE("text/csv")
#define HTTP_HDR_TSV HTTP_CONTENT_TYPE("text/tsv")
#define HTTP_HDR_SVG HTTP_CONTENT_TYPE("image/svg+xml")
#define HTTP_HDR_SVGZ HTTP_CONTENT_TYPE_ENCODING("image/svg+xml", "gzip")
#define HTTP_HDR_LOG HTTP_CONTENT_TYPE("text/plain; charset=utf-8")
#define HTTP_HDR_DEFAULT_TYPE HTTP_CONTENT_TYPE("text/plain")
/** A list of extension-to-HTTP header strings (see outdated RFC 1700 MEDIA TYPES
* and http://www.iana.org/assignments/media-types for registered content types
* and subtypes) */
static const tHTTPHeader g_psHTTPHeaders[] = {
{ "html", HTTP_HDR_HTML},
{ "htm", HTTP_HDR_HTML},
{ "shtml", HTTP_HDR_SSI},
{ "shtm", HTTP_HDR_SSI},
{ "ssi", HTTP_HDR_SSI},
{ "gif", HTTP_HDR_GIF},
{ "png", HTTP_HDR_PNG},
{ "jpg", HTTP_HDR_JPG},
{ "bmp", HTTP_HDR_BMP},
{ "ico", HTTP_HDR_ICO},
{ "class", HTTP_HDR_APP},
{ "cls", HTTP_HDR_APP},
{ "js", HTTP_HDR_JS},
{ "ram", HTTP_HDR_RA},
{ "css", HTTP_HDR_CSS},
{ "swf", HTTP_HDR_SWF},
{ "xml", HTTP_HDR_XML},
{ "xsl", HTTP_HDR_XML},
{ "pdf", HTTP_HDR_PDF},
{ "svg", HTTP_HDR_SVG},
{ "log", HTTP_HDR_LOG},
{ "json", HTTP_HDR_JSON}
#ifdef HTTPD_ADDITIONAL_CONTENT_TYPES
/* If you need to add content types not listed here:
* #define HTTPD_ADDITIONAL_CONTENT_TYPES {"ct1", HTTP_CONTENT_TYPE("text/ct1")}, {"exe", HTTP_CONTENT_TYPE("application/exe")}
*/
, HTTPD_ADDITIONAL_CONTENT_TYPES
#endif
};
#define NUM_HTTP_HEADERS LWIP_ARRAYSIZE(g_psHTTPHeaders)
#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */
#if LWIP_HTTPD_SSI
static const char *const g_pcSSIExtensions[] = {
".shtml", ".shtm", ".ssi", ".xml", ".json"
};
#define NUM_SHTML_EXTENSIONS LWIP_ARRAYSIZE(g_pcSSIExtensions)
#endif /* LWIP_HTTPD_SSI */
#ifdef __cplusplus
}
#endif
#endif /* LWIP_HTTPD_STRUCTS_H */

68
Inc/httpd_types.h Normal file
View File

@ -0,0 +1,68 @@
//
// Created by cfif on 13.12.22.
//
#ifndef GONEC_ARTERY_HTTPD_TYPES_H
#define GONEC_ARTERY_HTTPD_TYPES_H
#define TRANS_MIN(x, y) (((x) < (y)) ? (x) : (y))
// Время удержания мьютекса
#define TIME_MUTEX_HTTP_ACCESS 8000
#define TIME_MUTEX_MODEM_ACCESS 8000
#define TIME_MUTEX_LOG_ACCESS 8000
// Размер маленького буфера для ответов HTTP
#define LEN_BUF_SMALL_ANSWER_HTTP (28 * 1024)
// Размер маленького буфера для приема HTTP
#define LEN_BUF_SMALL_ANSWER_POST_HTTP (14 * 1024)
// Размер буфера для хранения путей к файлу в файловой системе
#define MAX_LEN_PATH_FS 96
// Максимальное количество параметров в GET и POST запросах
#define MAX_POST_GET_PARAMETERS 16
// Счетчики для хранения временных файлов в TEMP
#define MAX_COUNTER_TEMP_FILE 30
typedef enum {
ContentBufferSmall = 0,
ContentBufferFile = 1,
ContentBufferSmallAndFile = 2,
ContentBufferBigAndFile = 3
} tHttpContentBuffer;
typedef enum {
Post_OK = 0,
Post_PARAM_ERR = 1,
Post_404_ERR = 2,
Post_FS_ERR = 3,
Post_SIZE_ERR = 4,
Post_DATATIME_ERR = 5,
Post_FLASH_ERR = 6,
Post_LOAD_KEY_ERR = 7,
Post_SET_MODEM = 8,
Post_CRC = 9,
Post_SET_VAR = 10,
Post_MUTEX_ERR = 11,
Post_GNSS_ERR = 12,
Post_NO_MODEM_BOOT = 13,
Post_NO_MODEM_MAIN = 14,
Post_NO_CRYPTO_BOOT = 15,
Post_NO_CRYPTO_MAIN = 16,
Post_NO_AUTH = 17,
Post_NO_ALMA = 18,
Post_OLD_ALMA = 19
} idPostResult_t;
/*
typedef enum {
Get_OK = 0,
Get_PARAM_ERR = 1,
Get_404_ERR = 2,
Get_FS_ERR = 3,
Get_SIZE_ERR = 4,
Get_MUTEX_ERR = 11
} idGetResult_t;
*/
//extern char bigBuffer[LEN_BUF_BIG_ANSWER_HTTP];
#endif //GONEC_ARTERY_HTTPD_TYPES_H

41
Inc/lwippools.h Normal file
View File

@ -0,0 +1,41 @@
//
// Created by cfif on 04.07.23.
//
/* OPTIONAL: Pools to replace heap allocation
* Optional: Pools can be used instead of the heap for mem_malloc. If
* so, these should be defined here, in increasing order according to
* the pool element size.
*
* LWIP_MALLOC_MEMPOOL(number_elements, element_size)
*/
#if MEM_USE_POOLS
LWIP_MALLOC_MEMPOOL_START
//LWIP_MALLOC_MEMPOOL(10, 256)
//LWIP_MALLOC_MEMPOOL(50, 512)
//LWIP_MALLOC_MEMPOOL(20, 1024)
//LWIP_MALLOC_MEMPOOL(20, 1536)
//LWIP_MALLOC_MEMPOOL(30, 8)
//LWIP_MALLOC_MEMPOOL(30, 16)
//LWIP_MALLOC_MEMPOOL(30, 32)
//LWIP_MALLOC_MEMPOOL(30, 64)
LWIP_MALLOC_MEMPOOL(20, 128)
//LWIP_MALLOC_MEMPOOL(30, 256)
//LWIP_MALLOC_MEMPOOL(10, 512)
//LWIP_MALLOC_MEMPOOL(10, 1024)
LWIP_MALLOC_MEMPOOL(16, 1536)
LWIP_MALLOC_MEMPOOL_END
#endif /* MEM_USE_POOLS */
/* Optional: Your custom pools can go here if you would like to use
* lwIP's memory pools for anything else.
*/
//LWIP_MEMPOOL(TCP_PCB, 12, sizeof(struct tcp_pcb), "TCP_PCB")
//LWIP_MEMPOOL(SYS_MBOX, 22, sizeof(struct sys_mbox_struct), "SYS_MBOX")
//LWIP_MEMPOOL(SYS_SEM, 12, sizeof(struct sys_sem_struct), "SYS_SEM")

38
Src/auth.c Normal file
View File

@ -0,0 +1,38 @@
//
// Created by cfif on 13.02.23.
//
#include "StorageOnFlash.h"
#include "string.h"
#include "auth.h"
typeAuth Auth(tDeviceStorageIni *storage, char *authStr) {
char authUser[255];
char authInteg[255];
char authAdmin[255];
authUser[0] = '\0';
strcat(authUser, storage->nvm.Settings_General.loginUSER_v);
strcat(authUser, ":");
strcat(authUser, storage->nvm.Settings_General.UserPass_v);
authInteg[0] = '\0';
strcat(authInteg, storage->nvm.Settings_General.loginINTEG_v);
strcat(authInteg, ":");
strcat(authInteg, storage->nvm.Settings_General.passINTEG_v);
authAdmin[0] = '\0';
strcat(authAdmin, storage->nvm.Settings_General.loginADMIN_v);
strcat(authAdmin, ":");
strcat(authAdmin, storage->nvm.Settings_General.passADMIN_v);
if (strcmp(authUser, authStr) == 0)
return AUTH_USER;
if (strcmp(authInteg, authStr) == 0)
return AUTH_INTEG;
if (strcmp(authAdmin, authStr) == 0)
return AUTH_ADMIN;
return AUTH_NONE;
}

174
Src/fs.c Normal file
View File

@ -0,0 +1,174 @@
/*
* Copyright (c) 2001-2003 Swedish Institute of Computer Science.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* This file is part of the lwIP TCP/IP stack.
*
* Author: Adam Dunkels <adam@sics.se>
*
*/
#include "lwip/apps/httpd_opts.h"
#include "lwip/def.h"
#include "lwip/apps/fs.h"
#include <string.h>
#include HTTPD_FSDATA_FILE
/*-----------------------------------------------------------------------------------*/
#if LWIP_HTTPD_CUSTOM_FILES
int fs_open_custom(struct fs_file *file, const char *name);
void fs_close_custom(struct fs_file *file);
#if LWIP_HTTPD_FS_ASYNC_READ
u8_t fs_canread_custom(struct fs_file *file);
u8_t fs_wait_read_custom(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg);
int fs_read_async_custom(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg);
#else /* LWIP_HTTPD_FS_ASYNC_READ */
int fs_read_custom(struct fs_file *file, char *buffer, int count);
#endif /* LWIP_HTTPD_FS_ASYNC_READ */
#endif /* LWIP_HTTPD_CUSTOM_FILES */
/*-----------------------------------------------------------------------------------*/
err_t
fs_open(struct fs_file *file, const char *name)
{
const struct fsdata_file *f;
if ((file == NULL) || (name == NULL)) {
return ERR_ARG;
}
#if LWIP_HTTPD_CUSTOM_FILES
if (fs_open_custom(file, name)) {
file->is_custom_file = 1;
return ERR_OK;
}
file->is_custom_file = 0;
#endif /* LWIP_HTTPD_CUSTOM_FILES */
for (f = FS_ROOT; f != NULL; f = f->next) {
if (!strcmp(name, (const char *)f->name)) {
file->data = (const char *)f->data;
file->len = f->len;
file->index = f->len;
// file->pextension = NULL;
file->flags = f->flags;
#if HTTPD_PRECALCULATED_CHECKSUM
file->chksum_count = f->chksum_count;
file->chksum = f->chksum;
#endif /* HTTPD_PRECALCULATED_CHECKSUM */
#if LWIP_HTTPD_FILE_STATE
file->state = fs_state_init(file, name);
#endif /* #if LWIP_HTTPD_FILE_STATE */
return ERR_OK;
}
}
/* file not found */
return ERR_VAL;
}
/*-----------------------------------------------------------------------------------*/
void
fs_close(struct fs_file *file)
{
#if LWIP_HTTPD_CUSTOM_FILES
if (file->is_custom_file) {
fs_close_custom(file);
}
#endif /* LWIP_HTTPD_CUSTOM_FILES */
#if LWIP_HTTPD_FILE_STATE
fs_state_free(file, file->state);
#endif /* #if LWIP_HTTPD_FILE_STATE */
LWIP_UNUSED_ARG(file);
}
/*-----------------------------------------------------------------------------------*/
#if LWIP_HTTPD_DYNAMIC_FILE_READ
#if LWIP_HTTPD_FS_ASYNC_READ
int
fs_read_async(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg)
#else /* LWIP_HTTPD_FS_ASYNC_READ */
int
fs_read(struct fs_file *file, char *buffer, int count)
#endif /* LWIP_HTTPD_FS_ASYNC_READ */
{
int read;
if (file->index == file->len) {
return FS_READ_EOF;
}
#if LWIP_HTTPD_FS_ASYNC_READ
LWIP_UNUSED_ARG(callback_fn);
LWIP_UNUSED_ARG(callback_arg);
#endif /* LWIP_HTTPD_FS_ASYNC_READ */
#if LWIP_HTTPD_CUSTOM_FILES
if (file->is_custom_file) {
#if LWIP_HTTPD_FS_ASYNC_READ
return fs_read_async_custom(file, buffer, count, callback_fn, callback_arg);
#else /* LWIP_HTTPD_FS_ASYNC_READ */
return fs_read_custom(file, buffer, count);
#endif /* LWIP_HTTPD_FS_ASYNC_READ */
}
#endif /* LWIP_HTTPD_CUSTOM_FILES */
read = file->len - file->index;
if (read > count) {
read = count;
}
MEMCPY(buffer, (file->data + file->index), read);
file->index += read;
return (read);
}
#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */
/*-----------------------------------------------------------------------------------*/
#if LWIP_HTTPD_FS_ASYNC_READ
int
fs_is_file_ready(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg)
{
if (file != NULL) {
#if LWIP_HTTPD_FS_ASYNC_READ
#if LWIP_HTTPD_CUSTOM_FILES
if (!fs_canread_custom(file)) {
if (fs_wait_read_custom(file, callback_fn, callback_arg)) {
return 0;
}
}
#else /* LWIP_HTTPD_CUSTOM_FILES */
LWIP_UNUSED_ARG(callback_fn);
LWIP_UNUSED_ARG(callback_arg);
#endif /* LWIP_HTTPD_CUSTOM_FILES */
#endif /* LWIP_HTTPD_FS_ASYNC_READ */
}
return 1;
}
#endif /* LWIP_HTTPD_FS_ASYNC_READ */
/*-----------------------------------------------------------------------------------*/
int
fs_bytes_left(struct fs_file *file)
{
return file->len - file->index;
}

779
Src/fs_base_func.c Normal file
View File

@ -0,0 +1,779 @@
//
// Created by cfif on 30.01.23.
//
#include "fs_base_func.h"
#include "stdlib.h"
#include "httpd_types.h"
#include "GonetsCrcs.h"
unsigned char crc8(unsigned char *pcBlock, unsigned char len) {
unsigned char crc = 0xFF;
unsigned char i;
while (len--) {
crc ^= *pcBlock++;
for (i = 0; i < 8; i++)
crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
}
return crc;
}
//CRC
#define POLYNOMIAL 0x131 //P(x)=x^8+x^5+x^4+1 = 100110001
//============================================================
uint8_t SF04_CheckCrc(const uint8_t data[], uint8_t nbrOfBytes)
//============================================================
//calculates checksum for n bytes of data
//and compares it with expected checksum
//input: data[] checksum is built based on this data
// nbrOfBytes checksum is built for n bytes of data
// checksum expected checksum
//return: error: CHECKSUM_ERROR = checksum does not match
// 0 = checksum matches
//============================================================
{
uint8_t crc = 0;
uint8_t byteCtr;
//calculates 8-Bit checksum with given polynomial
for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr) {
crc ^= (data[byteCtr]);
for (uint8_t bit = 8; bit > 0; --bit) {
if (crc & 0x80) {
crc = (crc << 1) ^ POLYNOMIAL;
} else { crc = (crc << 1); }
}
}
return crc;
}
FRESULT scan_files(char *path, uint32_t *globDirCount, uint32_t *globFileCount) {
FRESULT res;
DIR dir;
UINT i;
static FILINFO fno;
res = f_opendir(&dir, path); // Open the directory
if (res == FR_OK) {
for (;;) {
res = f_readdir(&dir, &fno); // Read a directory item
if (res != FR_OK || fno.fname[0] == 0) break; // Break on error or end of dir
if (fno.fattrib & AM_DIR) { // It is a directory
i = strlen(path);
strcat(path, "/");
strcat(path, fno.fname);
++*globDirCount;
res = scan_files(path, globDirCount, globFileCount); // Enter the directory
if (res != FR_OK) break;
path[i] = 0;
} else { // It is a file.
++*globFileCount;
}
}
f_closedir(&dir);
}
return res;
}
void reportScan(char *str, uint32_t AT) {
char buf[12];
char buff[256];
buff[0] = '\0';
strcat(buff, "1:/");
uint32_t globDirCount = 0;
uint32_t globFileCount = 0;
scan_files(buff, &globDirCount, &globFileCount);
str[0] = '\0';
strcat(str, "АТ-");
utoa(AT, buf, 10);
strcat(str, buf);
strcat(str, "\n");
strcat(str, "Проверка диска \n");
strcat(str, "Директорий ");
utoa(globDirCount, buf, 10);
strcat(str, buf);
strcat(str, "\n");
strcat(str, "Файлов ");
utoa(globFileCount, buf, 10);
strcat(str, buf);
strcat(str, "\n");
strcat(str, "Ошибок 0 \n");
}
void toAddPrefixStr(char *out, char *in, size_t len) {
if (len <= strlen(in)) {
out[0] = '\0';
strcat(out, in);
return;
}
size_t countPrefix = len - strlen(in);
for (size_t i = 0; i < countPrefix; ++i)
out[i] = '0';
out[countPrefix] = '\0';
strcat(out, in);
}
void getDelFileDir(tFs *fs, char *path) {
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS + MAX_LEN_PATH_FS];
fr = f_findfirst_i(fs, &dj, &fno, path, "*");
while (fr == FR_OK && fno.fname[0]) {
pathTmp[0] = '\0';
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
fr = f_unlink_i(fs, pathTmp);
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
void getDelFilesDir(tFs *fs, char *path) {
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS + MAX_LEN_PATH_FS];
fr = f_findfirst_i(fs, &dj, &fno, path, "*");
while (fr == FR_OK && fno.fname[0]) {
if (fno.fattrib & AM_DIR) {
pathTmp[0] = '\0';
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
strcat(pathTmp, "/");
getDelFileDir(fs, pathTmp);
}
pathTmp[0] = '\0';
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
fr = f_unlink_i(fs, pathTmp);
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
bool getDelFileDirClean(tFs *fs, char *path) {
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS + 32];
bool isClean = true;
fr = f_findfirst_i(fs, &dj, &fno, path, "*");
if (fr == FR_OK && fno.fname[0]) {
isClean = false;
}
fr = f_closedir_i(fs, &dj);
return isClean;
}
void getDelFilesDirClean(tFs *fs, char *path) {
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS + 32];
fr = f_findfirst_i(fs, &dj, &fno, path, "*");
while (fr == FR_OK && fno.fname[0]) {
if (fno.fattrib & AM_DIR) {
pathTmp[0] = '\0';
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
strcat(pathTmp, "/");
if (getDelFileDirClean(fs, pathTmp)) {
fr = f_unlink_i(fs, pathTmp);
}
}
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
void getDelFileDirDatTracert(tFs *fs, char *path) {
FILINFO fnoInf;
FRESULT frInf;
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS];
bool isClean = true;
fr = f_findfirst_i(fs, &dj, &fno, path, "*.DAT");
while (fr == FR_OK && fno.fname[0]) {
pathTmp[0] = 0;
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
pathTmp[strlen(pathTmp) - 3] = 'O';
pathTmp[strlen(pathTmp) - 2] = 'T';
pathTmp[strlen(pathTmp) - 1] = 'M';
frInf = f_stat(pathTmp, &fnoInf);
if (frInf == FR_NO_FILE) {
pathTmp[0] = 0;
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
fr = f_unlink_i(fs, pathTmp);
}
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
void getDelFileDirDatInbox(tFs *fs, char *path, char *ext) {
FILINFO fnoInf;
FRESULT frInf;
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS];
bool isClean = true;
fr = f_findfirst_i(fs, &dj, &fno, path, "*.DAT");
while (fr == FR_OK && fno.fname[0]) {
pathTmp[0] = 0;
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
pathTmp[strlen(pathTmp) - 3] = ext[0];//'I';
pathTmp[strlen(pathTmp) - 2] = ext[1];//'T';
pathTmp[strlen(pathTmp) - 1] = ext[2];//'M';
frInf = f_stat(pathTmp, &fnoInf);
if (frInf == FR_NO_FILE) {
pathTmp[0] = 0;
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
fr = f_unlink_i(fs, pathTmp);
}
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
void getDelFilesDirDat(tFs *fs, char *path, char *ext) {
FRESULT fr;
DIR dj;
FILINFO fno;
char pathTmp[MAX_LEN_PATH_FS];
fr = f_findfirst_i(fs, &dj, &fno, path, "*");
while (fr == FR_OK && fno.fname[0]) {
if (fno.fattrib & AM_DIR) {
pathTmp[0] = '\0';
strcat(pathTmp, path);
strcat(pathTmp, fno.fname);
strcat(pathTmp, "/");
getDelFileDirDatInbox(fs, pathTmp, ext);
}
fr = f_findnext_i(fs, &dj, &fno);
}
fr = f_closedir_i(fs, &dj);
}
void getPath(char *pathIn, char *pathOut, int count_dir) {
char tmp[2];
int step_dir = 0;
pathOut[0] = 0;
for (uint32_t i = 0; i < strlen(pathIn); ++i) {
if (pathIn[i] == '/')
++step_dir;
tmp[0] = toupper(pathIn[i]);
tmp[1] = 0;
strcat(pathOut, tmp);
if (step_dir == count_dir)
break;
}
}
// Получение указателя на расширение файла
char *getVoidExt(char *buf) {
char *p = buf;
for (size_t i = 0; i < strlen(buf); ++i) {
if (*p == '.')
return p;
++p;
}
return p;
}
// Получение имени файла лога
size_t getFileNameLog(tRtcIO *rtc, char *buf, size_t len) {
struct tm dateTime;
rtc->getTM(rtc, &dateTime);
return strftime(buf, len, "%d-%m-%y.LOG", &dateTime);
}
// Получение строки дата
size_t getDateStr(tRtcIO *rtc, char *buf, size_t len) {
struct tm dateTime;
rtc->getTM(rtc, &dateTime);
return strftime(buf, len, "%Y%m%d", &dateTime);
}
// Получение строки дата время в UTC
size_t getDataTimeUTC(time_t *timestamp, char *buf, size_t len) {
struct tm dateTime;
localtime_r(timestamp, &dateTime);
// return strftime(buf, len, "%FT%T+03:00", dateTime);
return strftime(buf, len, "%FT%T", &dateTime);
}
// Получение строки дата время в UTC
size_t getDataTimeUTC_Ex(struct tm *dateTime, char *buf, size_t len) {
// return strftime(buf, len, "%FT%T+03:00", dateTime);
return strftime(buf, len, "%FT%T", dateTime);
}
// Получение строки дата/время
size_t getDataTime(time_t *timestamp, char *buf, size_t len) {
struct tm dateTime;
localtime_r(timestamp, &dateTime);
return strftime(buf, len, "%d-%m-%g %T", &dateTime);
}
// Удаление всех файлов в директории
bool delDirFileFs(tFs *fs, char *dir) {
FRESULT fr;
DIR dj;
FILINFO fno;
char dirScan[MAX_LEN_PATH_FS];
dirScan[0] = '\0';
strcat(dirScan, dir);
char dirFileScan[MAX_LEN_PATH_FS];
fr = f_findfirst_i(fs, &dj, &fno, dirScan, "*");
if (fr)
return false;
while (fr == FR_OK && fno.fname[0]) {
dirFileScan[0] = '\0';
strcat(dirFileScan, dirScan);
strcat(dirFileScan, fno.fname);
fr = f_unlink_i(fs, dirFileScan);
fr = f_findnext_i(fs, &dj, &fno);
if (fr) {
fr = f_closedir_i(fs, &dj);
return Post_FS_ERR;
}
}
fr = f_closedir_i(fs, &dj);
return true;
}
FRESULT deleteAllDir(tFs *fs, char *path) {
FRESULT res;
FILINFO fno;
DIR dir;
int i;
char *fn;
res = f_opendir_i(fs, &dir, path); // Открытие директории
if (res == FR_OK) {
i = strlen(path);
for (;;) {
res = f_readdir(&dir, &fno); // Чтение объекта директории
if (res != FR_OK || fno.fname[0] == 0)
break; // Останов цикла при ошибке или при достижении конца списка директории
fn = fno.fname;
if (fno.fattrib & AM_DIR) { // Это директория
//strcat(path, "/");
//strcat(path, fn);
strcat(&path[i], "/");
strcat(&path[i + 1], fn);
res = deleteAllDir(fs, path);
f_unlink_i(fs, path);
if (res != FR_OK) break;
path[i] = 0;
} else { // Это файл
char pathFile[MAX_LEN_PATH_FS];
pathFile[0] = '\0';
strcat(pathFile, path);
strcat(pathFile, "/");
strcat(pathFile, fn);
f_unlink_i(fs, pathFile);
}
}
f_closedir_i(fs, &dir);
}
return res;
}
bool CopyFileFs_crc_md5(tFs *fs, uint32_t typeCrc, md5a_context *md5ctx, char *filenameTo, char *filenameFrom,
uint32_t offset, uint32_t initCrc32) {
FIL fsrc, fdst; // File objects
BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br, bw; // File read/write count
uint32_t crc32 = 0;
uint32_t crc32_update = 0;
uint32_t init = initCrc32;
fr = f_open_i(fs, &fsrc, filenameFrom, FA_READ);
if (fr) return false;
fr = f_lseek_i(fs, &fsrc, offset);
if (fr) return false;
fr = f_open_i(fs, &fdst, filenameTo, FA_OPEN_APPEND | FA_WRITE);
if (fr) return false;
for (;;) {
f_read_i(fs, &fsrc, buffer, sizeof(buffer), &br);
if (br == 0) break;
// crc32
if (typeCrc == 1) {
crc32_update = GonetsCrc32_update(buffer, br, init);
init = crc32_update;
}
// md5
if (typeCrc == 2) {
md5a_update(md5ctx, buffer, (int) br);
}
f_write_i(fs, &fdst, buffer, br, &bw);
if (bw < br) break;
}
// crc32
if (typeCrc == 1) {
crc32 = GonetsCrc32_finish(crc32_update);
fr = f_write_i(fs, &fdst, &crc32, 4, &bw);
}
// md5
if (typeCrc == 2) {
uint8_t md5sum[16];
md5a_finish(md5ctx, md5sum);
f_write_i(fs, &fdst, md5sum, sizeof(md5sum), &bw);
}
f_close_i(fs, &fsrc);
f_close_i(fs, &fdst);
return true;
}
//BYTE buffer_crc[512 * 20];
uint32_t CrcFileFs(tFs *fs, char *filename) {
FIL fsrc; // File objects
// BYTE buffer_crc[512 * 2];
// BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br; // File read/write count
BYTE buffer_crc[512];
uint32_t init = 0xFFFFFFFF;
fr = f_open_i(fs, &fsrc, filename, FA_READ);
for (;;) {
f_read_i(fs, &fsrc, buffer_crc, sizeof(buffer_crc), &br);
if (br == 0) break;
init = GonetsCrc32_noreverse_update(buffer_crc, br, init);
}
f_close_i(fs, &fsrc);
init = GonetsCrc32_noreverse_finish(init);
return init;
}
bool CopyFileFs(tFs *fs, char *filenameTo, char *filenameFrom, uint32_t offset) {
FIL fsrc, fdst; // File objects
BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br, bw; // File read/write count
fr = f_open_i(fs, &fsrc, filenameFrom, FA_READ);
if (fr) return false;
fr = f_lseek_i(fs, &fsrc, offset);
if (fr) return false;
fr = f_open_i(fs, &fdst, filenameTo, FA_OPEN_APPEND | FA_WRITE);
if (fr) return false;
for (;;) {
f_read_i(fs, &fsrc, buffer, sizeof(buffer), &br);
if (br == 0) break;
f_write_i(fs, &fdst, buffer, br, &bw);
if (bw < br) break;
}
f_close_i(fs, &fsrc);
f_close_i(fs, &fdst);
return true;
}
bool
CopyFileTrucSizeFs(tFs *fs, uint32_t typeCrc, md5a_context *md5ctx,
uint32_t *crc32sum, uint8_t *md5sum,
uint32_t *crc32sumFile, uint8_t *md5sumFile,
char *filenameTo, char *filenameFrom,
uint32_t offset, uint32_t truncBytes, uint32_t size) {
FIL fsrc, fdst; // File objects
BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br, bw; // File read/write count
uint32_t crc32_update;
uint32_t init = 0xFFFFFFFF;
uint32_t count = (size - offset - truncBytes) / sizeof(buffer);
uint32_t tail = (size - offset - truncBytes) % sizeof(buffer);
fr = f_open_i(fs, &fsrc, filenameFrom, FA_READ);
if (fr) return false;
fr = f_lseek_i(fs, &fsrc, offset);
if (fr) return false;
fr = f_open_i(fs, &fdst, filenameTo, FA_OPEN_APPEND | FA_WRITE);
if (fr) return false;
for (uint32_t i = 0; i < count; ++i) {
f_read_i(fs, &fsrc, buffer, sizeof(buffer), &br);
// crc32
if (typeCrc == 1) {
crc32_update = GonetsCrc32_update(buffer, br, init);
init = crc32_update;
}
// md5
if (typeCrc == 2) {
md5a_update(md5ctx, buffer, (int) br);
}
if (br == 0) break;
f_write_i(fs, &fdst, buffer, br, &bw);
if (bw < br) break;
}
f_read_i(fs, &fsrc, buffer, tail, &br);
// crc32
if (typeCrc == 1) {
crc32_update = GonetsCrc32_update(buffer, br, init);
init = crc32_update;
}
// md5
if (typeCrc == 2) {
md5a_update(md5ctx, buffer, (int) br);
}
f_write_i(fs, &fdst, buffer, br, &bw);
// crc32
if (typeCrc == 1) {
f_read_i(fs, &fsrc, crc32sumFile, 4, &br);
*crc32sum = GonetsCrc32_finish(crc32_update);
}
// md5
if (typeCrc == 2) {
f_read_i(fs, &fsrc, md5sumFile, 16, &br);
md5a_finish(md5ctx, md5sum);
}
f_close_i(fs, &fsrc);
f_close_i(fs, &fdst);
return true;
}
// Получене crc
uint32_t GetCrcFileisOpenFs(tFs *fs, FIL *fsrc, uint32_t offset) {
BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br; // File read/write count
uint32_t crc = 0;
fr = f_lseek_i(fs, fsrc, offset);
if (fr) return false;
for (;;) {
f_read_i(fs, fsrc, buffer, sizeof(buffer), &br);
for (size_t i = 0; i < br; ++i) {
crc += buffer[i];
}
if (br == 0) break;
}
return crc;
}
// Получене crc
uint32_t GetCrcFileFs(tFs *fs, char *filename, uint32_t offset) {
FIL fsrc; // File objects
BYTE buffer[512]; // File copy buffer
FRESULT fr; // FatFs function common result code
UINT br; // File read/write count
uint32_t crc = 0;
fr = f_open_i(fs, &fsrc, filename, FA_READ);
if (fr) return 0;
fr = f_lseek_i(fs, &fsrc, offset);
if (fr) return false;
for (;;) {
fr = f_read_i(fs, &fsrc, buffer, sizeof(buffer), &br);
for (size_t i = 0; i < br; ++i) {
crc += buffer[i];
}
if (fr) {
return 0;
}
if (br == 0)
break;
}
f_close_i(fs, &fsrc);
return crc;
}
/*
BYTE bufferSizeMaxCopy[1300]; // File copy buffer
bool CopyFileFsSize(tFs *fs, char *filenameTo, char *filenameFrom, uint32_t offset, uint32_t max) {
FIL fsrc, fdst; // File objects
FRESULT fr; // FatFs function common result code
UINT br, bw; // File read/write count
fr = f_open_i(fs, &fsrc, filenameFrom, FA_READ);
if (fr) return false;
fr = f_lseek_i(fs, &fsrc, offset);
if (fr) return false;
fr = f_open_i(fs, &fdst, filenameTo, FA_OPEN_APPEND | FA_WRITE);
if (fr) return false;
// for (;;) {
f_read_i(fs, &fsrc, bufferSizeMaxCopy, max, &br);
// if (br == 0) break;
f_write_i(fs, &fdst, bufferSizeMaxCopy, br, &bw);
// if (bw < br) break;
// }
f_close_i(fs, &fsrc);
f_close_i(fs, &fdst);
return true;
}
*/

3946
Src/httpd.c Normal file

File diff suppressed because it is too large Load Diff

55
Src/httpd_TablesPostGet.c Normal file
View File

@ -0,0 +1,55 @@
//
// Created by cfif on 13.12.22.
//
#include "httpd_TablesPostGet.h"
const struct tablePostGetSetting tablePostGetSettings[] = {
{.path = "/Settings_General", .json = &jsonSettings_General},
{.path = "/Settings_Basic_Access", .json = &jsonSettings_Basic_Access},
{.path = "/Settings_Frequency_Speed", .json = &jsonSettings_Frequency_Speed},
{.path = "/Settings_Tracert", .json = &jsonSettings_Tracert},
{.path = "/Settings_Transceiver", .json = &jsonSettings_Transceiver},
{.path = "/Settings_Network", .json = &jsonSettings_Network},
{.path = "/Settings_Date_Time", .json = &jsonSettings_Date_Time},
{.path = "/Settings_RS485_Bluetooth", .json = &jsonSettings_RS485_Bluetooth},
{NULL}
};
const struct tablePost tablePosts[] = {
{.path = "/var.xip", .id = ID_Post_Var},
{.path = "/cmd.xip", .id = ID_Post_Message_Create_Cmd},
{.path = "/keylo.xip", .id = ID_Post_Key_Load},
{.path = "/Software_Update_Web_File", .id = ID_Post_Update_Web_File},
{.path = "/Software_Init_File", .id = ID_Post_Update_Main_Init_File},
{.path = "/Software_Write_File", .id = ID_Post_Update_Main_Write_File},
{.path = "/Software_Write_Crypto", .id = ID_Post_Update_Write_Crypto},
{.path = "/Software_Write_Modem", .id = ID_Post_Update_Write_Modem},
{.path = "/Software_Init_Write_Modem", .id = ID_Post_Update_Init_Write_Modem},
{.path = "/Software_Start_Modem", .id = ID_Post_Update_Start_Modem},
{.path = "/Software_Init_Write_Crypto", .id = ID_Post_Update_Init_Write_Crypto},
{.path = "/Software_Start_Crypto", .id = ID_Post_Update_Start_Crypto},
{.path = "/Software_Start_Main", .id = ID_Post_Update_Start_Main},
{.path = "/Write_Other_File", .id = ID_Post_Write_Other_File},
{.path = "/sendmsg2.xip", .id = ID_Post_sendmsg2},
{.path = "/Software_Boot_Init_File", .id = ID_Post_Update_Boot_Init_File},
{.path = "/Software_Boot_Write_File", .id = ID_Post_Update_Boot_Write_File},
{NULL}
};
const struct tableGet tableGets[] = {
/*
{.path = "/Key_File", .id = ID_Get_Key_File, .method = &handlerKey_File},
{.path = "/Messages_Inbox", .id = ID_Get_Messages_Inbox, .method = &handlerMessages_Inbox},
{.path = "/Messages_Outbox", .id = ID_Get_Messages_Outbox, .method = &handlerMessages_Outbox},
{.path = "/Messages_Sentbox", .id = ID_Get_Messages_Sentbox, .method = &handlerMessages_Sentbox},
{.path = "/Messages_Content_Inbox", .id = ID_Get_Messages_Content_Inbox, .method = &handlerMessages_Content_Inbox},
{.path = "/Messages_Content_Outbox", .id = ID_Get_Messages_Content_Outbox, .method = &handlerMessages_Content_Outbox},
{.path = "/Messages_Content_Sentbox", .id = ID_Get_Messages_Content_Sentbox, .method = &handlerMessages_Content_Sentbox},
{.path = "/Messages_Meta_Content_Inbox", .id = ID_Get_Messages_Meta_Content_Inbox, .method = &handlerMessages_Meta_Content_Inbox},
{.path = "/Messages_Meta_Content_Outbox", .id = ID_Get_Messages_Meta_Content_Outbox, .method = &handlerMessages_Meta_Content_Outbox},
{.path = "/Messages_Meta_Content_Sentbox", .id = ID_Get_Messages_Meta_Content_Sentbox, .method = &handlerMessages_Meta_Content_Sentbox},
{.path = "/Get_Version", .id = ID_Get_Get_Version, .method = &handlerGet_Version},
*/
{NULL}
};

403
Src/httpd_base_func.c Normal file
View File

@ -0,0 +1,403 @@
//
// Created by cfif on 12.12.22.
//
#include "string.h"
#include "inttypes.h"
//#include "stream.h"
#include "httpd_base_func.h"
#include "stdio.h"
#include "AsciiStringParsingUtils.h"
int extract_mac_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max) {
char *pair;
char *equals;
int loop;
/* If we have no parameters at all, return immediately. */
if (!params || (params[0] == '\0')) {
return (0);
}
/* Get a pointer to our first parameter */
pair = params;
/* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the
* remainder (if any) */
for (loop = 0; (loop < params_max) && pair; loop++) {
/* Save the name of the parameter */
param_names[loop] = pair;
/* Remember the start of this name=value pair */
equals = pair;
/* Find the start of the next name=value pair and replace the delimiter
* with a 0 to terminate the previous pair string. */
pair = strchr(pair, ':');
if (pair) {
*pair = '\0';
pair++;
} else {
/* We didn't find a new parameter so find the end of the URI and
* replace the space with a '\0' */
pair = strchr(equals, ' ');
if (pair) {
*pair = '\0';
}
/* Revert to NULL so that we exit the loop as expected. */
pair = NULL;
}
/* Now find the '=' in the previous pair, replace it with '\0' and save
* the parameter value string. */
equals = strchr(equals, '.');
if (equals) {
*equals = '\0';
param_vals[loop] = equals + 1;
} else {
param_vals[loop] = NULL;
}
}
return loop;
}
int extract_ip_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max) {
char *pair;
char *equals;
int loop;
/* If we have no parameters at all, return immediately. */
if (!params || (params[0] == '\0')) {
return (0);
}
/* Get a pointer to our first parameter */
pair = params;
/* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the
* remainder (if any) */
for (loop = 0; (loop < params_max) && pair; loop++) {
/* Save the name of the parameter */
param_names[loop] = pair;
/* Remember the start of this name=value pair */
equals = pair;
/* Find the start of the next name=value pair and replace the delimiter
* with a 0 to terminate the previous pair string. */
pair = strchr(pair, '.');
if (pair) {
*pair = '\0';
pair++;
} else {
/* We didn't find a new parameter so find the end of the URI and
* replace the space with a '\0' */
pair = strchr(equals, ' ');
if (pair) {
*pair = '\0';
}
/* Revert to NULL so that we exit the loop as expected. */
pair = NULL;
}
/* Now find the '=' in the previous pair, replace it with '\0' and save
* the parameter value string. */
equals = strchr(equals, '.');
if (equals) {
*equals = '\0';
param_vals[loop] = equals + 1;
} else {
param_vals[loop] = NULL;
}
}
return loop;
}
int extract_grp_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max) {
char *pair;
char *equals;
int loop;
/* If we have no parameters at all, return immediately. */
if (!params || (params[0] == '\0')) {
return (0);
}
/* Get a pointer to our first parameter */
pair = params;
/* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the
* remainder (if any) */
for (loop = 0; (loop < params_max) && pair; loop++) {
/* Save the name of the parameter */
param_names[loop] = pair;
/* Remember the start of this name=value pair */
equals = pair;
/* Find the start of the next name=value pair and replace the delimiter
* with a 0 to terminate the previous pair string. */
pair = strchr(pair, ',');
if (pair) {
*pair = '\0';
pair++;
} else {
/* We didn't find a new parameter so find the end of the URI and
* replace the space with a '\0' */
pair = strchr(equals, ' ');
if (pair) {
*pair = '\0';
}
/* Revert to NULL so that we exit the loop as expected. */
pair = NULL;
}
/* Now find the '=' in the previous pair, replace it with '\0' and save
* the parameter value string. */
equals = strchr(equals, ',');
if (equals) {
*equals = '\0';
param_vals[loop] = equals + 1;
} else {
param_vals[loop] = NULL;
}
}
return loop;
}
int extract_path_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max) {
char *pair;
char *equals;
int loop;
/* If we have no parameters at all, return immediately. */
if (!params || (params[0] == '\0')) {
return (0);
}
/* Get a pointer to our first parameter */
pair = params;
/* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the
* remainder (if any) */
for (loop = 0; (loop < params_max) && pair; loop++) {
/* Save the name of the parameter */
param_names[loop] = pair;
/* Remember the start of this name=value pair */
equals = pair;
/* Find the start of the next name=value pair and replace the delimiter
* with a 0 to terminate the previous pair string. */
pair = strchr(pair, '/');
if (pair) {
*pair = '\0';
pair++;
} else {
/* We didn't find a new parameter so find the end of the URI and
* replace the space with a '\0' */
pair = strchr(equals, ' ');
if (pair) {
*pair = '\0';
}
/* Revert to NULL so that we exit the loop as expected. */
pair = NULL;
}
/* Now find the '=' in the previous pair, replace it with '\0' and save
* the parameter value string. */
equals = strchr(equals, '/');
if (equals) {
*equals = '\0';
param_vals[loop] = equals + 1;
} else {
param_vals[loop] = NULL;
}
}
return loop;
}
int extract_uri_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max) {
char *pair;
char *equals;
int loop;
/* If we have no parameters at all, return immediately. */
if (!params || (params[0] == '\0')) {
return (0);
}
/* Get a pointer to our first parameter */
pair = params;
/* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the
* remainder (if any) */
for (loop = 0; (loop < params_max) && pair; loop++) {
/* Save the name of the parameter */
param_names[loop] = pair;
/* Remember the start of this name=value pair */
equals = pair;
/* Find the start of the next name=value pair and replace the delimiter
* with a 0 to terminate the previous pair string. */
pair = strchr(pair, '&');
if (pair) {
*pair = '\0';
pair++;
} else {
/* We didn't find a new parameter so find the end of the URI and
* replace the space with a '\0' */
pair = strchr(equals, ' ');
if (pair) {
*pair = '\0';
}
/* Revert to NULL so that we exit the loop as expected. */
pair = NULL;
}
/* Now find the '=' in the previous pair, replace it with '\0' and save
* the parameter value string. */
equals = strchr(equals, '=');
if (equals) {
*equals = '\0';
param_vals[loop] = equals + 1;
} else {
param_vals[loop] = NULL;
}
}
return loop;
}
int extract_utf8_parameters(char *inBuf, char *outBuf, int maxlen) {
unsigned char *p;
uint8_t n;
int count = 0;
for (p = (unsigned char *) inBuf; *p; ++p) {
if (*p == '%') {
// if (debug_scanf(p + 1, "%x", &n)) {
// '
n = iAsciiStringParseHexByte(p + 1);
// if (scanf(p + 1, "%x", &n)) {
if (n != 0x27) {
outBuf[count] = n;
++count;
}
p += 2;
// }
} else {
outBuf[count] = *p;
++count;
if (count >= maxlen)
break;
}
}
outBuf[count] = '\0';
return count;
}
void StrToStr(char *str1, char *str2) {
while (*str1 == '0')
++str1;
if (strlen(str1) == 0) {
strcpy(str2, "0");
} else {
strcpy(str2, str1);
}
}
void string2hexString(char *input, int size, char *output) {
int loop;
int i;
i = 0;
loop = 0;
while (input[loop] != '\0') {
debug_sprintf((char *) (output + i), size, "%02X", input[loop]);
loop += 1;
i += 2;
}
output[i++] = '\0';
}
// mapping of ASCII characters to hex values
const uint8_t hashmap[] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // !"#$%&'
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ()*+,-./
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 01234567
0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 89:;<=>?
0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, // @ABCDEFG
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // HIJKLMNO
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // PQRSTUVW
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // XYZ[\]^_
0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, // `abcdefg
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // hijklmno
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pqrstuvw
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // xyz{|}~.
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // ........
};
uint8_t HexToData(char *str, uint8_t *bytes) {
uint8_t pos;
uint8_t idx0;
uint8_t idx1;
for (pos = 0; ((pos < (strlen(str))) && (pos < strlen(str))); pos += 2) {
idx0 = (uint8_t) str[pos + 0];
idx1 = (uint8_t) str[pos + 1];
bytes[pos / 2] = (uint8_t) (hashmap[idx0] << 4) | hashmap[idx1];
}
bytes[pos / 2] = 0;
return strlen(str) / 2;
}

1687
Src/httpd_get.c Normal file

File diff suppressed because it is too large Load Diff

1074
Src/httpd_get_handlers.c Normal file

File diff suppressed because it is too large Load Diff

15
Src/httpd_post.c Normal file
View File

@ -0,0 +1,15 @@
//
// Created by cfif on 10.11.22.
//
#include "lwip/apps/httpd.h"
#include "lwip/debug.h"
#include "lwip/apps/fs.h"
#include <string.h>
#include "httpd.h"
#include "httpd_post.h"
#include "Settings_RS485_Bluetooth.h"
#include "httpd_base_func.h"
#include "JSONSettings.h"
#include "httpd_TablesPostGet.h"
//#include "stream.h"

787
Src/httpd_post_handlers.c Normal file
View File

@ -0,0 +1,787 @@
//
// Created by cfif on 12.12.22.
//
#include "httpd_post_handlers.h"
#include "string.h"
#include "httpd_base_func.h"
#include "stdlib.h"
#include "JSONSettings.h"
#include "Flash_MT29F2G01ABAGDWB.h"
//#include "stream.h"
#include "httpd_TablesPostGet.h"
#include "stdlib.h"
#include "fs_base_func.h"
#include "fs_interface.h"
#include "ModemGonec.h"
#include "http_server.h"
#include "ModemGonecFunc.h"
#include "DeviceStorageIni.h"
#include "BootJump.h"
#include "ModemSend.h"
/*
char bufNameDir[9];
size_t len = getNameDir(env->rtc, bufNameDir, sizeof(bufNameDir));
if (len != 8)
return Post_DATATIME_ERR;
*/
// начало-------------------Создание входящего сообщения handlerPost_Write_Other_File-----------------------------------
// начало-------------------Создание входящего сообщения handlerPost_Write_Other_File-----------------------------------
// начало-------------------Создание входящего сообщения handlerPost_Write_Other_File-----------------------------------
// Создание и запись в файл
idPostResult_t handlerPost_Write_Other_File(tHttpPostSetting *env) {
int pos = -1;
int len = -1;
char filename[MAX_LEN_PATH_FS];
filename[0] = '\0';
for (int i = 0; i < env->params_post_uri.paramcount; ++i) {
if (strcmp(env->params_post_uri.params_names[i], "pos") == 0)
pos = atoi(env->params_post_uri.params_vals[i]);
if (strcmp(env->params_post_uri.params_names[i], "len") == 0)
len = atoi(env->params_post_uri.params_vals[i]);
if (strcmp(env->params_post_uri.params_names[i], "wrfile") == 0)
extract_utf8_parameters(env->params_post_uri.params_vals[i], filename,
sizeof(filename));
}
if ((pos == -1) || (len == -1) || (strlen(filename) == 0) || (len > 1024 * 11)) {
return Post_PARAM_ERR;
}
FIL file;
FRESULT fr;
char temp_filename[MAX_LEN_PATH_FS];
temp_filename[0] = '\0';
strcat(temp_filename, "1:/");
filename[strlen(filename) - 1] = '\0';
strcat(temp_filename, &filename[1]);
fr = f_open_i(env->fs, &file, (TCHAR *) temp_filename, FA_WRITE | FA_CREATE_ALWAYS);
if (fr) {
return Post_FS_ERR;
}
fr = f_lseek_i(env->fs, &file, pos);
UINT bytes_written;
fr = f_write_i(env->fs, &file, env->bufAnswer, len, &bytes_written);
if (fr) {
f_close_i(env->fs, &file);
return Post_FS_ERR;
}
fr = f_close_i(env->fs, &file);
return Post_OK;
}
// конец-------------------Создание входящего сообщения handlerPost_Write_Other_File------------------------------------
// конец-------------------Создание входящего сообщения handlerPost_Write_Other_File------------------------------------
// конец-------------------Создание входящего сообщения handlerPost_Write_Other_File------------------------------------
// начало-------------------Создание входящего сообщения cmd.xip?wrfile---------------------------------------------------
// начало-------------------Создание входящего сообщения cmd.xip?wrfile---------------------------------------------------
// начало-------------------Создание входящего сообщения cmd.xip?wrfile---------------------------------------------------
// Создание и запись в файл
idPostResult_t handlerPost_Message_Outbox_Wrfile(tHttpPostSetting *env) {
int pos = -1;
int len = -1;
char filename[MAX_LEN_PATH_FS];
filename[0] = '\0';
for (int i = 0; i < env->params_post_uri.paramcount; ++i) {
if (strcmp(env->params_post_uri.params_names[i], "pos") == 0)
pos = atoi(env->params_post_uri.params_vals[i]);
if (strcmp(env->params_post_uri.params_names[i], "len") == 0)
len = atoi(env->params_post_uri.params_vals[i]);
if (strcmp(env->params_post_uri.params_names[i], "wrfile") == 0)
extract_utf8_parameters(env->params_post_uri.params_vals[i], filename,
sizeof(filename));
}
if ((pos == -1) || (len == -1) || (strlen(filename) == 0) || (len > 1024 * 11)) {
return Post_PARAM_ERR;
}
FIL file;
FRESULT fr;
char temp_filename[MAX_LEN_PATH_FS];
temp_filename[0] = '\0';
strcat(temp_filename, dir_temp);
filename[strlen(filename) - 1] = '\0';
strcat(temp_filename, &filename[1]);
fr = f_open_i(env->fs, &file, (TCHAR *) temp_filename, FA_WRITE | FA_CREATE_ALWAYS);
if (fr) {
return Post_FS_ERR;
}
fr = f_lseek_i(env->fs, &file, pos);
UINT bytes_written;
fr = f_write_i(env->fs, &file, env->bufAnswer, len, &bytes_written);
/*
uint32_t lenInteger = len / 512;
uint32_t lenTail = len % 512;
uint32_t stepMiniBuf = 0;
for (uint32_t i = 0; i < lenInteger; ++i) {
fr = f_write_i(env->fs, &file, &env->bufAnswer[stepMiniBuf], 512, &bytes_written);
stepMiniBuf += 512;
}
if (lenTail > 0) {
fr = f_write_i(env->fs, &file, &env->bufAnswer[stepMiniBuf], lenTail, &bytes_written);
}
*/
if (fr) {
f_close_i(env->fs, &file);
return Post_FS_ERR;
}
fr = f_close_i(env->fs, &file);
return Post_OK;
}
// конец-------------------Создание входящего сообщения cmd.xip?wrfile---------------------------------------------------
// конец-------------------Создание входящего сообщения cmd.xip?wrfile---------------------------------------------------
// конец-------------------Создание входящего сообщения cmd.xip?wrfile---------------------------------------------------
// начало-------------------Создание динамического файла---------------------------------------------------
// начало-------------------Создание динамического файла---------------------------------------------------
// начало-------------------Создание динамического файла---------------------------------------------------
// Создание и запись в файл
idPostResult_t handlerPost_Message_Outbox_DynamicWrfile(tHttpPostSetting *env, uint32_t offset, uint32_t len) {
FIL file;
FRESULT fr;
if (env->isFirst) {
fr = f_unlink_i(env->fs, env->createPostData.filename);
}
fr = f_open_i(env->fs, &file, (TCHAR *) env->createPostData.filename, FA_OPEN_APPEND | FA_WRITE);
if (fr) {
return Post_FS_ERR;
}
UINT bytes_written;
fr = f_write_i(env->fs, &file, &env->bufAnswer[offset], len, &bytes_written);
if (fr) {
f_close_i(env->fs, &file);
return Post_FS_ERR;
}
fr = f_close_i(env->fs, &file);
return Post_OK;
}
// конец-------------------Создание динамического файла---------------------------------------------------
// конец-------------------Создание динамического файла---------------------------------------------------
// конец-------------------Создание динамического файла---------------------------------------------------
// начало-------------------Загрузка ключей-----------------------------------------------------------------------------
// начало-------------------Загрузка ключей-----------------------------------------------------------------------------
// начало-------------------Загрузка ключей-----------------------------------------------------------------------------
// Загрузка ключей
idPostResult_t handlerPost_Key_Load(tHttpPostSetting *env) {
int key_num = 0;
for (int i = 0; i < env->params_post_uri.paramcount; ++i) {
if (strcmp(env->params_post_uri.params_names[i], "key") == 0) {
key_num = atoi(env->params_post_uri.params_vals[i]);
}
}
if ((key_num < 1) || (key_num > 12)) {
return Post_PARAM_ERR;
}
// Загрузка ключей с проверкой
idPostResult_t result = ModemLoadKey(env->modemMain, key_num, env->bufAnswer, env->content_len);
return result;
}
// конец--------------------Загрузка ключей-----------------------------------------------------------------------------
// конец--------------------Загрузка ключей-----------------------------------------------------------------------------
// конец--------------------Загрузка ключей-----------------------------------------------------------------------------
// начало--------------------Сохранение настроек------------------------------------------------------------------------
// начало--------------------Сохранение настроек------------------------------------------------------------------------
// начало--------------------Сохранение настроек------------------------------------------------------------------------
idPostResult_t handlerPost_Var(tHttpPostSetting *env, typeAuth auth) {
idPostResult_t result = Post_OK;
// Сохранение настроек во временные
// NvmToRuntimeSettings();
// Сохранение настроек во временные
Nvm_To_RuntimeSettings(env->storage);
bool grp1, grp2, grp3, grp8, grp11, grp12, grp14, grp25, grp26;
result = vJsonToStructure(env->bufAnswer, settings, env->modemMain, auth, &grp1, &grp2, &grp3,
&grp8, &grp11, &grp12, &grp14, &grp25, &grp26);
// Ошибка
if (result) {
Nvm_To_RuntimeSettings(env->storage);
return result;
}
if ((auth == AUTH_ADMIN) || ((auth == AUTH_INTEG))) {
if (env->modemMain->isModemCheck) {
if ((grp1) || (grp2) || (grp3) || (grp25)) {
if (osMutexAcquire(httpSettings.accessMODEM, TIME_MUTEX_MODEM_ACCESS) != osOK) {
return Post_MUTEX_ERR;
}
result = ModemInitAt(env->modemMain, grp1, grp2, grp3, grp25);
osMutexRelease(httpSettings.accessMODEM);
// Ошибка
if (result) {
Nvm_To_RuntimeSettings(env->storage);
return result;
}
}
}
// Основной режим доступа
if (grp3) {
if (env->storage->runtime.Settings_Basic_Access.MaxSzDataOnKB_v !=
env->storage->nvm.Settings_Basic_Access.MaxSzDataOnKB_v) {
if (env->storage->runtime.Settings_Basic_Access.MaxSzDataOnKB_v <
env->storage->nvm.Settings_Basic_Access.MaxSzDataOnKB_v) {
// Удалить все пакеты из модема
delRepout(env->modemMain, TYPE_FILE_MESSAGE, false, true);
}
env->modemMain->stateRequest.stateReqCreateExtT = StateReqExtForCreate;
env->modemMain->stateRequest.stateReqCreateExtW = StateReqExtForCreate;
}
}
// Загрузка настроек из временных
Runtime_To_NvmSettings(env->storage);
// Сохранение во флеш
DeviceStorageSetupIni_Dump(env->storage);
// Настройки 485 и Блютуз
if (grp14) {
// Перенастройка порта ComInt485
vSerialPort_ReInitUSART2(env->storage->nvm.Settings_RS485_Bluetooth.rs485baudrate_v);
ReInitExternalProtocol(env->external);
}
return result;
} else {
return Post_NO_AUTH;
}
}
// конец--------------------Сохранение настроек-------------------------------------------------------------------------
// конец--------------------Сохранение настроек-------------------------------------------------------------------------
// конец--------------------Сохранение настроек-------------------------------------------------------------------------
// начало-------------------Запись WEB----------------------------------------------------------------------------------
// начало-------------------Запись WEB----------------------------------------------------------------------------------
// начало-------------------Запись WEB----------------------------------------------------------------------------------
idPostResult_t handlerPost_Update_Web_File(tHttpPostSetting *env) {
char BufWrite[512];
char fileName[MAX_LEN_PATH_FS * 2];
char dirUpdateFileName[MAX_LEN_PATH_FS];
dirUpdateFileName[0] = '\0';
strcat(dirUpdateFileName, "1:/TMP/web.dat");
FIL file;
FRESULT fr = f_open_i(env->fs, &file, (TCHAR *) dirUpdateFileName, FA_READ);
if (fr) {
return Post_FS_ERR;
}
UINT bytes_read;
fr = f_read_i(env->fs, &file, env->bufAnswer, 12800, &bytes_read);
if (fr) {
f_close_i(env->fs, &file);
return Post_FS_ERR;
}
f_close_i(env->fs, &file);
uint32_t crcFileCalc = GetCrcFileFs(env->fs, dirUpdateFileName, 4);
uint32_t crcFile = ((uint32_t *) (env->bufAnswer))[0];
if (crcFileCalc != crcFile) {
return Post_CRC;
}
char dir_web_local[MAX_LEN_PATH_FS];
dir_web_local[0] = '\0';
strcat(dir_web_local, dir_web);
getDelFilesDir(env->fs, dir_web_local);
uint32_t fileTableDescriptorSize = ((uint32_t *) (env->bufAnswer))[1];
tFileTableDescriptor *pFileTableDescriptor = (tFileTableDescriptor *) (env->bufAnswer + 8);
for (uint32_t i = 0; i < fileTableDescriptorSize; ++i) {
struct {
int paramcount;
char *params_names[MAX_POST_GET_PARAMETERS];
char *params_vals[MAX_POST_GET_PARAMETERS];
} params_path;
fileName[0] = '\0';
strcat(fileName, &pFileTableDescriptor->name[1]);
params_path.paramcount = extract_path_ex_parameters(fileName,
params_path.params_names,
params_path.params_vals,
MAX_POST_GET_PARAMETERS);
char dirPathFileWeb[MAX_LEN_PATH_FS];
dirPathFileWeb[0] = '\0';
strcat(dirPathFileWeb, dir_web);
for (int j = 0; j < params_path.paramcount - 1; ++j) {
strcat(dirPathFileWeb, params_path.params_names[j]);
strcat(dirPathFileWeb, "/");
fr = f_mkdir(dirPathFileWeb);
}
++pFileTableDescriptor;
}
pFileTableDescriptor = (tFileTableDescriptor *) (env->bufAnswer + 8);
FIL fsrc, fdst; // File objects
UINT br, bw; // File read/write count
fr = f_open_i(env->fs, &fsrc, (TCHAR *) dirUpdateFileName, FA_READ);
if (fr) {
return Post_FS_ERR;
}
for (uint32_t i = 0; i < fileTableDescriptorSize; ++i) {
fileName[0] = '\0';
strcat(fileName, dir_web);
strcat(fileName, &pFileTableDescriptor->name[1]);
fr = f_open_i(env->fs, &fdst, fileName, FA_CREATE_ALWAYS | FA_WRITE);
if (fr) {
f_close_i(env->fs, &fsrc);
return Post_FS_ERR;
}
uint32_t leftFileSize = pFileTableDescriptor->size;
uint32_t lenTransPaket;
uint32_t offset = pFileTableDescriptor->address;
while (leftFileSize > 0) {
fr = f_lseek_i(env->fs, &fsrc, offset);
if (fr) {
f_close_i(env->fs, &fsrc);
f_close_i(env->fs, &fdst);
return Post_FS_ERR;
}
lenTransPaket = TRANS_MIN(leftFileSize, sizeof(BufWrite));
f_read_i(env->fs, &fsrc, (BufWrite), lenTransPaket, &br);
f_write_i(env->fs, &fdst, (BufWrite), br, &bw);
offset += lenTransPaket;
leftFileSize -= lenTransPaket;
}
++pFileTableDescriptor;
f_close_i(env->fs, &fdst);
}
f_close_i(env->fs, &fsrc);
fileName[0] = '\0';
strcat(fileName, dir_web);
strcat(fileName, "load");
fr = f_open_i(env->fs, &file, fileName, FA_CREATE_ALWAYS | FA_WRITE);
if (fr) {
return Post_FS_ERR;
}
f_close_i(env->fs, &file);
return Post_OK;
}
// конец-------------------Запись WEB-----------------------------------------------------------------------------------
// конец-------------------Запись WEB-----------------------------------------------------------------------------------
// конец-------------------Запись WEB-----------------------------------------------------------------------------------
// Инициализация прошивки КОНТРОЛЛЕРА
idPostResult_t handlerPost_Update_File_EraseFlash(tHttpPostSetting *env, tFirmwareLoaderXFSB firmwareLoaderXFSB) {
uint32_t size = 0;
uint32_t crc = 0;
uint8_t descriptionLen = 0;
uint8_t description[MAX_LEN_PATH_FS];
uint8_t stepParam = 0;
for (int i = 0; i < env->params_post_uri.paramcount; ++i) {
if (strcmp(env->params_post_uri.params_names[i], "size") == 0) {
size = atoi(env->params_post_uri.params_vals[i]);
++stepParam;
}
if (strcmp(env->params_post_uri.params_names[i], "crc") == 0) {
crc = atoi(env->params_post_uri.params_vals[i]);
++stepParam;
}
if (strcmp(env->params_post_uri.params_names[i], "description") == 0) {
extract_utf8_parameters(env->params_post_uri.params_vals[i], (char *) description, MAX_LEN_PATH_FS);
descriptionLen = strlen((char *) &description[1]) - 1;
++stepParam;
}
}
if (stepParam < 3) {
return Post_PARAM_ERR;
}
if (firmwareLoaderXFSB == FIRMWARE_XFSB_MAIN) {
if (FirmwareLoader_PrepareNewUpdate(env->firmwareMainLoader, size, crc, &description[1], descriptionLen)) {
return Post_OK;
}
}
if (firmwareLoaderXFSB == FIRMWARE_XFSB_BOOT) {
if (FirmwareLoader_PrepareNewUpdate(env->firmwareBootLoader, size, crc, &description[1], descriptionLen)) {
return Post_OK;
}
}
return Post_FLASH_ERR;
}
// Запись прошивки КОНТРОЛЛЕРА
idPostResult_t handlerPost_Update_File_WriteFlash(tHttpPostSetting *env, tFirmwareLoaderXFSB firmwareLoaderXFSB) {
uint32_t offset = 0;
uint8_t stepParam = 0;
for (int i = 0; i < env->params_post_uri.paramcount; ++i) {
if (strcmp(env->params_post_uri.params_names[i], "offset") == 0) {
offset = atoi(env->params_post_uri.params_vals[i]);
++stepParam;
}
}
if (stepParam < 1) {
return Post_PARAM_ERR;
}
if (firmwareLoaderXFSB == FIRMWARE_XFSB_MAIN) {
if (FirmwareLoader_WriteUpdatePortion(env->firmwareMainLoader, offset, (uint8_t *) env->bufAnswer,
env->content_len)) {
return Post_OK;
}
}
if (firmwareLoaderXFSB == FIRMWARE_XFSB_BOOT) {
if (FirmwareLoader_WriteUpdatePortion(env->firmwareBootLoader, offset, (uint8_t *) env->bufAnswer,
env->content_len)) {
return Post_OK;
}
}
return Post_FLASH_ERR;
}
idPostResult_t handlerPost_Update_Start_Main(tHttpPostSetting *env) {
//GpioPinSet(&env->gpios->Power.gonec_reset, false);
//BootJumpToAddress(0x08000000);
nvic_system_reset();
return Post_OK;
}
// Запись прошивки криптоплаты
idPostResult_t handlerPost_Update_Crypto_WriteFlash(tHttpPostSetting *env) {
uint32_t size = 0;
uint32_t crc = 0;
uint32_t offset = 0;
uint8_t stepParam = 0;
for (int i = 0; i < env->params_post_uri.paramcount; ++i) {
if (strcmp(env->params_post_uri.params_names[i], "size") == 0) {
size = atoi(env->params_post_uri.params_vals[i]);
++stepParam;
}
if (strcmp(env->params_post_uri.params_names[i], "crc") == 0) {
crc = atoi(env->params_post_uri.params_vals[i]);
++stepParam;
}
if (strcmp(env->params_post_uri.params_names[i], "offset") == 0) {
offset = atoi(env->params_post_uri.params_vals[i]);
++stepParam;
}
}
if (stepParam < 3) {
return Post_PARAM_ERR;
}
idPostResult_t result = ModemCryptoWrite(env->modemMain, (uint8_t *) env->bufAnswer, crc, offset, size);
return result;
}
// Запись прошивки модема
idPostResult_t handlerPost_Update_Modem_WriteFlash(tHttpPostSetting *env) {
uint32_t size = 0;
uint32_t crc = 0;
uint32_t offset = 0;
uint8_t stepParam = 0;
for (int i = 0; i < env->params_post_uri.paramcount; ++i) {
if (strcmp(env->params_post_uri.params_names[i], "size") == 0) {
size = atoi(env->params_post_uri.params_vals[i]);
++stepParam;
}
if (strcmp(env->params_post_uri.params_names[i], "crc") == 0) {
crc = atoi(env->params_post_uri.params_vals[i]);
++stepParam;
}
if (strcmp(env->params_post_uri.params_names[i], "offset") == 0) {
offset = atoi(env->params_post_uri.params_vals[i]);
++stepParam;
}
}
if (stepParam < 3) {
return Post_PARAM_ERR;
}
idPostResult_t result = ModemCryptoWrite(env->modemMain, (uint8_t *) env->bufAnswer, crc, offset, size);
return result;
}
// Инициализация записи прошивки крипто-платы
idPostResult_t handlerPost_Update_Init_Crypto_WriteFlash(tHttpPostSetting *env) {
uint8_t sizeModem;
uint8_t sizeCrypto;
char versionModem[128];
char versionCrypto[128];
memset(versionModem, 0, sizeof(versionModem));
memset(versionCrypto, 0, sizeof(versionCrypto));
strcpy(versionModem, "null,null");
strcpy(versionCrypto, "null,null");
bool result = Modem_Get_Version_Modem(env->modemMain, versionModem, &sizeModem, versionCrypto, &sizeCrypto);
if (result == false) {
return Post_SET_MODEM;
}
char *firmwareCryptoBoot = "null\0";
firmwareCryptoBoot = (char *) strchr(versionCrypto, ',');
if (firmwareCryptoBoot != NULL) {
*firmwareCryptoBoot = '\0';
firmwareCryptoBoot++;
}
if (strcmp(versionCrypto, "CRYPTO_BOOT") == 0) {
return Post_OK;
}
return Post_NO_CRYPTO_BOOT;
}
// Запуск крипто-платы после прошивки
idPostResult_t handlerPost_Update_Start_Crypto(tHttpPostSetting *env) {
uint8_t sizeModem;
uint8_t sizeCrypto;
char versionModem[128];
char versionCrypto[128];
memset(versionModem, 0, sizeof(versionModem));
memset(versionCrypto, 0, sizeof(versionCrypto));
strcpy(versionModem, "null,null");
strcpy(versionCrypto, "null,null");
// Запуск прошивки
bool result = RunModemOrCrypto(env->modemMain);
SystemDelayMs(1000);
result = Modem_Get_Version_Modem(env->modemMain, versionModem, &sizeModem, versionCrypto, &sizeCrypto);
if (result == false) {
return Post_SET_MODEM;
}
char *firmwareCryptoBoot = "null\0";
firmwareCryptoBoot = (char *) strchr(versionCrypto, ',');
if (firmwareCryptoBoot != NULL) {
*firmwareCryptoBoot = '\0';
firmwareCryptoBoot++;
}
if (strcmp(versionCrypto, "CRYPTO_MAIN") == 0) {
return Post_OK;
}
return Post_NO_CRYPTO_MAIN;
}
// Инициализация записи прошивки модема
idPostResult_t handlerPost_Update_Init_Modem_WriteFlash(tHttpPostSetting *env) {
uint8_t sizeModem;
uint8_t sizeCrypto;
char versionModem[128];
char versionCrypto[128];
memset(versionModem, 0, sizeof(versionModem));
memset(versionCrypto, 0, sizeof(versionCrypto));
strcpy(versionModem, "null,null");
strcpy(versionCrypto, "null,null");
env->modemMain->isModemCheck = false;
GpioPinSet(&env->gpios->Power.gonec_boot, true);
GpioPinSet(&env->gpios->Power.gonec_reset, false);
SystemDelayMs(1000);
GpioPinSet(&env->gpios->Power.gonec_reset, true);
SystemDelayMs(6000);
bool result = Modem_Get_Version_Modem(env->modemMain, versionModem, &sizeModem, versionCrypto, &sizeCrypto);
if (result == false) {
return Post_SET_MODEM;
}
char *firmwareModemBoot = "null\0";
firmwareModemBoot = (char *) strchr(versionModem, ',');
if (firmwareModemBoot != NULL) {
*firmwareModemBoot = '\0';
firmwareModemBoot++;
}
if (strcmp(versionModem, "MODEM_BOOT") == 0) {
return Post_OK;
}
return Post_NO_MODEM_BOOT;
}
// Запуск модема после прошивки
idPostResult_t handlerPost_Update_Start_Modem(tHttpPostSetting *env) {
uint8_t sizeModem;
uint8_t sizeCrypto;
char versionModem[128];
char versionCrypto[128];
memset(versionModem, 0, sizeof(versionModem));
memset(versionCrypto, 0, sizeof(versionCrypto));
strcpy(versionModem, "null,null");
strcpy(versionCrypto, "null,null");
GpioPinSet(&env->gpios->Power.gonec_boot, false);
GpioPinSet(&env->gpios->Power.gonec_reset, false);
SystemDelayMs(1000);
GpioPinSet(&env->gpios->Power.gonec_reset, true);
SystemDelayMs(6000);
bool result = Modem_Get_Version_Modem(env->modemMain, versionModem, &sizeModem, versionCrypto, &sizeCrypto);
if (result == false) {
return Post_SET_MODEM;
}
char *firmwareModemBoot = "null\0";
firmwareModemBoot = (char *) strchr(versionModem, ',');
if (firmwareModemBoot != NULL) {
*firmwareModemBoot = '\0';
firmwareModemBoot++;
}
env->modemMain->isModemCheck = false;
if (strcmp(versionModem, "MODEM_MAIN") == 0) {
env->modemMain->isModemCheck = true;
return Post_OK;
}
return Post_NO_MODEM_MAIN;
}

1443
fsdata.c Normal file

File diff suppressed because it is too large Load Diff

17
modular.json Normal file
View File

@ -0,0 +1,17 @@
{
"dep": [
{
"type": "git",
"provider": "GONEC",
"repo": "lwip_ARTERY_AT32"
}
],
"cmake": {
"inc_dirs": [
"Inc"
],
"srcs": [
"Src/**.c"
]
}
}