void playGame(void) { int len; struct packet p; lcdPrintln("Now playing:"); lcdPrintln(gameTitle); lcdRefresh(); while(1){ uint8_t button = getInputRaw(); sendButton(button); while(1){ if( flags & FLAGS_LONG_RECV ) len = nrf_rcv_pkt_time(64,sizeof(p),(uint8_t*)&p); else len = nrf_rcv_pkt_time(32,sizeof(p),(uint8_t*)&p); if(len==sizeof(p)){ processPacket(&p); }else{ break; } } int rnd = getRandom() % jitter; delayms(interval*5+rnd); volatile uint16_t i; i = getRandom()&0xfff; while(i--); }; }
void playGame(void) { int len; struct packet p; while(1){ uint8_t button = getInputRaw(); sendButton(button); while(1){ if( flags & FLAGS_LONG_RECV ) len = nrf_rcv_pkt_time(64,sizeof(p),(uint8_t*)&p); else len = nrf_rcv_pkt_time(32,sizeof(p),(uint8_t*)&p); if(len==sizeof(p)){ processPacket(&p); }else{ break; } } int rnd = getRandom() % jitter; delayms(interval+rnd); }; }
void ram(void) { struct NRF_CFG config; uint8_t buf[16]; // Space to save signal strength and username. uint8_t count = 0; char usernames[8][16]; uint8_t strength[8]; config.nrmacs=1; config.maclen[0] = 16; config.channel = 81; memcpy(config.mac0, "\x01\x02\x03\x02\x01", 5); nrf_config_set(&config); lcdClear(); lcdPrintln("Track it:"); lcdPrintln("---------"); lcdRefresh(); do{ if( nrf_rcv_pkt_time(64,sizeof(buf),buf) == 16 ){ buf[14] = 0; // TODO: allow last package parameter 0x25 if( buf[1] == 0x23 || buf[1] == 0x24){ if(0==insertUser(usernames, strength, (char *)buf+6, buf[3], count)) { if(count<8) ++count; printNames(usernames, strength, count); } } } }while ((getInputRaw())==BTN_NONE); }
uint8_t selectGame() { int len, i, selected; struct packet p; int a = 0; config.channel = ANNOUNCE_CHANNEL; memcpy(config.mac0, ANNOUNCE_MAC, 5); nrf_config_set(&config); gamecount = 0; for(i=0;i<60;i++){ len= nrf_rcv_pkt_time(30, sizeof(p), (uint8_t*)&p); if (len==sizeof(p)){ if( a ) a = 0; else a = 1; gpioSetValue (RB_LED2, a); processPacket(&p); } } selected = 0; while(1){ showGames(selected); int key=getInputWait(); getInputWaitRelease(); switch(key){ case BTN_DOWN: if( selected < gamecount-1 ){ selected++; } break; case BTN_UP: if( selected > 0 ){ selected--; } break; case BTN_LEFT: return 0; case BTN_ENTER: case BTN_RIGHT: if( gamecount == 0 ) return 0; gameId = games[selected].gameId; memcpy(config.txmac, games[selected].gameMac, 5); memcpy(config.mac0, games[selected].gameMac, 5); config.mac0[4]++; config.channel = games[selected].gameChannel; interval = games[selected].interval; jitter = games[selected].jitter; flags = games[selected].gameFlags; nrf_config_set(&config); if( games[selected].gameFlags & FLAGS_MASS_GAME ) return 1; else return joinGame(); } } }
uint8_t joinGame() { int i; struct packet p; struct packet ack; memset((void*)&p, 0, sizeof(p)); memset((void*)&ack, 0, sizeof(ack)); p.len=sizeof(p); p.protocol='G'; p.command='J'; p.id= id; p.ctr= ++ctr; p.c.join.gameId=gameId; lcdPrintln("Joining game"); lcdRefresh(); for(i=0; i<10; i++){ nrf_snd_pkt_crc(sizeof(p),(uint8_t*)&p); int len = nrf_rcv_pkt_time(30,sizeof(ack),(uint8_t*)&ack); if( len==sizeof(ack) ){ if( (ack.len==32) && (ack.protocol=='G') && ack.command=='a' ){ //check sanity, protocol if( ack.id == id && ack.ctr == ctr ){ if( ack.c.ack.flags & FLAGS_ACK_JOINOK ){ lcdPrintln("Join OK"); lcdRefresh(); return 1; }else{ lcdPrintln("Join rejected"); lcdRefresh(); getInputWait(); getInputWaitRelease(); return 0; } } } } delayms(70); } lcdPrintln("timeout :("); lcdRefresh(); getInputWait(); getInputWaitRelease(); return 0; }
void ram(void) { struct NRF_CFG config; uint8_t buf[16]; config.nrmacs=1; config.maclen[0] = 16; config.channel = 81; memcpy(config.mac0, "\x01\x02\x03\x02\x01", 5); nrf_config_set(&config); lcdClear(); lcdPrintln("People nearby:"); //lcdPrint("nearby:"); lcdRefresh(); do{ if( nrf_rcv_pkt_time(64,sizeof(buf),buf) == 16 ){ buf[14] = 0; if( buf[1] == 0x23 || buf[1] == 0x24){ lcdPrintln((char*)(buf+6)); //lcdPrintln("foo"); } lcdRefresh(); } }while ((getInputRaw())==BTN_NONE); }
void main(void){ started = 0; receive = 1; next_move = DIR_STAY; mode = MODE_INIT; player_joined = 0; lcdClear(); lcdPrintln("Up: server"); lcdPrintln("Down: client"); lcdPrintln("Enter: exit"); lcdRefresh(); int8_t priv = GLOBAL(privacy); GLOBAL(privacy) = 3; uint8_t btn; uint8_t cycles_wait; cycles_wait = 0; struct packet announce; do{ btn = getInputRaw(); if(mode == MODE_INIT){ if(btn == BTN_UP){ startServer(); } else { if(btn == BTN_DOWN){ startClient(); } } } if(!started){ if(mode == MODE_SERVER && !player_joined){ memset((void*)&announce, 0, sizeof(announce)); announce.gameid = gameid; announce.type = PKT_ANNOUNCE; memcpy(announce.c.announce.nick, GLOBAL(nickname), 16); announce.seq = 0; nrf_snd_pkt_crc(sizeof(announce), (uint8_t *)&announce); struct packet p; if(nrf_rcv_pkt_time(1000, sizeof(p), (uint8_t *)&p) == sizeof(p)){ handle_packet(&p); } } else if (mode == MODE_CLIENT){ struct packet p; if(nrf_rcv_pkt_time(100, sizeof(p), (uint8_t *)&p) == sizeof(p)){ handle_packet(&p); } } } else { if(receive){ struct packet p; if(nrf_rcv_pkt_time(50, sizeof(p), (uint8_t *)&p) == sizeof(p)){ cycles_wait = 0; handle_packet(&p); } else { cycles_wait++; } if(cycles_wait >= 3){ nrf_snd_pkt_crc(sizeof(latest_packet), (uint8_t *)&latest_packet); cycles_wait = 0; } } else { delayms(50); } next_move = btn; } }while(btn != BTN_ENTER); struct packet p; p.type = PKT_EXIT; for(uint8_t i = 0; i < 3; i++){ delayms(50); nrf_snd_pkt_crc(sizeof(p), (uint8_t *)&p); } GLOBAL(privacy) = priv; }
/*Message Receiver*/ void waitMsg() { uint8_t key; unsigned char buf[32]; char sender_nick[10]; int n,i; int index=0; int rcv =0; int try=0; do { key = getInput(); if(1) { nrf_config_set(&config); n = nrf_rcv_pkt_time(100,32,buf); getInputWaitTimeout(100); if(n == 32) { index=buf[0]; for(i=0; i<10; i++) sender_nick[i]=buf[i+1]; lcdClear(); lcdPrintln(""); lcdPrintln("CCC MSN 0.1b"); lcdPrintln("---------------"); lcdPrintln(msgs[index]); lcdPrintln(""); lcdPrintln("Received"); lcdPrintln(""); lcdPrintln("_______________"); lcdPrintln(sender_nick); lcdRefresh(); blink(); rcv=1; try=0; } else if(rcv) { lcdClear(); lcdPrintln(""); lcdPrintln("CCC MSN 0.1b"); lcdPrintln("-----------------"); lcdPrintln("Waiting..."); lcdPrint("Try "); lcdPrintln(IntToStr(try,5,0)); lcdPrintln(""); lcdPrintln(msgs[index]); lcdPrintln("_______________"); lcdPrintln(sender_nick); lcdRefresh(); } try++; } if(!rcv) { lcdClear(); lcdPrintln(""); lcdPrintln("CCC MSN 0.1b"); lcdPrintln("-----------------"); lcdPrintln("Waiting..."); lcdPrintln(""); lcdPrint("Try "); lcdPrintln(IntToStr(try,5,0)); lcdPrintln(""); lcdPrintln("_______________"); lcdPrintln("W8 Users Auto"); lcdRefresh(); }