Init
This commit is contained in:
commit
f8345d586f
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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 */
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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 */
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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 */
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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")
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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}
|
||||||
|
};
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -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"
|
||||||
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"dep": [
|
||||||
|
{
|
||||||
|
"type": "git",
|
||||||
|
"provider": "GONEC_NEW",
|
||||||
|
"repo": "lwip_ARTERY_AT32"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"cmake": {
|
||||||
|
"inc_dirs": [
|
||||||
|
"Inc"
|
||||||
|
],
|
||||||
|
"srcs": [
|
||||||
|
"Src/**.c"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue