예제 #1
0
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;
}
예제 #2
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;
}
예제 #3
0
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;
}