#include <kern/proc.h>
#include <kern/monitor.h>
+#include <struct/heap.h>
#include <net/http.h>
static struct ip_addr ipaddr, netmask, gw;
static struct netif netif;
+
+#define GET_LED_STATUS(status, led_id) (((status) & BV((led_id))) >> (led_id))
+#define CLEAR_LED_STATUS(status, led_id) ((status) &= ~BV((led_id)))
+#define SET_LED_STATUS(status, led_id) ((status) |= BV((led_id)))
+
typedef struct BoardStatus
{
char local_ip[sizeof("123.123.123.123")];
char last_connected_ip[sizeof("123.123.123.123")];
+ uint8_t led_status;
uint16_t internal_temp;
uint32_t up_time;
size_t tot_req;
static BoardStatus status;
static uint8_t raster[RAST_SIZE(LCD_WIDTH, LCD_HEIGHT)];
-static Bitmap lcd_bitmap;
+static Bitmap *lcd_bitmap;
extern Font font_gohu;
static int lcd_brightness = LCD_BACKLIGHT_MAX;
+static struct Heap heap;
static void init(void)
/* Enable the adc to read internal temperature sensor */
hw_enableTempRead();
-
LED_INIT();
+ heap_init(&heap, (void *)SDRAM_BASE, SDRAM_SIZE);
+ lcd_bitmap = heap_allocmem(&heap, RAST_SIZE(LCD_WIDTH, LCD_HEIGHT));
+ if (lcd_bitmap)
+ kprintf("Allocated memory for display raster, addr 0x%x\n", (unsigned)lcd_bitmap);
+ else
+ {
+ kprintf("Error allocating memory for LCD raster!\n");
+ }
+
lcd_hx8347_init();
lcd_setBacklight(lcd_brightness);
- gfx_bitmapInit(&lcd_bitmap, raster, LCD_WIDTH, LCD_HEIGHT);
- gfx_setFont(&lcd_bitmap, &font_luBS14);
-
- lcd_hx8347_blitBitmap(&lcd_bitmap);
- lcd_hx8347_blitBitmap24(10, 52, BMP_LOGO_WIDTH, BMP_LOGO_HEIGHT, bmp_logo);
- timer_delay(3000);
-
- text_xprintf(&lcd_bitmap, 1, 0, TEXT_CENTER, "Brightness: %d", lcd_brightness);
- lcd_hx8347_blitBitmap(&lcd_bitmap);
+ gfx_bitmapInit(lcd_bitmap, raster, LCD_WIDTH, LCD_HEIGHT);
+ gfx_setFont(lcd_bitmap, &font_luBS14);
+ lcd_hx8347_blitBitmap(lcd_bitmap);
/* Initialize TCP/IP stack */
tcpip_init(NULL, NULL);
netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ethernetif_init, tcpip_input);
netif_set_default(&netif);
netif_set_up(&netif);
+}
+static void sec_to_hms(uint32_t sec_time, uint32_t *h, uint32_t *m, uint32_t *s)
+{
+ *m = sec_time / 60;
+ *h = (*m) / 60;
+ *s = sec_time - ((*m) * 60) - ((*h) * 3600);
}
static NORETURN void proc_displayRefresh(void)
{
while (1)
{
-
//LOG_INFO("Refresh display\n");
+ uint32_t m;
+ uint32_t h;
+ uint32_t s;
status.internal_temp = hw_convertToDegree(adc_read(ADC_TEMPERATURE_CH));
- status.up_time++;
+ status.up_time += 5;
+ sec_to_hms(status.up_time, &h, &m, &s);
+
+ text_xprintf(lcd_bitmap, 11, 0, TEXT_FILL, " ");
+ text_xprintf(lcd_bitmap, 11, 0, 0, "Board ip: %s", status.local_ip);
+
+ text_xprintf(lcd_bitmap, 12, 0, TEXT_FILL, " ");
+ text_xprintf(lcd_bitmap, 12, 0, 0, "Last connected ip: %s", status.last_connected_ip);
+
+ text_xprintf(lcd_bitmap, 13, 0, TEXT_FILL, " ");
+ text_xprintf(lcd_bitmap, 13, 0, 0, "Temperature: %d.%dC", status.internal_temp / 10, status.internal_temp % 10);
- timer_delay(1000);
+ text_xprintf(lcd_bitmap, 14, 0, TEXT_FILL, " ");
+ text_xprintf(lcd_bitmap, 14, 0, 0, "Up time: %ldh %ldm %lds", h, m, s);
+
+ lcd_hx8347_blitBitmap(lcd_bitmap);
+ lcd_hx8347_blitBitmap24(10, 0, BMP_LOGO_WIDTH, BMP_LOGO_HEIGHT, bmp_logo);
+
+ timer_delay(5000);
}
}
//Update board status.
sprintf(status.last_connected_ip, "%d.%d.%d.%d", IP_ADDR_TO_INT_TUPLE(client->pcb.ip->remote_ip.addr));
sprintf(status.local_ip, "%d.%d.%d.%d", IP_ADDR_TO_INT_TUPLE(client->pcb.ip->local_ip.addr));
- sprintf((char *)tx_buf, "{ \"local_ip\":\"%s\", \"last_connected_ip\":\"%s\", \
- \"temp\":%d.%d, \
- \"volt\":%d.%d, \
- \"up_time\":%ld, \"tot_req\":%d }",
+
+ sprintf((char *)tx_buf, "{ \"local_ip\":\"%s\",\"last_connected_ip\":\"%s\", \"temp\":%d.%d,\"volt\":%d.%d,\"up_time\":%ld,\"tot_req\":%d, \
+\"leds\":{ \"0\":\"%d\", \"1\":\"%d\", \"2\":\"%d\"}}",
status.local_ip, status.last_connected_ip,
status.internal_temp / 10, status.internal_temp % 10,
volt / 1000, volt % 1000,
- status.up_time, status.tot_req);
-
+ status.up_time, status.tot_req,
+ GET_LED_STATUS(status.led_status, 0),
+ GET_LED_STATUS(status.led_status, 1),
+ GET_LED_STATUS(status.led_status, 2));
-
- http_sendOk(client);
+ http_sendOk(client, HTTP_CONTENT_JSON);
netconn_write(client, tx_buf, strlen((char *)tx_buf), NETCONN_COPY);
return 0;
}
(void)recv_len;
(void)name;
- http_sendOk(client);
+ http_sendOk(client, HTTP_CONTENT_JPEG);
netconn_write(client, bertos_logo_jpg, bertos_logo_jpg_len, NETCONN_NOCOPY);
return 0;
}
sprintf((char *)tx_buf, "[%d.%d]", status.internal_temp / 10, status.internal_temp % 10);
- http_sendOk(client);
+ http_sendOk(client, HTTP_CONTENT_JSON);
netconn_write(client, tx_buf, strlen((char *)tx_buf), NETCONN_COPY);
return 0;
}
(void)recv_len;
(void)name;
-
-
- uint32_t m = status.up_time / 60;
- uint32_t h = m / 60;
- uint32_t s = status.up_time - (m * 60) - (h * 3600);
+ uint32_t m;
+ uint32_t h;
+ uint32_t s;
+ sec_to_hms(status.up_time, &h, &m, &s);
sprintf((char *)tx_buf, "[\"%ldh %ldm %lds\"]", h, m, s);
- http_sendOk(client);
+ http_sendOk(client, HTTP_CONTENT_JSON);
netconn_write(client, tx_buf, strlen((char *)tx_buf), NETCONN_COPY);
return 0;
}
kprintf("volt %d\n", volt);
sprintf((char *)tx_buf, "[ \"%d.%dV\" ]", volt / 1000, volt % 1000);
- http_sendOk(client);
+ http_sendOk(client, HTTP_CONTENT_JSON);
netconn_write(client, tx_buf, strlen((char *)tx_buf), NETCONN_COPY);
return 0;
}
if (led_cmd)
{
LED_ON(led_id);
+ SET_LED_STATUS(status.led_status, led_id);
}
else
{
LED_OFF(led_id);
+ CLEAR_LED_STATUS(status.led_status, led_id);
}
sprintf((char *)tx_buf, "{\"n\":%d, \"set\":,%d}", led_id, led_cmd);
- http_sendOk(client);
+ http_sendOk(client, HTTP_CONTENT_JSON);
netconn_write(client, tx_buf, strlen((char *)tx_buf), NETCONN_COPY);
return 0;
error:
- http_sendInternalErr(client);
+ http_sendInternalErr(client, HTTP_CONTENT_JSON);
+ return 0;
+}
+
+static int cgi_ledStatus(struct netconn *client, const char *name, char *recv_buf, size_t recv_len)
+{
+ (void)recv_buf;
+ (void)recv_len;
+ (void)name;
+
+ sprintf((char *)tx_buf, "{ \"0\":\"%d\", \"1\":\"%d\", \"2\":\"%d\"}",
+ GET_LED_STATUS(status.led_status, 0),
+ GET_LED_STATUS(status.led_status, 1),
+ GET_LED_STATUS(status.led_status, 2));
+
+ http_sendOk(client, HTTP_CONTENT_JSON);
+ netconn_write(client, tx_buf, strlen((char *)tx_buf), NETCONN_COPY);
+ return 0;
+}
+
+
+#define CGI_MSG_CMD_KEY "msg"
+
+static int cgi_displayMsg(struct netconn *client, const char *name, char *recv_buf, size_t recv_len)
+{
+ (void)recv_buf;
+ (void)recv_len;
+ (void)name;
+
+ char *query_str = strstr(name, "?") + 1;
+ size_t query_str_len = strlen(query_str);
+
+ int len = http_tokenizeGetRequest(query_str, query_str_len);
+
+ LOG_INFO("Found %d key/value pair\n", len);
+
+ if (http_getValue(query_str, query_str_len, CGI_MSG_CMD_KEY, key_value, sizeof(key_value)) < 0)
+ {
+ LOG_ERR("key %s, not found\n", CGI_MSG_CMD_KEY);
+ goto error;
+ }
+
+ LOG_INFO("Found key %s = %s\n", CGI_MSG_CMD_KEY, key_value);
+
+ text_xprintf(lcd_bitmap, 10, 0, TEXT_FILL, " ");
+ text_xprintf(lcd_bitmap, 10, 0, TEXT_CENTER, "%s", key_value);
+
+ http_sendOk(client, HTTP_CONTENT_JSON);
+ return 0;
+
+error:
+ http_sendInternalErr(client, HTTP_CONTENT_JSON);
return 0;
}
{
(void)name;
- http_sendOk(client);
+ http_sendOk(client, HTTP_CONTENT_PLAIN);
netconn_write(client, recv_buf, recv_len, NETCONN_COPY);
return 0;
}
+/*
+ * Return to client a string that display the CHIP ID information.
+ * See datasheet for more detail.
+ */
+static int cgi_chipInfo(struct netconn *client, const char *name, char *recv_buf, size_t recv_len)
+{
+ (void)recv_buf;
+ (void)recv_len;
+ (void)name;
+
+ sprintf((char *)tx_buf, "{ \"core_name\":\"%s\", \"arch_name\":\"%s\", \"sram_size\":\"%s\",\"flash_size\":\"%s\", \"mem_boot_type\":\"%s\" }",
+ chipid_eproc_name(CHIPID_EPRCOC()),
+ chipid_archnames(CHIPID_ARCH()),
+ chipid_sramsize(CHIPID_SRAMSIZ()),
+ chipid_nvpsize(CHIPID_NVPSIZ()),
+ chipid_nvptype(CHIPID_NVTYP()));
+
+ http_sendOk(client, HTTP_CONTENT_JSON);
+ netconn_write(client, tx_buf, strlen((char *)tx_buf), NETCONN_COPY);
+
+ return 0;
+}
+
+
+static int cgi_error(struct netconn *client, const char *name, char *recv_buf, size_t recv_len)
+{
+ (void)client;
+ (void)name;
+ (void)recv_buf;
+ (void)recv_len;
+
+ return -1;
+}
/*
{
LOG_INFO("Opened file '%s' size %ld\n", name, in_file.fat_file.fsize);
- //http_sendOk(client);
+ int type = http_searchContentType(name);
+ http_sendOk(client, type);
while (count < in_file.fat_file.fsize)
{
else
{
LOG_ERR("Unable to open file: '%s' error[%d]\n", name, result);
- http_sendFileNotFound(client);
+ http_sendFileNotFound(client, HTTP_CONTENT_HTML);
netconn_write(client, http_file_not_found, http_file_not_found_len - 1, NETCONN_NOCOPY);
}
}
}
else
{
- http_sendFileNotFound(client);
+ http_sendFileNotFound(client, HTTP_CONTENT_HTML);
netconn_write(client, http_sd_not_present, http_sd_not_present_len, NETCONN_NOCOPY);
}
return 0;
}
-/*
- * Return to client a string that display the CHIP ID information.
- * See datasheet for more detail.
- */
-static int cgi_chipInfo(struct netconn *client, const char *name, char *recv_buf, size_t recv_len)
-{
- (void)recv_buf;
- (void)recv_len;
- (void)name;
-
- sprintf((char *)tx_buf, "{ \"core_name\":\"%s\", \"arch_name\":\"%s\", \"sram_size\":\"%s\",\
- \"flash_size\":\"%s\", \"mem_boot_type\":\"%s\" }",
- chipid_eproc_name(CHIPID_EPRCOC()),
- chipid_archnames(CHIPID_ARCH()),
- chipid_sramsize(CHIPID_SRAMSIZ()),
- chipid_nvpsize(CHIPID_NVPSIZ()),
- chipid_nvptype(CHIPID_NVTYP()));
-
- http_sendOk(client);
- netconn_write(client, tx_buf, strlen((char *)tx_buf), NETCONN_COPY);
-
- return 0;
-}
-
-
-static int cgi_error(struct netconn *client, const char *name, char *recv_buf, size_t recv_len)
-{
- (void)client;
- (void)name;
- (void)recv_buf;
- (void)recv_len;
-
- return -1;
-}
/*
* Static cgi table where we associate callback to page.
*/
static HttpCGI cgi_table[] =
{
- { CGI_MATCH_WORD, "echo", cgi_echo },
+ { CGI_MATCH_NAME, "echo", cgi_echo },
{ CGI_MATCH_NAME, "get_temperature", cgi_temp },
{ CGI_MATCH_NAME, "get_uptime", cgi_uptime },
{ CGI_MATCH_NAME, "get_resistor", cgi_resistor },
{ CGI_MATCH_NAME, "set_led", cgi_led },
+ { CGI_MATCH_NAME, "get_ledStatus", cgi_ledStatus },
{ CGI_MATCH_NAME, "error", cgi_error },
- { CGI_MATCH_WORD, "status", cgi_status },
+ { CGI_MATCH_NAME, "status", cgi_status },
{ CGI_MATCH_NAME, "get_chipinfo", cgi_chipInfo },
+ { CGI_MATCH_NAME, "display", cgi_displayMsg },
{ CGI_MATCH_NAME, "bertos_logo_jpg", cgi_logo },
{ CGI_MATCH_NONE, NULL, NULL }
};
dhcp_start(&netif);
while (!netif.ip_addr.addr)
timer_delay(DHCP_FINE_TIMER_MSECS);
- kprintf("dhcp ok: ip = %d.%d.%d.%d\n", IP_ADDR_TO_INT_TUPLE(netif.ip_addr.addr));
+
+ sprintf(status.local_ip, "%d.%d.%d.%d", IP_ADDR_TO_INT_TUPLE(netif.ip_addr.addr));
+ sprintf(status.last_connected_ip, "%d.%d.%d.%d", IP_ADDR_TO_INT_TUPLE(0));
+ kprintf("dhcp ok: ip = %s", status.local_ip);
+
+ text_xprintf(lcd_bitmap, 12, 0, 0, "Board ip: %s", status.local_ip);
+
+ lcd_hx8347_blitBitmap(lcd_bitmap);
+ lcd_hx8347_blitBitmap24(12, 0, BMP_LOGO_WIDTH, BMP_LOGO_HEIGHT, bmp_logo);
server = netconn_new(NETCONN_TCP);
netconn_bind(server, IP_ADDR_ANY, 80);