void wifi_init() { REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR; /* * Our half of the ARM7 Wifi handshaking: * Send it a pointer to the shared memory area for Wifi. */ REG_IPC_FIFO_TX = IPC_MSG_WIFI_INIT; REG_IPC_FIFO_TX = Wifi_Init(WIFIINIT_OPTION_USELED); /* Disable TIMER3 before setting up its IRQ handler */ TIMER3_CR = 0; irqInit(); irqSet(IRQ_VBLANK, vblank_irq_handler); irqEnable(IRQ_VBLANK); irqSet(IRQ_TIMER3, wifi_timer_handler); irqEnable(IRQ_TIMER3); irqSet(IRQ_FIFO_NOT_EMPTY, fifo_irq_handler); irqEnable(IRQ_FIFO_NOT_EMPTY); REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ; Wifi_SetSyncHandler(wifi_sync_handler); /* Program TIMER3 for 50ms intervals */ TIMER3_DATA = TIMER_FREQ_256(1000 / WIFI_TIMER_MS); TIMER3_CR = TIMER_DIV_256 | TIMER_IRQ_REQ; /* Poll for the ARM7 init to finish */ while (!Wifi_CheckInit()) { swiWaitForVBlank(); } }
void arm9_wifiInit() { // send fifo message to initialize the arm7 wifi REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR; // enable & clear FIFO u32 Wifi_pass= Wifi_Init(WIFIINIT_OPTION_USELED); REG_IPC_FIFO_TX=0x12345678; REG_IPC_FIFO_TX=Wifi_pass; *((volatile u16 *)0x0400010E) = 0; // disable timer3 irqSet(IRQ_TIMER3, arm9_wifiTimer); // setup timer IRQ irqEnable(IRQ_TIMER3); irqSet(IRQ_FIFO_NOT_EMPTY, arm9_fifo); // setup fifo IRQ irqEnable(IRQ_FIFO_NOT_EMPTY); REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ; // enable FIFO IRQ Wifi_SetSyncHandler(arm9_synctoarm7); // tell wifi lib to use our handler to notify arm7 // set timer3 *((volatile u16 *)0x0400010C) = -(131062*WifiTimerInterval_ms/1000); // 131062 * 256 cycles = ~1000ms; *((volatile u16 *)0x0400010E) = 0x00C2; // enable, irq, 1/256 clock while(Wifi_CheckInit()==0) { // wait for arm7 to be initted successfully WaitVbl(); // wait for vblank } // wifi init complete - wifi lib can now be used! }
void wifiInit() { REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR; u32 Wifi_pass = Wifi_Init(WIFIINIT_OPTION_USELED); REG_IPC_FIFO_TX = 0x12345678; REG_IPC_FIFO_TX = Wifi_pass; *((volatile u16 *)0x0400010E) = 0; irqSet(IRQ_TIMER3, T50); irqEnable(IRQ_TIMER3); irqSet(IRQ_FIFO_NOT_EMPTY, ARM9FIFO); irqEnable(IRQ_FIFO_NOT_EMPTY); REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ; Wifi_SetSyncHandler(ARMSYNC); *((volatile u16 *)0x0400010C) = -6553; *((volatile u16 *)0x0400010E) = 0x00C2; while(!Wifi_CheckInit()) swiWaitForVBlank(); }
int main(void) { aplist *head = NULL; aplist *cur; bool attached = true; // change this to false if you are only testing servos bool wifi_scan = true; // change this for emulator bool emulate = false; float pain = 0.9f; time_t update = 0; uint8 num; uint8 servo_pos = 0; uint8 current_servo = 1; unsigned char SERVO_PINS[3] = { SERVO_PIN1 ,SERVO_PIN2 ,SERVO_PIN3 } ; uint16 val[3] = { 0 }; uint8 i; touchPosition touch; videoSetMode(MODE_4_2D); vramSetBankA(VRAM_A_MAIN_BG); // set up our bitmap background bgInit(3, BgType_Bmp16, BgSize_B16_256x256, 0,0); decompress(cclogoBitmap, BG_GFX, LZ77Vram); // initialise lower screen for textoutput consoleDemoInit(); if (emulate == false) { iprintf("Initializing WiFi.. "); Wifi_InitDefault(false); while (Wifi_CheckInit() != 1) { } Wifi_ScanMode(); iprintf("done\n"); iprintf("Initializing DS brut.. "); uart_init(); uart_set_spi_rate(1000); iprintf("done\n\n\n"); iprintf("Using servo pins: %u %u %u\n\n", SERVO_PIN1, SERVO_PIN2, SERVO_PIN3); iprintf("Default pain multiplier: %.2f\n\n", pain); swiDelay(60000000); while (1) { scanKeys(); touchRead(&touch); if (keysDown() & KEY_X) { if (attached) { servo_detach(SERVO_PIN1); servo_detach(SERVO_PIN2); servo_detach(SERVO_PIN3); attached = false; } else { attached = true; } } if (keysDown() & KEY_A) { if (attached) { uint8 i = 0; for (i=0;i<3;i++) { servo_set(SERVO_PINS[i],0); } } //servo_set(SERVO_PIN1, 180-((rand() % 100)+(rand() % 50)+(rand() % 25))); //servo_set(SERVO_PIN2, 180-((rand() % 100)+(rand() % 50)+(rand() % 25))); //servo_set(SERVO_PIN3, 180-((rand() % 100)+(rand() % 50)+(rand() % 25))); } if (keysDown() & KEY_B) { if (wifi_scan == true) { wifi_scan = false; } else { wifi_scan = true; } } if (keysDown() & KEY_DOWN) { pain -= 0.1f; if (pain < 0.0f) { pain = 0.0f; } update = time(NULL); } if (keysDown() & KEY_UP) { pain += 0.1f; if (2.0f < pain) { pain = 2.0f; } update = time(NULL); } if (keysDown() & KEY_L) { current_servo += 1; if (current_servo > 3) { current_servo = 1; } } consoleClear(); if (wifi_scan == true) { num = 0; cur = head; iprintf("\n"); while (cur && num < 15) { // display if (!(cur->flags & 0x2)) { cur = cur->next; continue; } iprintf("%2u ", num); if (cur->ssid[0] == '\0') { iprintf("%02x%02x%02x%02x%02x%02x", cur->mac[0], cur->mac[1], cur->mac[2], cur->mac[3], cur->mac[4], cur->mac[5]); } else { iprintf("%s", cur->ssid); } iprintf(" @ %u", cur->rssi); if ((cur->flags & 0x06) == 0x06) { iprintf(" WPA"); } else if (cur->flags & 0x02) { iprintf(" WEP"); } // calculate servo commands if (attached && num < 3) { val[num] = (uint16)(cur->rssi*pain); if (180 < val[num]) { val[num] = 180; } iprintf(" %u", val[num]); } iprintf("\n"); if (num == 2) { iprintf ("\n"); } num++; cur = cur->next; } iprintf("\n"); if (time(NULL) < update+3) { printf("\npain multiplier: %.2f\n", pain); } // set the servo to zero if we don't have enough wifi nodes for (i=num; i<3; i++) { val[i] = 0; } if (attached) { servo_set(SERVO_PIN1, (uint8)val[0]); servo_set(SERVO_PIN2, 180-(uint8)val[1]); servo_set(SERVO_PIN3, (uint8)val[2]); } updateApList(&head, 0x00, NULL, NULL); sortApList(&head, false); } if (KEY_TOUCH && attached && !wifi_scan) { servo_pos = (touch.rawx / 3850.) * 180; iprintf ("servo pos x: %d;", servo_pos); iprintf ("\n"); servo_set(SERVO_PINS[current_servo-1],servo_pos); iprintf ("current servo: %d", current_servo); iprintf ("\n\n"); } swiWaitForVBlank(); } } while (1) { swiWaitForVBlank(); } return 0; }