mirror of
https://github.com/oopuuu/zTC1.git
synced 2025-12-13 21:48:25 +08:00
881 lines
34 KiB
C
881 lines
34 KiB
C
/**
|
|
******************************************************************************
|
|
* @file mico_system.h
|
|
* @author William Xu
|
|
* @version V1.0.0
|
|
* @date 11-Aug-2015
|
|
* @brief This file provides all the headers for MiCO system functions, this is
|
|
* a application framework based on MiCO core APIs
|
|
******************************************************************************
|
|
*
|
|
* The MIT License
|
|
* Copyright (c) 2014 MXCHIP Inc.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is furnished
|
|
* to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
|
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
******************************************************************************
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "common.h"
|
|
#include "system.h"
|
|
#include "command_console/mico_cli.h"
|
|
#include "json_c/json.h"
|
|
#include "system_internal.h"
|
|
|
|
#ifndef MICO_PREBUILT_LIBS
|
|
#include "mico_config.h"
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef system_state_t mico_system_state_t;
|
|
typedef system_config_t mico_Context_t;
|
|
typedef system_status_wlan_t mico_system_status_wlan_t;
|
|
|
|
/** @defgroup MICO_SYSTEM_APIs MICO System APIs
|
|
* @brief MiCO System provide a basic framework for application based on MiCO core APIs
|
|
* @{
|
|
*/
|
|
|
|
/** @addtogroup MICO_SYSTEM_APIs
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup System_General System General Tools
|
|
* @brief Read MiCO system's version
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Read MiCO SDK version.
|
|
* @param major: Major version number.
|
|
* @param minor: Minor version number.
|
|
* @param revision: Revision nember.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
void mico_sdk_version( uint8_t *major, uint8_t *minor, uint8_t *revision );
|
|
|
|
/**
|
|
* @brief Read MiCO Application information.
|
|
* @param p_info: Point to the memory to store the info.
|
|
* @param len_info: Size of the menory.
|
|
* @retval none.
|
|
*/
|
|
void mico_app_info(char *p_info, int len_info);
|
|
|
|
/** @} */
|
|
|
|
|
|
/** @defgroup system_context Core Data Functions
|
|
* @brief System core data management, should initialized before other system functions
|
|
* @{
|
|
*/
|
|
|
|
/* Parameter section store in flash */
|
|
typedef enum
|
|
{
|
|
PARA_BOOT_TABLE_SECTION,
|
|
PARA_MICO_DATA_SECTION,
|
|
#ifdef MICO_BLUETOOTH_ENABLE
|
|
PARA_BT_DATA_SECTION,
|
|
#endif
|
|
PARA_SYS_END_SECTION,
|
|
PARA_APP_DATA_SECTION,
|
|
PARA_END_SECTION
|
|
} para_section_t;
|
|
|
|
/**
|
|
* @brief Initialize core data used by MiCO system framework. System and
|
|
* application's configuration are read from non-volatile storage:
|
|
* flash etc.
|
|
* @param size_of_user_data: The length of config data used by application
|
|
* @retval Address of core data.
|
|
*/
|
|
void* mico_system_context_init( uint32_t size_of_user_data );
|
|
|
|
/**
|
|
* @brief Get the address of the core data.
|
|
* @param none
|
|
* @retval Address of core data.
|
|
*/
|
|
mico_Context_t* mico_system_context_get( void );
|
|
|
|
/**
|
|
* @brief Get the address of the application's config data.
|
|
* @param in_context: The address of the core data.
|
|
* @retval Address of the application's config data.
|
|
*/
|
|
void* mico_system_context_get_user_data( mico_Context_t* const in_context );
|
|
|
|
/**
|
|
* @brief Restore configurations to default settings, it will cause a delegate
|
|
* function: appRestoreDefault_callback( ) to give a default value for
|
|
* application's config data.
|
|
* @param in_context: The address of the core data.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_context_restore( mico_Context_t* const in_context );
|
|
|
|
/**
|
|
* @brief Application should give a default value for application's config data
|
|
* on address: user_config_data
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @param user_config_data: The address of the application's config data.
|
|
* @param size: The size of the application's config data.
|
|
* @retval None
|
|
*/
|
|
void appRestoreDefault_callback(void * const user_config_data, uint32_t size);
|
|
|
|
/**
|
|
* @brief Write config data hosted by core data to non-volatile storage
|
|
* @param in_context: The address of the core data.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_context_update( mico_Context_t* const in_context );
|
|
|
|
OSStatus mico_system_para_read(void** info_ptr, int section, uint32_t offset, uint32_t size);
|
|
OSStatus mico_system_para_write(const void* info_ptr, int section, uint32_t offset, uint32_t size);
|
|
OSStatus mico_system_para_read_release( void* info_ptr );
|
|
|
|
/** @} */
|
|
|
|
/** @defgroup MiCO OTA Functions
|
|
* @brief MiCO firmware updation functions
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Active downloaded firmware that stored in MICO_PARTITION_OTA_TEMP
|
|
* @param ota_data_len: the length of the new firmware
|
|
* @param ota_data_crc: the crc result of the new firmware
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_ota_switch_to_new_fw(int ota_data_len, uint16_t ota_data_crc);
|
|
|
|
/** @} */
|
|
|
|
/** @defgroup system System Framework Functions
|
|
* @brief Initialize MiCO system functions defined in mico_config.h
|
|
* @{
|
|
*/
|
|
|
|
/** @brief Wlan configuration source */
|
|
typedef enum{
|
|
CONFIG_BY_NONE, /**< Default value */
|
|
CONFIG_BY_EASYLINK_V2, /**< Wlan configured by EasyLink revision 2.0 */
|
|
CONFIG_BY_EASYLINK_PLUS, /**< Wlan configured by EasyLink Plus */
|
|
CONFIG_BY_EASYLINK_MINUS, /**< Wlan configured by EasyLink Minus */
|
|
CONFIG_BY_MONITOR, /**< Wlan configured by airkiss from wechat Tencent inc. */
|
|
CONFIG_BY_SOFT_AP, /**< Wlan configured by EasyLink soft ap mode */
|
|
CONFIG_BY_WAC, /**< Wlan configured by wireless accessory configuration from Apple inc. */
|
|
CONFIG_BY_USER, /**< Wlan configured by user defined functions. */
|
|
} mico_config_source_t;
|
|
|
|
/** @brief Wlan connect err flag */
|
|
typedef enum{
|
|
EXIT_EASYLINK, /** Default value,exit easylink*/
|
|
RESTART_EASYLINK, /** Restart easylink after connection err*/
|
|
} mico_connect_fail_config_t;
|
|
|
|
/**
|
|
* @brief Initialize MiCO system functions according to mico_config.h
|
|
* @param in_context: The address of the core data.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_init( mico_Context_t* const in_context );
|
|
|
|
/**
|
|
* @brief Get IP, MAC, driver info for wlan interface
|
|
* @param status: The memory to store wlan status's address.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_wlan_get_status( mico_system_status_wlan_t** status );
|
|
|
|
/**
|
|
* @brief Start wlan configuration mode, EasyLink, SoftAP, Airkiss...
|
|
* according to macro: MICO_WLAN_CONFIG_MODE
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_wlan_start_autoconf( void );
|
|
|
|
/**
|
|
* @brief Inform the application that EasyLink configuration will start
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @retval None
|
|
*/
|
|
void mico_system_delegate_config_will_start( void );
|
|
|
|
/**
|
|
* @brief Inform the application that EasyLink configuration will stop
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @retval None
|
|
*/
|
|
void mico_system_delegate_config_will_stop( void );
|
|
|
|
/**
|
|
* @brief Inform the application that ssid and key are received from
|
|
* EasyLink client
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @param ssid: The address of the SSID string.
|
|
* @param key: The address of the Key string.
|
|
* @retval None
|
|
*/
|
|
void mico_system_delegate_config_recv_ssid ( char *ssid, char *key );
|
|
|
|
/**
|
|
* @brief Inform the application that auth data has received from
|
|
* EasyLink client
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @param userInfo: Authentication data string.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_delegate_config_recv_auth_data( char * userInfo );
|
|
|
|
/**
|
|
* @brief easylink timeout callback
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @param context: system_context_t
|
|
* @retval
|
|
*/
|
|
void mico_system_delegate_easylink_timeout( system_context_t *context );
|
|
|
|
/**
|
|
* @brief Inform the application that Easylink configuration is success.
|
|
* (MiCO has connect to wlan with the ssid and key)
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @param source: The configuration mode used by EasyLink client
|
|
* @retval None
|
|
*/
|
|
void mico_system_delegate_config_success( mico_config_source_t source );
|
|
|
|
/**
|
|
* @brief Inform the application that Easylink configuration is success.
|
|
* (MiCO has connect to wlan with the ssid and key)
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @param source: The configuration mode used by EasyLink client,result : result of connect
|
|
* @retval connect fail config
|
|
*/
|
|
mico_connect_fail_config_t mico_system_delegate_config_result( mico_config_source_t source, uint8_t result );
|
|
|
|
/**
|
|
* @brief Start wlan configuration mode: Apple MFi WAC protocol
|
|
* @param inContext: MiCO system core data, initialized by @ref mico_system_context_init
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_easylink_wac( mico_Context_t * const inContext, mico_bool_t enable );
|
|
|
|
/**
|
|
* @brief Start wlan configuration mode: EasyLink protocol
|
|
* @param inContext: MiCO system core data, initialized by @ref mico_system_context_init
|
|
* @param enable: MICO_TRUE to start and MICO_FALSE to stop
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_easylink( mico_Context_t * const in_context, mico_bool_t enable, mico_bool_t softap );
|
|
|
|
/**
|
|
* @brief Start wlan configuration mode: User mode, setup a routine that monitor wlan
|
|
* connection, once wlan is connected, save inContext content to flash. Developer
|
|
* only need to find a way to get ssid and password, and tell easylink user routine
|
|
* to handle the unfinished jobs.
|
|
* @param inContext: MiCO system core data, initialized by @ref mico_system_context_init
|
|
* @param enable: MICO_TRUE to start and MICO_FALSE to stop
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_easylink_usr( mico_Context_t * const in_context, mico_bool_t enable );
|
|
|
|
/**
|
|
* @brief Tell EasyLink usr routine that wlan configuration is received.
|
|
* @param nwkpara: Wlan configurations
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_easylink_usr_save_result( network_InitTypeDef_st *nwkpara );
|
|
|
|
/**
|
|
* @brief Start wlan configuration mode: EasyLink softap protocol
|
|
* @param inContext: MiCO system core data, initialized by @ref mico_system_context_init
|
|
* @param enable: MICO_TRUE to start and MICO_FALSE to stop
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_easylink_softap( mico_Context_t * const in_context, mico_bool_t enable );
|
|
|
|
/**
|
|
* @brief Start wlan configuration mode: EasyLink monitor protocol. Developer should
|
|
* complete mico_easylink_monitor_delegate_xxx functions to fulfill whole wlan
|
|
* monitor protocols, link: airkiss, Hi-link, Ali AWS, smart-config...
|
|
* @param inContext: MiCO system core data, initialized by @ref mico_system_context_init
|
|
* @param enable: MICO_TRUE to start and MICO_FALSE to stop
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_easylink_monitor( mico_Context_t * const in_context, mico_bool_t enable );
|
|
|
|
/**
|
|
* @brief Start wlan configuration mode: EasyLink monitor protocol with EasyLink compatible
|
|
* @param inContext: MiCO system core data, initialized by @ref mico_system_context_init
|
|
* @param enable: MICO_TRUE to start and MICO_FALSE to stop
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_easylink_monitor_with_easylink( mico_Context_t * const in_context, mico_bool_t enable );
|
|
|
|
/**
|
|
* @brief Tell EasyLink monitor routine that wlan configuration is received.
|
|
* @note Only useful in EasyLink user mode and EasyLink monitor mode, where analyzing is
|
|
* outside the EasyLink routine
|
|
* @param nwkpara: Wlan configurations
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_easylink_monitor_save_result( network_InitTypeDef_st *nwkpara );
|
|
|
|
/**
|
|
* @brief Tell EasyLink monitor routine that change wlan channel periodically
|
|
* @param enable: MICO_TRUE to enable channel walker and MICO_FALSE to stop
|
|
* @param interval: Time internal channel is changed, unit: milliseconds
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_easylink_monitor_channel_walker( mico_bool_t enable, uint32_t interval );
|
|
|
|
/**
|
|
* @brief Execute before wlan monitor mode will start
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @retval none
|
|
*/
|
|
void mico_easylink_monitor_delegate_will_start( void );
|
|
|
|
/**
|
|
* @brief Execute before wlan monitor mode is stopped
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @retval none
|
|
*/
|
|
void mico_easylink_monitor_delegate_stoped( void );
|
|
|
|
/**
|
|
* @brief Execute when wlan channel is changed
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @param currnet_channel: Current monitoring wlan channel 1-13
|
|
* @retval none
|
|
*/
|
|
void mico_easylink_monitor_delegate_channel_changed( uint8_t currnet_channel );
|
|
|
|
/**
|
|
* @brief Execute when wlan mac package is received
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @param frame: Point to the package
|
|
* @param len: Package length
|
|
* @retval none
|
|
*/
|
|
void mico_easylink_monitor_delegate_package_recved( uint8_t * frame, int len );
|
|
|
|
/**
|
|
* @brief Execute when access point is connected in monitor mode
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @note source: wlan configuration method, user monitor extension or build-in easylink
|
|
* @retval none
|
|
*/
|
|
void mico_easylink_monitor_delegate_connect_success( mico_config_source_t source );
|
|
|
|
/** @} */
|
|
|
|
|
|
|
|
|
|
/** @defgroup system_monitor System Monitor Functions
|
|
* @brief Create monitors in MiCO. Monitors should be updated periodically,
|
|
* if not, a system reboot will perform.
|
|
* @{
|
|
*/
|
|
|
|
|
|
/** @brief Structure to hold information about a system monitor item
|
|
* Application should not destroy or modify a system monitor item
|
|
*/
|
|
typedef struct _mico_system_monitor_t
|
|
{
|
|
uint32_t last_update; /**< Time of the last system monitor update */
|
|
uint32_t longest_permitted_delay; /**< Longest permitted delay between checkins with the system monitor */
|
|
} mico_system_monitor_t;
|
|
|
|
/**
|
|
* @brief Start the system monitor daemon
|
|
* @note This function can be called automatically by mico_system_init( )
|
|
* if macro: MICO_SYSTEM_MONITOR_ENABLE is defined
|
|
* @retval None
|
|
*/
|
|
OSStatus mico_system_monitor_daemen_start( void );
|
|
|
|
/**
|
|
* @brief Register a system monitor point
|
|
* @param system_monitor: The address of a system monitor item.
|
|
* @param initial_permitted_delay: Longest permitted delay between checkins with the system monitor.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_monitor_register( mico_system_monitor_t* system_monitor, uint32_t initial_permitted_delay );
|
|
|
|
/**
|
|
* @brief Perform a system monitor point checkin
|
|
* @param system_monitor: The address of a system monitor item.
|
|
* @param permitted_delay: The next permitted delay on the next checkin with the system monitor.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_monitor_update ( mico_system_monitor_t* system_monitor, uint32_t permitted_delay );
|
|
|
|
/**
|
|
*
|
|
@}
|
|
*/
|
|
|
|
|
|
/** @defgroup system_power System Power Management Functions
|
|
* @brief Perform a safety power status change on MiCO.
|
|
* @{
|
|
*/
|
|
|
|
|
|
/**
|
|
* @brief Perform a system power change.
|
|
* @note This function can be used only after power management daemon is started
|
|
* @param in_context: The address of the core data.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_power_perform( mico_Context_t* const in_context, mico_system_state_t new_state );
|
|
/** @} */
|
|
|
|
/*****************************************************************************/
|
|
/** @defgroup system_notify System Notify Functions
|
|
* @brief Register a user function to a MiCO notification, this function will
|
|
* be called when a MiCO notification is triggered
|
|
* @{
|
|
*/
|
|
/*****************************************************************************/
|
|
|
|
typedef notify_wlan_t WiFiEvent;
|
|
|
|
/** @brief MICO system defined notifications */
|
|
typedef enum{
|
|
|
|
mico_notify_WIFI_SCAN_COMPLETED, /**< A wlan scan is completed, type: void (*function)(ScanResult *pApList, void* arg)*/
|
|
mico_notify_WIFI_STATUS_CHANGED, /**< Wlan connection status is changed, type: void (*function)(WiFiEvent status, void* arg)*/
|
|
mico_notify_WiFI_PARA_CHANGED, /**< Wlan parameters has received (channel, BSSID, key...), called when connect to a wlan, type: void (*function)(apinfo_adv_t *ap_info, char *key, int key_len, void* arg)*/
|
|
mico_notify_DHCP_COMPLETED, /**< MiCO has get the IP address from DHCP server, type: void (*function)(IPStatusTypedef *pnet, void* arg)*/
|
|
mico_notify_EASYLINK_WPS_COMPLETED, /**< EasyLink receive SSID, Key, type: void (*function)(network_InitTypeDef_st *nwkpara, void* arg)*/
|
|
mico_notify_EASYLINK_GET_EXTRA_DATA, /**< EasyLink receive extra data, type: void (*function)(int datalen, char*data, void* arg)*/
|
|
mico_notify_TCP_CLIENT_CONNECTED, /**< A tcp client has connected to TCP server, type: void (*function)(int fd, void* arg)*/
|
|
mico_notify_DNS_RESOLVE_COMPLETED, /**< A DNS host address has resolved, type: void (*function)(uint8_t *hostname, uint32_t ip, void* arg)*/
|
|
mico_notify_SYS_WILL_POWER_OFF, /**< System power will be turned off, type: void (*function)(void* arg)*/
|
|
mico_notify_WIFI_CONNECT_FAILED, /**< A wlan connection attemption is failed, type: void join_fail(OSStatus err, void* arg)*/
|
|
mico_notify_WIFI_SCAN_ADV_COMPLETED, /**< A anvanced wlan scan is completed, type: void (*function)(ScanResult_adv *pApList, void* arg)*/
|
|
mico_notify_WIFI_Fatal_ERROR, /**< A fatal error occured when communicating with wlan sub-system, type: void (*function)(void* arg)*/
|
|
mico_notify_Stack_Overflow_ERROR, /**< A MiCO RTOS thread's stack is over-flowed, type: void (*function)(char *taskname, void* arg)*/
|
|
|
|
} mico_notify_types_t;
|
|
|
|
/**
|
|
* @brief Register a user function to a MiCO notification.
|
|
* @param notify_type: The type of MiCO notification.
|
|
* @param functionAddress: The address of user function.
|
|
* @param arg: The address of argument, which will be called by registered user function.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_notify_register( mico_notify_types_t notify_type, void* functionAddress, void* arg );
|
|
|
|
/**
|
|
* @brief Remove a user function from a MiCO notification.
|
|
* @param notify_type: The type of MiCO notification.
|
|
* @param functionAddress: The address of user function.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_notify_remove( mico_notify_types_t notify_type, void *functionAddress );
|
|
|
|
/**
|
|
* @brief Remove all user function from a MiCO notification.
|
|
* @param notify_type: The type of MiCO notification.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mico_system_notify_remove_all( mico_notify_types_t notify_type);
|
|
|
|
|
|
/** @} */
|
|
|
|
|
|
/** @defgroup config_server System Config Server Daemon
|
|
* @brief Local network service, used to change MiCO system's configurations
|
|
* @{
|
|
*/
|
|
|
|
|
|
/**
|
|
* @brief Start local config server.
|
|
* @note This function can be called automatically by mico_system_init( )
|
|
* if macro: MICO_CONFIG_SERVER_ENABLE is defined.
|
|
* @param in_context: The address of the core data.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus config_server_start ( void );
|
|
|
|
/**
|
|
* @brief Stop local config server.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus config_server_stop ( void );
|
|
|
|
/**
|
|
* @brief Inform the application that configuration data is received from
|
|
* config client
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @param key: The name of a configuration item.
|
|
* @param value: The value of a configuration item, can be read use a json_object_get_xxx
|
|
* function from json_c library.
|
|
* @param in_context: The address of the core data.
|
|
* @retval None.
|
|
*/
|
|
void config_server_delegate_recv( const char *key, json_object *value, bool *need_reboot, mico_Context_t *in_context );
|
|
|
|
/**
|
|
* @brief Inform the application that configuration server is collecting application's config data
|
|
* @note This a delegate function, can be completed by developer.
|
|
* @param config_cell_list: The UI element container to store application's config data.
|
|
* Developer can use config_server_create_xxx_cell functions to add customized UI element
|
|
* to config_cell_list.
|
|
* @param in_context: The address of the core data.
|
|
* @retval None.
|
|
*/
|
|
void config_server_delegate_report( json_object *config_cell_list, mico_Context_t *in_context );
|
|
|
|
/**
|
|
* @brief Add a cell UI holds a string value. config_cell_list(1)<=config_cell(1).
|
|
* @param config_cell_list: The config cell container.
|
|
* @param name: String indicate the name of a config data.
|
|
* @param content: String value of a config data.
|
|
* @param privilege: The privilege of a value on config client.
|
|
* @arg "RO": Read only. @arg "RW": Read or write.
|
|
* @param secectionArray: Generate a selection list for possible value, input NULL if not exist
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus config_server_create_string_cell (json_object* config_cell_list, char* const name, char* const content, char* const privilege, json_object* secectionArray);
|
|
|
|
/**
|
|
* @brief Add a cell UI holds a integer value. config_cell_list(1)<=config_cell(1).
|
|
* @param config_cell_list: The config cell container.
|
|
* @param name: String indicate the name of a config data.
|
|
* @param content: Integer value of a config data.
|
|
* @param privilege: The privilege of a value on config client.
|
|
* @arg "RO": Read only. @arg "RW": Read or write.
|
|
* @param secectionArray: Generate a selection list for possible value, input NULL if not exist
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus config_server_create_number_cell (json_object* config_cell_list, char* const name, int content, char* const privilege, json_object* secectionArray);
|
|
|
|
/**
|
|
* @brief Add a cell UI holds a float value. config_cell_list(1)<=config_cell(1).
|
|
* @param config_cell_list: The config cell container.
|
|
* @param name: String indicate the name of a config data.
|
|
* @param content: Float value of a config data.
|
|
* @param privilege: The privilege of a value on config client.
|
|
* @arg "RO": Read only. @arg "RW": Read or write.
|
|
* @param secectionArray: Generate a selection list for possible value
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus config_server_create_float_cell (json_object* config_cell_list, char* const name, float content, char* const privilege, json_object* secectionArray);
|
|
|
|
/**
|
|
* @brief Add a cell UI holds a bool value. config_cell_list(1)<=config_cell(1).
|
|
* @param config_cell_list: The config cell container.
|
|
* @param name: String indicate the name of a config data.
|
|
* @param content: Bool value of a config data.
|
|
* @param privilege: The privilege of a value on config client.
|
|
* @arg "RO": Read only. @arg "RW": Read or write.
|
|
* @param secectionArray: Generate a selection list for possible value
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus config_server_create_bool_cell (json_object* config_cell_list, char* const name, boolean content, char* const privilege);
|
|
|
|
/**
|
|
* @brief Add a cell UI holds a sub menu, config_cell_list(1)<=sub_menu_array(1).
|
|
* @param config_cell_list: The config cell container.
|
|
* @param name: String indicate the name of a sub menu.
|
|
* @param sub_menu_array: An array that buids a sub menu list.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus config_server_create_sub_menu_cell (json_object* config_cell_list, char* const name, json_object* sub_menu_array);
|
|
|
|
/**
|
|
* @brief Create a new config cell list to an exist menu. sub_menu_array(1)<=config_cell_list(n)
|
|
* @param sub_menu_array: An array that buids a sub menu list.
|
|
* @param name: String indicate the name of a config cell list.
|
|
* @param config_cell_list: The config cell container.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus config_server_create_sector (json_object* sub_menu_array, char* const name, json_object *config_cell_list);
|
|
|
|
/** @} */
|
|
|
|
|
|
|
|
/** \defgroup cli System Command Line Interface
|
|
* @brief MiCO command console
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Initialize the CLI module
|
|
* @note This function can be called automatically by mico_system_init( )
|
|
* if macro: MICO_CLI_ENABLE is defined.
|
|
* @retval 0 is returned on success, otherwise, -1 is returned.
|
|
*/
|
|
int cli_init(void);
|
|
|
|
/** @} */
|
|
|
|
|
|
|
|
/** @defgroup system_mdns System mDNS service functions
|
|
* @brief Multicast DNS is a way of using familiar DNS programming interfaces,
|
|
* packet formats and operating semantics, in a small network.
|
|
* @{
|
|
*/
|
|
|
|
|
|
/** @brief Structure to store mDNS record data
|
|
*/
|
|
|
|
enum mdns_record_state_e{
|
|
RECORD_REMOVED, /**< The service and resources are removed. */
|
|
RECORD_UPDATE, /**< The service record is updating, mdns routine will announce the new service content. */
|
|
RECORD_REMOVE, /**< The service record is removing, mdns routine will announce the service with TTL = 0 for
|
|
1 second, resources will be removed after the announce period */
|
|
RECORD_SUSPEND, /**< The service record is suspended, mdns routine will announce the service with TTL = 0 for
|
|
1 second and not respond the mdns query. */
|
|
RECORD_NORMAL, /**< The service can respond to mdns query . */
|
|
};
|
|
typedef uint8_t mdns_record_state_t;
|
|
|
|
typedef struct _mdns_init_t
|
|
{
|
|
char *service_name; /**< The service name of a mDNS record, example: "_easylink_config._tcp.local." */
|
|
char *host_name; /**< The host name of a mDNS record, example: "device_name.local." */
|
|
char *instance_name; /**< The instance name of a mDNS record, example: "device_name" */
|
|
char *txt_record; /**< Txt record holds customized info, every info is seperated by '.',
|
|
the orginal '.' is replaced by "/.", example: "record/.1=1.record/.2=2/.3" */
|
|
uint16_t service_port; /**< Service port */
|
|
} mdns_init_t;
|
|
|
|
/**
|
|
* @brief Add a new mDNS record, a mDNS service daemon will be start if necessary
|
|
* @param record: mDNS record data.
|
|
* @param interface: Which network interface, the IP info will be read from when response a nDNS request.
|
|
* @param time_to_live: The TTL of a mDNS record.
|
|
* @retval kNoErr is returned on success, otherwise, kXXXErr is returned.
|
|
*/
|
|
OSStatus mdns_add_record( mdns_init_t record, WiFi_Interface interface, uint32_t time_to_live );
|
|
|
|
/**
|
|
* @brief Suspend a mDNS record, announce the TTL of this record equal to zero, and do not respond mDNS request
|
|
* @param service_name: The service name of a mDNS record. example: "_easylink_config._tcp.local."
|
|
* @param interface: Which network interface, the IP info will be read from when response a nDNS request.
|
|
* @param will_remove: Destory record info from memory after announced.
|
|
* @retval None.
|
|
*/
|
|
void mdns_suspend_record( char *service_name, WiFi_Interface interface, bool will_remove );
|
|
|
|
/**
|
|
* @brief Resume a suspended mDNS record, announce the TTL of this record to orginal value, and respond to following mDNS request
|
|
* @param service_name: The service name of a mDNS record. example: "_easylink_config._tcp.local."
|
|
* @param interface: Which network interface, the IP info will be read from when response a nDNS request.
|
|
* @retval None.
|
|
*/
|
|
void mdns_resume_record( char *service_name, WiFi_Interface interface );
|
|
|
|
/**
|
|
* @brief Update txt record with a new value
|
|
* @param service_name: The service name of a mDNS record. example: "_easylink_config._tcp.local."
|
|
* @param interface: Which network interface, the IP info will be read from when response a nDNS request.
|
|
* @param txt_record: Txt record holds customized info, every info is seperated by '.', the orginal '.' is
|
|
* replaced by "/.", example: "record/.1=1.record/.2=2/.3" = "record.1=1" and "record.2=2.3"
|
|
* @retval None.
|
|
*/
|
|
void mdns_update_txt_record( char *service_name, WiFi_Interface interface, char *txt_record );
|
|
|
|
/**
|
|
* @brief Get mdns service status
|
|
* @param service_name: The service name of a mDNS record. example: "_easylink_config._tcp.local."
|
|
* @param interface: network interface, the mdns service is bonded
|
|
* @retval @ref mdns_record_state_t.
|
|
*/
|
|
mdns_record_state_t mdns_get_record_status( char *service_name, WiFi_Interface interface);
|
|
|
|
/** @} */
|
|
|
|
/** @defgroup system_time MiCO System time functions
|
|
* @brief Functions to get and set the real-time-clock time.
|
|
* @{
|
|
*/
|
|
|
|
|
|
|
|
/** ISO8601 Time Structure
|
|
*/
|
|
#pragma pack(1)
|
|
|
|
typedef struct
|
|
{
|
|
char year[4]; /**< Year */
|
|
char dash1; /**< Dash1 */
|
|
char month[2]; /**< Month */
|
|
char dash2; /**< Dash2 */
|
|
char day[2]; /**< Day */
|
|
char T; /**< T */
|
|
char hour[2]; /**< Hour */
|
|
char colon1; /**< Colon1 */
|
|
char minute[2]; /**< Minute */
|
|
char colon2; /**< Colon2 */
|
|
char second[2]; /**< Second */
|
|
char decimal; /**< Decimal */
|
|
char sub_second[6]; /**< Sub-second */
|
|
char Z; /**< UTC timezone */
|
|
} iso8601_time_t;
|
|
|
|
#pragma pack()
|
|
|
|
/** Get the current system tick time in milliseconds
|
|
*
|
|
* @note The time will roll over every 49.7 days
|
|
*
|
|
* @param[out] time : A pointer to the variable which will receive the time value
|
|
*
|
|
* @return @ref OSStatus
|
|
*/
|
|
OSStatus mico_time_get_time( mico_time_t* time );
|
|
|
|
|
|
/** Set the current system tick time in milliseconds
|
|
*
|
|
* @param[in] time : the time value to set
|
|
*
|
|
* @return @ref OSStatus
|
|
*/
|
|
OSStatus mico_time_set_time( const mico_time_t* time );
|
|
|
|
|
|
/** Get the current UTC time in seconds
|
|
*
|
|
* This will only be accurate if the time has previously been set by using @ref mico_time_set_utc_time_ms
|
|
*
|
|
* @param[out] utc_time : A pointer to the variable which will receive the time value
|
|
*
|
|
* @return @ref OSStatus
|
|
*/
|
|
OSStatus mico_time_get_utc_time( mico_utc_time_t* utc_time );
|
|
|
|
|
|
/** Get the current UTC time in milliseconds
|
|
*
|
|
* This will only be accurate if the time has previously been set by using @ref mico_time_set_utc_time_ms
|
|
*
|
|
* @param[out] utc_time_ms : A pointer to the variable which will receive the time value
|
|
*
|
|
* @return @ref OSStatus
|
|
*/
|
|
OSStatus mico_time_get_utc_time_ms( mico_utc_time_ms_t* utc_time_ms );
|
|
|
|
|
|
/** Set the current UTC time in milliseconds
|
|
*
|
|
* @param[in] utc_time_ms : the time value to set
|
|
*
|
|
* @return @ref OSStatus
|
|
*/
|
|
OSStatus mico_time_set_utc_time_ms( const mico_utc_time_ms_t* utc_time_ms );
|
|
|
|
|
|
/** Get the current UTC time in iso 8601 format e.g. "2012-07-02T17:12:34.567890Z"
|
|
*
|
|
* @note The time will roll over every 49.7 days
|
|
*
|
|
* @param[out] iso8601_time : A pointer to the structure variable that
|
|
* will receive the time value
|
|
*
|
|
* @return @ref OSStatus
|
|
*/
|
|
OSStatus mico_time_get_iso8601_time( iso8601_time_t* iso8601_time );
|
|
|
|
|
|
/** Convert a time from UTC milliseconds to iso 8601 format e.g. "2012-07-02T17:12:34.567890Z"
|
|
*
|
|
* @param[in] utc_time_ms : the time value to convert
|
|
* @param[out] iso8601_time : A pointer to the structure variable that
|
|
* will receive the time value
|
|
*
|
|
* @return @ref OSStatus
|
|
*/
|
|
OSStatus mico_time_convert_utc_ms_to_iso8601( mico_utc_time_ms_t utc_time_ms, iso8601_time_t* iso8601_time );
|
|
|
|
|
|
#define MicoNanosendDelay mico_nanosecond_delay
|
|
/** Delay a period of time
|
|
*
|
|
* @param[in] delayus : the time value to set ( unit: nanosecond )
|
|
*
|
|
* @return none: this function will block until target time is reached
|
|
*/
|
|
void mico_nanosecond_delay( uint64_t delayus );
|
|
|
|
/** Get current nanosecond time
|
|
*
|
|
* @return current nanosecond time
|
|
*/
|
|
uint64_t mico_nanosecond_clock_value( void );
|
|
|
|
/** Set current nanosecond time to zero
|
|
*
|
|
* @return none
|
|
*/
|
|
void mico_nanosecond_reset( void );
|
|
|
|
/** Initialisse nanosecond counter function
|
|
*
|
|
* @return none
|
|
*/
|
|
void mico_nanosecond_init( void );
|
|
|
|
/** @} */
|
|
|
|
|
|
/** @defgroup tftp_ota Firmware Update From a TFTP Server
|
|
* @brief Provide an easy way to download firmware from tftp server, use a
|
|
* predefined wlan and server address. It is used under factory environment
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Get new firmware from a TFTP Server, and replace the old one
|
|
* @retval None.
|
|
*/
|
|
void tftp_ota(void);
|
|
|
|
/** @} */
|
|
|
|
/** @} */
|
|
|
|
/** @} */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
} /*extern "C" */
|
|
#endif
|