mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-13 10:15:00 +00:00
This reverts commit 1a17e17c462bdd4e1d26d8742f8b7087273e04c2. PUBLISHED_FROM=80028de308c9a021955d1425d2bfee8feb85f193
280 lines
10 KiB
C
280 lines
10 KiB
C
/* clang-format off */
|
|
/*******************************************************************************
|
|
MPLAB Harmony Application Source File
|
|
|
|
Company:
|
|
Microchip Technology Inc.
|
|
|
|
File Name:
|
|
app.c
|
|
|
|
Summary:
|
|
This file contains the source code for the MPLAB Harmony application.
|
|
|
|
Description:
|
|
This file contains the source code for the MPLAB Harmony application. It
|
|
implements the logic of the application's state machine and it may call
|
|
API routines of other MPLAB Harmony modules in the system, such as drivers,
|
|
system services, and middleware. However, it does not call any of the
|
|
system interfaces (such as the "Initialize" and "Tasks" functions) of any of
|
|
the modules in the system or make any assumptions about when those functions
|
|
are called. That is the responsibility of the configuration-specific system
|
|
files.
|
|
*******************************************************************************/
|
|
|
|
// DOM-IGNORE-BEGIN
|
|
/*******************************************************************************
|
|
Copyright (c) 2013-2014 released Microchip Technology Inc. All rights reserved.
|
|
|
|
Microchip licenses to you the right to use, modify, copy and distribute
|
|
Software only when embedded on a Microchip microcontroller or digital signal
|
|
controller that is integrated into your product or third party product
|
|
(pursuant to the sublicense terms in the accompanying license agreement).
|
|
|
|
You should refer to the license agreement accompanying this Software for
|
|
additional information regarding your rights and obligations.
|
|
|
|
SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
|
|
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
|
|
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
|
|
CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
|
|
OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
|
|
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
|
|
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
|
|
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
|
|
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
|
|
*******************************************************************************/
|
|
// DOM-IGNORE-END
|
|
|
|
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
// Section: Included Files
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
|
|
#include "app.h"
|
|
#include "./../../../../../mongoose.h"
|
|
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
// Section: Global Data Definitions
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
|
|
// *****************************************************************************
|
|
/* Application Data
|
|
|
|
Summary:
|
|
Holds application data
|
|
|
|
Description:
|
|
This structure holds the application's data.
|
|
|
|
Remarks:
|
|
This structure should be initialized by the APP_Initialize function.
|
|
|
|
Application strings and buffers are be defined outside this structure.
|
|
*/
|
|
|
|
APP_DATA appData;
|
|
struct mg_mgr mgr;
|
|
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
// Section: Application Callback Functions
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
|
|
/* TODO: Add any necessary callback funtions.
|
|
*/
|
|
|
|
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
// Section: Application Local Functions
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
|
|
|
|
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
// Section: Application Initialization and State Machine Functions
|
|
// *****************************************************************************
|
|
// *****************************************************************************
|
|
|
|
/*******************************************************************************
|
|
Function:
|
|
void APP_Initialize ( void )
|
|
|
|
Remarks:
|
|
See prototype in app.h.
|
|
*/
|
|
|
|
const char *s_http_port = "8000";
|
|
|
|
void ev_handler(struct mg_connection *nc, int ev, void *ev_data) {
|
|
switch (ev) {
|
|
case MG_EV_ACCEPT: {
|
|
char addr[32];
|
|
mg_sock_addr_to_str(&nc->sa, addr, sizeof(addr),
|
|
MG_SOCK_STRINGIFY_IP | MG_SOCK_STRINGIFY_PORT);
|
|
SYS_PRINT("%p: Connection from %s\r\n", nc, addr);
|
|
break;
|
|
}
|
|
case MG_EV_HTTP_REQUEST: {
|
|
struct http_message *hm = (struct http_message *) ev_data;
|
|
char addr[32];
|
|
mg_sock_addr_to_str(&nc->sa, addr, sizeof(addr),
|
|
MG_SOCK_STRINGIFY_IP | MG_SOCK_STRINGIFY_PORT);
|
|
SYS_PRINT("%p: %.*s %.*s\r\n", nc, (int) hm->method.len, hm->method.p,
|
|
(int) hm->uri.len, hm->uri.p);
|
|
mg_send_response_line(nc, 200,
|
|
"Content-Type: text/html\r\n"
|
|
"Connection: close");
|
|
mg_printf(nc,
|
|
"\r\n<h1>Hello, %s!</h1>\r\n"
|
|
"You asked for %.*s\r\n",
|
|
addr, (int) hm->uri.len, hm->uri.p);
|
|
nc->flags |= MG_F_SEND_AND_CLOSE;
|
|
break;
|
|
}
|
|
case MG_EV_CLOSE: {
|
|
SYS_PRINT("%p: Connection closed\r\n", nc);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void APP_Initialize ( void )
|
|
{
|
|
/* Place the App state machine in its initial state. */
|
|
appData.state = APP_STATE_INIT;
|
|
|
|
mg_mgr_init(&mgr, NULL);
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
Function:
|
|
void APP_Tasks ( void )
|
|
|
|
Remarks:
|
|
See prototype in app.h.
|
|
*/
|
|
|
|
void APP_Tasks ( void )
|
|
{
|
|
SYS_STATUS tcpipStat;
|
|
const char *netName, *netBiosName;
|
|
static IPV4_ADDR dwLastIP[2] = { {-1}, {-1} };
|
|
IPV4_ADDR ipAddr;
|
|
TCPIP_NET_HANDLE netH;
|
|
int i, nNets;
|
|
|
|
/* Check the application's current state. */
|
|
switch ( appData.state )
|
|
{
|
|
/* Application's initial state. */
|
|
case APP_STATE_INIT:
|
|
{
|
|
tcpipStat = TCPIP_STACK_Status(sysObj.tcpip);
|
|
if(tcpipStat < 0)
|
|
{ // some error occurred
|
|
SYS_CONSOLE_MESSAGE(" APP: TCP/IP stack initialization failed!\r\n");
|
|
appData.state = APP_DONE;
|
|
}
|
|
else if(tcpipStat == SYS_STATUS_READY)
|
|
{
|
|
// now that the stack is ready we can check the
|
|
// available interfaces
|
|
nNets = TCPIP_STACK_NumberOfNetworksGet();
|
|
for(i = 0; i < nNets; i++)
|
|
{
|
|
|
|
netH = TCPIP_STACK_IndexToNet(i);
|
|
netName = TCPIP_STACK_NetNameGet(netH);
|
|
netBiosName = TCPIP_STACK_NetBIOSName(netH);
|
|
|
|
#if defined(TCPIP_STACK_USE_NBNS)
|
|
SYS_CONSOLE_PRINT(" Interface %s on host %s - NBNS enabled\r\n", netName, netBiosName);
|
|
#else
|
|
SYS_CONSOLE_PRINT(" Interface %s on host %s - NBNS disabled\r\n", netName, netBiosName);
|
|
#endif // defined(TCPIP_STACK_USE_NBNS)
|
|
|
|
}
|
|
appData.state = APP_TCPIP_WAIT_FOR_IP;
|
|
|
|
}
|
|
break;
|
|
}
|
|
case APP_TCPIP_WAIT_FOR_IP:
|
|
|
|
// if the IP address of an interface has changed
|
|
// display the new value on the system console
|
|
nNets = TCPIP_STACK_NumberOfNetworksGet();
|
|
|
|
for (i = 0; i < nNets; i++)
|
|
{
|
|
netH = TCPIP_STACK_IndexToNet(i);
|
|
ipAddr.Val = TCPIP_STACK_NetAddress(netH);
|
|
if(dwLastIP[i].Val != ipAddr.Val)
|
|
{
|
|
dwLastIP[i].Val = ipAddr.Val;
|
|
|
|
SYS_CONSOLE_MESSAGE(TCPIP_STACK_NetNameGet(netH));
|
|
SYS_CONSOLE_MESSAGE(" IP Address: ");
|
|
SYS_CONSOLE_PRINT("%d.%d.%d.%d \r\n", ipAddr.v[0], ipAddr.v[1], ipAddr.v[2], ipAddr.v[3]);
|
|
if (ipAddr.v[0] != 0 && ipAddr.v[0] != 169) // Wait for a Valid IP
|
|
{
|
|
appData.state = APP_START_LISTENING;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case APP_START_LISTENING:
|
|
{
|
|
SYS_CONSOLE_PRINT("Starting listening on port 8000\r\n");
|
|
struct mg_connection *nc = mg_bind(&mgr, "8000", ev_handler); // Create listening connection and add it to the event manager
|
|
if (nc == NULL) {
|
|
SYS_CONSOLE_PRINT("Failed to create listener\n\r");
|
|
appData.state = APP_DONE;
|
|
break;
|
|
}
|
|
mg_set_protocol_http_websocket(nc);
|
|
SYS_CONSOLE_PRINT("Listener started\r\n");
|
|
|
|
appData.state = APP_POLL;
|
|
break;
|
|
}
|
|
case APP_POLL:
|
|
{
|
|
mg_mgr_poll(&mgr, 1000);
|
|
break;
|
|
}
|
|
case APP_DONE:
|
|
{
|
|
SYS_CONSOLE_PRINT("Server stopped\n\r");
|
|
appData.state = APP_EMPTY;
|
|
break;
|
|
}
|
|
case APP_EMPTY:
|
|
{
|
|
break;
|
|
}
|
|
/* The default state should never be executed. */
|
|
default:
|
|
{
|
|
/* TODO: Handle error in application's state machine. */
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*******************************************************************************
|
|
End of File
|
|
*/
|
|
|