void sj_invoke_cb(struct v7* v7, v7_val_t func, v7_val_t this_obj, v7_val_t args) { #ifndef RTOS_SDK _sj_invoke_cb(v7, func, this_obj, args); #else rtos_dispatch_callback(v7, func, this_obj, args); #endif }
static void mg_lwip_task(os_event_t *e) { struct mg_mgr *mgr = NULL; DBG(("sig %d", e->sig)); poll_scheduled = 0; switch ((enum mg_sig_type) e->sig) { case MG_SIG_TOMBSTONE: break; case MG_SIG_POLL: { mgr = (struct mg_mgr *) e->par; break; } case MG_SIG_CONNECT_RESULT: { struct mg_connection *nc = (struct mg_connection *) e->par; mgr = nc->mgr; mg_if_connect_cb(nc, nc->err); break; } case MG_SIG_CLOSE_CONN: { struct mg_connection *nc = (struct mg_connection *) e->par; mgr = nc->mgr; nc->flags |= MG_F_CLOSE_IMMEDIATELY; mg_close_conn(nc); break; } case MG_SIG_SENT_CB: { struct mg_connection *nc = (struct mg_connection *) e->par; mgr = nc->mgr; mg_if_sent_cb(nc, nc->err); break; } case MG_SIG_V7_CALLBACK: { #ifndef NO_V7 struct v7_callback_args *cba = (struct v7_callback_args *) e->par; _sj_invoke_cb(cba->v7, cba->func, cba->this_obj, cba->args); v7_disown(cba->v7, &cba->func); v7_disown(cba->v7, &cba->this_obj); v7_disown(cba->v7, &cba->args); free(cba); #endif break; } } if (mgr != NULL) { mg_mgr_poll(mgr, 0); } }
static void disp_task(void *params) { struct rtos_event ev; while (1) { if (xQueueReceive(main_queue_handle, (void *) &ev, 500 / portTICK_RATE_MS)) { switch (ev.event_id) { case RTE_INIT: sjs_init(0); break; case RTE_UART_NEWCHAR: process_rx_buf(ev.params.uart_rx_params.tail); break; case RTE_CALLBACK: _sj_invoke_cb(ev.params.callback_params->v7, ev.params.callback_params->func, ev.params.callback_params->this_obj, ev.params.callback_params->args); v7_disown(ev.params.callback_params->v7, &ev.params.callback_params->func); v7_disown(ev.params.callback_params->v7, &ev.params.callback_params->this_obj); v7_disown(ev.params.callback_params->v7, &ev.params.callback_params->args); free(ev.params.callback_params); break; case RTE_GPIO_INTR_CALLBACK: ev.params.gpio_intr_callback_params.cb( ev.params.gpio_intr_callback_params.p1, ev.params.gpio_intr_callback_params.p2); break; default: printf("Unknown event_id: %d\n", ev.event_id); break; } } else { /* Put periodic event handlers here */ mongoose_poll(2); } } }
static void mg_lwip_task(os_event_t *e) { struct mg_mgr *mgr = NULL; poll_scheduled = 0; switch ((enum mg_sig_type) e->sig) { case MG_SIG_TOMBSTONE: break; case MG_SIG_POLL: { mgr = (struct mg_mgr *) e->par; break; } case MG_SIG_CONNECT_RESULT: { struct mg_connection *nc = (struct mg_connection *) e->par; struct mg_lwip_conn_state *cs = (struct mg_lwip_conn_state *) nc->sock; mgr = nc->mgr; mg_if_connect_cb(nc, cs->err); break; } case MG_SIG_CLOSE_CONN: { struct mg_connection *nc = (struct mg_connection *) e->par; mgr = nc->mgr; nc->flags |= MG_F_CLOSE_IMMEDIATELY; mg_close_conn(nc); break; } case MG_SIG_SENT_CB: { struct mg_connection *nc = (struct mg_connection *) e->par; struct mg_lwip_conn_state *cs = (struct mg_lwip_conn_state *) nc->sock; mgr = nc->mgr; if (cs->num_sent > 0) mg_if_sent_cb(nc, cs->num_sent); cs->num_sent = 0; break; } case MG_SIG_V7_CALLBACK: { #ifndef NO_V7 struct v7_callback_args *cba = (struct v7_callback_args *) e->par; _sj_invoke_cb(cba->v7, cba->func, cba->this_obj, cba->args); v7_disown(cba->v7, &cba->func); v7_disown(cba->v7, &cba->this_obj); v7_disown(cba->v7, &cba->args); free(cba); #endif break; } } if (mgr != NULL) { mg_mgr_poll(mgr, 0); if (s_suspended) { int can_suspend = 1; struct mg_connection *nc; /* Looking for data to send and if there isn't any - suspending */ for (nc = mgr->active_connections; nc != NULL; nc = nc->next) { if (nc->send_mbuf.len > 0) { can_suspend = 0; break; } } if (can_suspend) { os_timer_disarm(&s_poll_tmr); #if MG_LWIP_REXMIT_INTERVAL_MS > 0 os_timer_disarm(&s_rexmit_tmr); #endif } } } }
static void uart_int() { int c = UARTCharGet(CONSOLE_UART); struct prompt_event pe = {.type = PROMPT_CHAR_EVENT, .data = (void *) c}; osi_MsgQWrite(&s_v7_q, &pe, OSI_NO_WAIT); MAP_UARTIntClear(CONSOLE_UART, UART_INT_RX); } void sj_prompt_init_hal(struct v7 *v7) { (void) v7; } static void v7_task(void *arg) { struct v7 *v7 = s_v7; printf("\n\nSmart.JS for CC3200\n"); osi_MsgQCreate(&s_v7_q, "V7", sizeof(struct prompt_event), 32 /* len */); osi_InterruptRegister(CONSOLE_UART_INT, uart_int, INT_PRIORITY_LVL_1); MAP_UARTIntEnable(CONSOLE_UART, UART_INT_RX); sl_Start(NULL, NULL, NULL); v7 = s_v7 = init_v7(&v7); sj_init_timers(v7); sj_init_v7_ext(v7); init_wifi(v7); if (init_fs(v7) != 0) { fprintf(stderr, "FS initialization failed.\n"); } mongoose_init(); sj_init_http(v7); init_i2cjs(v7); /* Common config infrastructure. Mongoose & v7 must be initialized. */ init_device(v7); v7_val_t res; if (v7_exec_file(v7, "sys_init.js", &res) != V7_OK) { fprintf(stderr, "Error: "); v7_fprint(stderr, v7, res); } sj_prompt_init(v7); while (1) { struct prompt_event pe; mongoose_poll(MONGOOSE_POLL_LENGTH_MS); if (osi_MsgQRead(&s_v7_q, &pe, V7_POLL_LENGTH_MS) != OSI_OK) continue; switch (pe.type) { case PROMPT_CHAR_EVENT: { sj_prompt_process_char((char) ((int) pe.data)); break; } case V7_INVOKE_EVENT: { struct v7_invoke_event_data *ied = (struct v7_invoke_event_data *) pe.data; _sj_invoke_cb(v7, ied->func, ied->this_obj, ied->args); v7_disown(v7, &ied->args); v7_disown(v7, &ied->this_obj); v7_disown(v7, &ied->func); free(ied); break; } } } } /* Int vector table, defined in startup_gcc.c */ extern void (*const g_pfnVectors[])(void); void device_reboot(void) { sj_system_restart(); } int main() { MAP_IntVTableBaseSet((unsigned long) &g_pfnVectors[0]); MAP_IntEnable(FAULT_SYSTICK); MAP_IntMasterEnable(); PRCMCC3200MCUInit(); cc3200_leds_init(); /* Console UART init. */ MAP_PRCMPeripheralClkEnable(CONSOLE_UART_PERIPH, PRCM_RUN_MODE_CLK); MAP_PinTypeUART(PIN_55, PIN_MODE_3); /* PIN_55 -> UART0_TX */ MAP_PinTypeUART(PIN_57, PIN_MODE_3); /* PIN_57 -> UART0_RX */ MAP_UARTConfigSetExpClk( CONSOLE_UART, MAP_PRCMPeripheralClockGet(CONSOLE_UART_PERIPH), CONSOLE_BAUD_RATE, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); MAP_UARTFIFODisable(CONSOLE_UART); setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); VStartSimpleLinkSpawnTask(8); osi_TaskCreate(v7_task, (const signed char *) "v7", V7_STACK_SIZE + 256, NULL, 3, NULL); osi_TaskCreate(blinkenlights_task, (const signed char *) "blink", 256, NULL, 9, NULL); osi_start(); return 0; }
static void uart_int() { int c = UARTCharGet(CONSOLE_UART); struct prompt_event pe = {.type = PROMPT_CHAR_EVENT, .data = (void *) c}; osi_MsgQWrite(&s_v7_q, &pe, OSI_NO_WAIT); MAP_UARTIntClear(CONSOLE_UART, UART_INT_RX); } void sj_prompt_init_hal(struct v7 *v7) { (void) v7; } static void v7_task(void *arg) { struct v7 *v7 = s_v7; printf("\n\nSmart.JS for CC3200\n"); osi_MsgQCreate(&s_v7_q, "V7", sizeof(struct prompt_event), 32 /* len */); osi_InterruptRegister(CONSOLE_UART_INT, uart_int, INT_PRIORITY_LVL_1); MAP_UARTIntEnable(CONSOLE_UART, UART_INT_RX); sl_Start(NULL, NULL, NULL); v7 = s_v7 = init_v7(&v7); sj_timers_api_setup(v7); sj_v7_ext_api_setup(v7); sj_init_sys(v7); init_wifi(v7); if (init_fs(v7) != 0) { fprintf(stderr, "FS initialization failed.\n"); } mongoose_init(); sj_http_api_setup(v7); sj_i2c_api_setup(v7); /* Common config infrastructure. Mongoose & v7 must be initialized. */ init_device(v7); v7_val_t res; if (v7_exec_file(v7, "sys_init.js", &res) != V7_OK) { fprintf(stderr, "Error: "); v7_fprint(stderr, v7, res); } sj_prompt_init(v7); while (1) { struct prompt_event pe; mongoose_poll(MONGOOSE_POLL_LENGTH_MS); if (osi_MsgQRead(&s_v7_q, &pe, V7_POLL_LENGTH_MS) != OSI_OK) continue; switch (pe.type) { case PROMPT_CHAR_EVENT: { sj_prompt_process_char((char) ((int) pe.data)); break; } case V7_INVOKE_EVENT: { struct v7_invoke_event_data *ied = (struct v7_invoke_event_data *) pe.data; _sj_invoke_cb(v7, ied->func, ied->this_obj, ied->args); v7_disown(v7, &ied->args); v7_disown(v7, &ied->this_obj); v7_disown(v7, &ied->func); free(ied); break; } } } } /* Int vector table, defined in startup_gcc.c */ extern void (*const g_pfnVectors[])(void); void device_reboot(void) { sj_system_restart(0); }
void sj_invoke_cb(struct v7 *v7, v7_val_t func, v7_val_t this_obj, v7_val_t args) { _sj_invoke_cb(v7, func, this_obj, args); }