int main(int argc, char **argv) { for(int i=1; i<argc; ++i) { if(std::string(argv[i])=="-s" || std::string(argv[i])=="--skin") { if(i+1<argc) Game::spritemod=argv[++i]; else error("no skin specified"); } else if(std::string(argv[i])=="-h" || std::string(argv[i])=="--help") { std::cout<< "Free Pokémon client version 1.0.0\n" "An open source game engine licensed under GPLv3.\n" "Basis by Robin Stjerndorff,\nwork in progress by Jerry Liu.\n\n" "short\tlong\t\taction\n" "-f\t--fullscreen\tenable fullscreen\n" "-h\t--help\t\toutput this information\n" "-s\t--skin\t\tselect a skin folder\n" "-z\t--zoom\t\tzoom the window (2 to 8)"<<std::endl; exit(0); } else if(std::string(argv[i])=="-z" || std::string(argv[i])=="--zoom") { if(i+1<argc) { int value=convert<int>(argv[++i]); if(value<2) error("too small zoom value"); if(value>8) error("too big zoom value"); Video::scale=value; } else error("no zoom value given"); } else if(std::string(argv[i])=="-f" || std::string(argv[i])=="--fullscreen") { Video::fullscreen=true; } else { warning("unknown argv \""+std::string(argv[i])+"\" has no effect"); } } atexit(master_kill); master_init(); while(Game::run) { master_update(); } return 0; }
uint32_t ble_bondmngr_bonded_masters_store(void) { uint32_t err_code; int i; if (!m_is_bondmngr_initialized) { return NRF_ERROR_INVALID_STATE; } if (m_master.bond.master_handle != INVALID_MASTER_HANDLE) { // Fetch System Attributes from stack. uint16_t sys_attr_size = SYS_ATTR_BUFFER_MAX_LEN; err_code = sd_ble_gatts_sys_attr_get(m_conn_handle, m_master.sys_attr.sys_attr, &sys_attr_size); if (err_code != NRF_SUCCESS) { return err_code; } m_master.sys_attr.master_handle = m_master.bond.master_handle; m_master.sys_attr.sys_attr_size = (uint16_t)sys_attr_size; // Update current master err_code = master_update(); if (err_code != NRF_SUCCESS) { return err_code; } } // Save Bonding Information if changed if (bond_info_changed()) { // Erase flash page err_code = ble_flash_page_erase(m_bondmngr_config.flash_page_num_bond); if (err_code != NRF_SUCCESS) { return err_code; } // Store bond information for all masters m_bond_info_in_flash_count = 0; for (i = 0; i < m_masters_in_db_count; i++) { err_code = bond_info_store(&m_masters_db[i].bond); if (err_code != NRF_SUCCESS) { return err_code; } } } // Save System Attributes, if changed if (sys_attr_changed()) { // Erase flash page err_code = ble_flash_page_erase(m_bondmngr_config.flash_page_num_sys_attr); if (err_code != NRF_SUCCESS) { return err_code; } // Store System Attributes for all masters m_sys_attr_in_flash_count = 0; for (i = 0; i < m_masters_in_db_count; i++) { err_code = sys_attr_store(&m_masters_db[i].sys_attr); if (err_code != NRF_SUCCESS) { return err_code; } } } m_conn_handle = BLE_CONN_HANDLE_INVALID; m_master.bond.master_handle = INVALID_MASTER_HANDLE; m_master.sys_attr.master_handle = INVALID_MASTER_HANDLE; m_master.sys_attr.sys_attr_size = 0; return NRF_SUCCESS; }
int ICACHE_FLASH_ATTR cgiApi(HttpdConnData *connData) { struct ApiData *api = (struct ApiData *)connData->cgiPrivData; int nbytes, status; char type; if (connData->conn == NULL) { goto done; } if (connData->requestType != HTTPD_METHOD_POST) { httpdStartResponse(connData, 501); httpdHeader(connData, "Content-Type", "text/html"); httpdEndHeaders(connData); return HTTPD_CGI_DONE; } if (connData->post->received <= MAX_POST) { api = malloc(sizeof(struct ApiData)); jsonparse_setup(&api->state, api->buff, MAX_POST); api->buffLen = 0; api->depth = 0; api->status = API_OK; connData->cgiPrivData = api; } if (api->status < API_OK) { goto finish; } while (true) { nbytes = API_MAX_BUFF - api->buffLen - 1; nbytes = connData->post->buffLen < nbytes ? connData->post->buffLen : nbytes; memcpy(&api->buff[api->buffLen], connData->post->buff, nbytes); api->buffLen += nbytes; memmove(connData->post->buff, &connData->post->buff[nbytes], connData->post->buffLen - nbytes); connData->post->buffLen -= nbytes; if (connData->post->buffLen == 0) { if (connData->post->received < connData->post->len) { return HTTPD_CGI_MORE; } break; } while (api->state.pos < API_MIN_CHUNK) { type = jsonparse_next(&api->state); if (type == ',') { /* do nothing */ } else if (type == '[') { api->depth = api->state.depth; } else { api->status = API_ERROR_PARSE; goto finish; } if ((status = api_parse(&api->state)) != API_OK) { api->status = status; if (status < API_OK) { goto finish; } } while (api->state.depth > api->depth) { if (!jsonparse_next(&api->state)) { api->status = API_ERROR_PARSE; goto finish; } } } memmove(api->buff, &api->buff[api->state.pos], api->buffLen - api->state.pos); api->buffLen -= api->state.pos; api->state.pos = 0; } api->buff[api->buffLen] = '\0'; api->state.len = api->buffLen; while (true) { type = jsonparse_next(&api->state); if (type == ',') { /* do nothing */ } else if (type == '[') { api->depth = api->state.depth; } else { if (api->state.error != JSON_ERROR_OK) { api->status = API_ERROR_PARSE; } goto finish; } if ((status = api_parse(&api->state)) != API_OK) { api->status = status; if (status < API_OK) { goto finish; } } while (api->state.depth > api->depth) { if (!jsonparse_next(&api->state)) { api->status = API_ERROR_PARSE; goto finish; } } } finish: if (connData->post->received < connData->post->len) { return HTTPD_CGI_MORE; } if (api->status < API_OK) { httpdStartResponse(connData, 500); httpdHeader(connData, "Content-Type", "text/html"); httpdEndHeaders(connData); goto done; } httpdStartResponse(connData, 200); httpdHeader(connData, "Content-Type", "application/json"); httpdEndHeaders(connData); httpdSend(connData, api->status == API_OK ? "true" : "false", -1); if (api_update) { api_update = false; master_update(true); } if (status_dirty) { status_save(); } done: free(api); connData->cgiPrivData = NULL; return HTTPD_CGI_DONE; }