/*---------------------------------------------------------------------------* Project: Horizon File: main.cpp Copyright (C)2010 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. *---------------------------------------------------------------------------*/ #include #include #include #include #include #include #include "demo.h" nn::Result res; nn::fs::FileOutputStream fout; nn::fs::FileInputStream fin; nn::fs::Directory dc[256]; wchar_t file_pathw[1024]; char file_path[1024]; char file_path2[1024]; char src_buff[1024*1024]; char get_buff[1024*1024]; char str[512]; extern demo::RenderSystemDrawing s_RenderSystem; //終了処理 extern void finish(void); extern u32 WaitKey(u32 mask); extern void setColor(f32 r,f32 g,f32 b,f32 a); extern void drawText(u16 x,u16 y,char *s); void drawText(u16 x,u16 y,char *s,int v) { sprintf(str,s,v); drawText( x,y,str); } //----------------------------------------  テストパターン void make_pattern() { int i; int *buff; buff = (int*)&src_buff[0]; for (i=0;i= SIZE_TEST1)break; if ((SIZE_TEST1 - total) < 512)size2 = SIZE_TEST1 - total ; } fout.Finalize(); nn::fs::CommitSaveData(); nn::fs::Unmount("data:"); NN_LOG("total %d",total); drawText(10,100,"end"); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); return true; } //ベリファイ bool Test1_V() { int i,total; res = fin.TryInitialize(L"data:/test1.bin"); if (res.IsFailure()) { //NN_LOG("%d\n",res.GetDescription()); drawText(8,100,"open Fail"); nn::fs::Unmount("data:"); return false; } total =0; while(1){ res = fin.TryRead( &size,&get_buff[total],512); if (res.IsFailure()){ drawText(8,100,"read Fail"); fin.Finalize(); nn::fs::Unmount("data:"); return false; } //if (size == 0)break; for (i=0;i= SIZE_TEST1)break; total += size; s_RenderSystem.Clear(); sprintf(str,"now %d",total); drawText(10,80,str); s_RenderSystem.SwapBuffers(); if (size<512)break; } fout.Finalize(); nn::fs::Unmount("data:"); drawText(10,100,"end"); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); return true; } #define test2_max 680 #define test2_ct test2_max //#define test2_max 10 //#define test2_ct 5 #define test2_size 512 //ファイル数 bool Test2_W(int n) { int total,size2; res = nn::fs::FormatSaveData(test2_max,1,false);//dupなしファイル680 if (res.IsFailure()){ drawText(8,100,"format Fail"); return false; } res =nn::fs::MountSaveData(); if (res.IsFailure()){ drawText(8,100,"Mount Fail"); return false; } total =0; int num = 0; size2 = test2_size; while(1){ sprintf(file_path,"data:/test%d.bin",num); // res = nn::fs::TryCreateFile(L"data:/test2.bin",SIZE_TEST1); // if (res.IsFailure()){ // drawText(8,100,"Create Fail"); // nn::fs::Unmount("data:"); // return false; // } res = fout.TryInitialize(file_path,true); if (res.IsFailure()){ drawText(8,100,"open Fail"); nn::fs::Unmount("data:"); return false; } res = fout.TryWrite( &size,&src_buff[total],size2); if (res.IsFailure()){ drawText(8,100,"write Fail"); fout.Finalize(); nn::fs::Unmount("data:"); return false; } fout.Finalize(); total += size; num++; sprintf(str,"size %d , num %d",total,num); s_RenderSystem.Clear(); drawText(10,80,str); s_RenderSystem.SwapBuffers(); //if (size<512)break; if (num == n)break; } fout.Finalize(); nn::fs::CommitSaveData(); nn::fs::Unmount("data:"); NN_LOG("total %d",total); drawText(10,100,"end"); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); return true; } bool Test2_V(int n) { int total,size2,i; total =0; int num = 0; size2 = 512; while(1){ sprintf(file_path,"data:/test%d.bin",num); res = fin.TryInitialize(file_path); if (res.IsFailure()){ drawText(8,100,"open Fail"); nn::fs::Unmount("data:"); return false; } res = fin.TryRead( &size,&get_buff[total],size2); if (res.IsFailure()){ drawText(8,100,"read Fail"); fin.Finalize(); nn::fs::Unmount("data:"); return false; } for (i=0;i=DirDepthLow){ strcpy(file_path2,file_path); sprintf(str,"/t%d.bin",num); strcat(file_path2,str); res = fout.TryInitialize(file_path2,true); if (res.IsFailure()){ drawText(8,100,"open Fail"); nn::fs::Unmount("data:"); return false; } res = fout.TryWrite( &size,&src_buff[total],size2); if (res.IsFailure()){ drawText(8,100,"write Fail"); fout.Finalize(); nn::fs::Unmount("data:"); return false; } fout.Finalize(); total+=size; } num++; s_RenderSystem.Clear(); sprintf(str,"num %d",num); drawText(10,80,str); s_RenderSystem.SwapBuffers(); if (num == DirDepth)break; } nn::fs::CommitSaveData(); nn::fs::Unmount("data:"); drawText(10,100,"end"); sprintf(str,"length = %d",(int)strlen(file_path2)-6); drawText(8,110,str); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); return true; } bool Test3_V() { int i,total,size2; int num = 0; total =0; size2 = 512; strcpy(file_path,"data:"); while(1){ sprintf(str,"/%d",num); strcat(file_path,str); if (num>=DirDepthLow){ strcpy(file_path2,file_path); sprintf(str,"/t%d.bin",num); strcat(file_path2,str); res = fin.TryInitialize(file_path2); if (res.IsFailure()){ drawText(8,100,"open Fail"); nn::fs::Unmount("data:"); return false; } res = fin.TryRead( &size,&get_buff[total],size2); if (res.IsFailure()){ drawText(8,100,"read Fail"); fin.Finalize(); nn::fs::Unmount("data:"); return false; } for (i=0;i= SIZE_TEST5)break; } fout.Finalize(); nn::fs::CommitSaveData(); nn::fs::Unmount("data:"); drawText(10,100,"end"); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); return true; } bool Test5_V() { int i; s64 pos; res = fin.TryInitialize(L"data:/test5.bin"); if (res.IsFailure()){ drawText(8,100,"open Fail"); nn::fs::Unmount("data:"); return false; } pos = SIZE_TEST5_START; while(1){ fin.SetPosition(pos); res = fin.TryRead( &size,&get_buff[pos],512); if (res.IsFailure() || (size!=512)){ drawText(8,100,"read Fail"); fin.Finalize(); nn::fs::Unmount("data:"); return false; } sprintf(str,"position %d",(int)pos); s_RenderSystem.Clear(); drawText(10,80,str); s_RenderSystem.SwapBuffers(); for (i=0;i<512;i++) if (src_buff[pos+i] != get_buff[pos+i]) { drawText(8,100,"verifi Fail at %d",i); return false; } pos += SIZE_TEST5_HZ;//飛ばす if (pos >= SIZE_TEST5)break; } fin.Finalize(); nn::fs::Unmount("data:"); drawText(10,100,"end"); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); return true; } const char kinsi[] = {0x22,'<','>','?','*','|',0x5c,':',' ',0};//0x22 = "",0x5c = 円マーク // スラッシュはセーブ時に重ね("//")ても"/"になり,末尾だとエラーとなる const char *kinsi2[] = { "CON","PRN","NUL","AUX","LPT1","LPT2","LPT3","LPT4","COM1","COM2","COM3","COM4" ,"con","prn","nul","aux","lpt1","lpt2","lpt3","lpt4","com1","com2","com3","com4",""}; //FAT違反の名前 bool Test6_W() { res = nn::fs::FormatSaveData(100,100,true); if (res.IsFailure()){ drawText(8,100,"format Fail"); return false; } res =nn::fs::MountSaveData(); if (res.IsFailure()){ drawText(8,100,"Mount Fail"); return false; } //禁止文字 char *base = "test6"; char dname[128],fname[128]; int ofst=0; //頭に付ける strcpy(dname,"data:/"); int pos = strlen(dname); strcat(dname,"_"); strcat(dname,base);//data:/_base int pos2 = strlen(dname)+1; strcpy(fname,dname); strcat(fname,"/_"); strcat(fname,base); strcat(fname,".bin");//data:/_base/_base.bin int i =0; char c; while(kinsi[i] != 0) { c = kinsi[i]; dname[pos] = c; res = nn::fs::TryCreateDirectory(dname); if (res.IsFailure()){ drawText(8,100,"Dir fail"); nn::fs::Unmount("data:"); return false; } fname[pos] = c; fname[pos2] = c; res = fout.TryInitialize(fname,true); if (res.IsFailure()){ drawText(8,100,"open fail"); nn::fs::Unmount("data:"); return false; } res = fout.TryWrite( &size,&src_buff[ofst],512); if (res.IsFailure()){ drawText(8,100,"write fail"); nn::fs::Unmount("data:"); return false; } fout.Finalize(); i++; ofst+=512; } //末尾 strcpy(dname,"data:/"); strcat(dname,base);//data:/base pos = strlen(dname); strcat(dname,"_");//data:/base_ strcpy(fname,dname); strcat(fname,"/"); strcat(fname,base);//data:/base_/base pos2 = strlen(fname); strcat(fname,"_.bin");//data:/base_/base_.bin i =0; while(kinsi[i] != 0) { c = kinsi[i]; dname[pos] = c; res = nn::fs::TryCreateDirectory(dname); if (res.IsFailure()){ drawText(8,100,"dir fail"); nn::fs::Unmount("data:"); return false; } fname[pos] = c; fname[pos2] = c; res = fout.TryInitialize(fname,true); if (res.IsFailure()){ drawText(8,100,"open fail"); nn::fs::Unmount("data:"); return false; } res = fout.TryWrite( &size,&src_buff[ofst],512); if (res.IsFailure()){ drawText(8,100,"write fail"); nn::fs::Unmount("data:"); return false; } fout.Finalize(); i++; ofst+=512; } //禁止名 i=0; while(kinsi2[i][0] != 0) { strcpy(dname,"data:/"); strcat(dname,kinsi2[i]); res = nn::fs::TryCreateDirectory(dname); if (res.IsFailure()){ drawText(8,100,"dir fail"); nn::fs::Unmount("data:"); return false; } strcpy(fname,dname); strcat(fname,"/"); strcat(fname,kinsi2[i]); res = fout.TryInitialize(fname,true); if (res.IsFailure()){ drawText(8,100,"open fail"); nn::fs::Unmount("data:"); return false; } res = fout.TryWrite( &size,&src_buff[ofst],512); if (res.IsFailure()){ drawText(8,100,"write fail"); nn::fs::Unmount("data:"); return false; } fout.Finalize(); i++; ofst+=512; } nn::fs::CommitSaveData(); nn::fs::Unmount("data:"); drawText(10,100,"end"); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); return true; } bool Test6_V() { //禁止文字 char *base = "test6"; char fname[128]; int ofst=0; //頭に付ける strcpy(fname,"data:/"); int pos = strlen(fname); strcat(fname,"_"); strcat(fname,base);//data:/_base int pos2 = strlen(fname)+1; strcat(fname,"/_"); strcat(fname,base); strcat(fname,".bin");//data:/_base/_base.bin int i =0; int j; char c; while(kinsi[i] != 0) { c = kinsi[i]; fname[pos] = c; fname[pos2] = c; res = fin.TryInitialize(fname); if (res.IsFailure()){ drawText(8,100,"open fail"); nn::fs::Unmount("data:"); return false; } res = fin.TryRead( &size,&get_buff[ofst],512); if (res.IsFailure()){ drawText(8,100,"read fail"); nn::fs::Unmount("data:"); return false; } fin.Finalize(); for(j=0;j<512;j++)if(src_buff[ofst+i] != get_buff[ofst+i]){ drawText(8,100,"verifi fail"); nn::fs::Unmount("data:"); return false; } i++; ofst+=512; } //末尾 strcpy(fname,"data:/"); strcat(fname,base);//data:/base pos = strlen(fname); strcat(fname,"_/");//data:/base_/ strcat(fname,base);//data:/base_/base pos2 = strlen(fname); strcat(fname,"_.bin");//data:/base_/base_.bin i =0; while(kinsi[i] != 0)//末尾スラッシュは名無しでエラー { c = kinsi[i]; fname[pos] = c; fname[pos2] = c; res = fin.TryInitialize(fname); if (res.IsFailure()){ drawText(8,100,"open fail"); nn::fs::Unmount("data:"); return false; } res = fin.TryRead( &size,&get_buff[ofst],512); if (res.IsFailure()){ drawText(8,100,"write fail"); nn::fs::Unmount("data:"); return false; } fout.Finalize(); for(j=0;j<512;j++)if(src_buff[ofst+i] != get_buff[ofst+i]){ drawText(8,100,"verifi fail"); nn::fs::Unmount("data:"); return false; } i++; ofst+=512; } //禁止名 i=0; while(kinsi2[i][0] != 0) { strcpy(fname,"data:/"); strcat(fname,kinsi2[i]); strcat(fname,"/"); strcat(fname,kinsi2[i]); res = fin.TryInitialize(fname); if (res.IsFailure()){ drawText(8,100,"open fail"); nn::fs::Unmount("data:"); return false; } res = fin.TryRead( &size,&get_buff[ofst],512); if (res.IsFailure()){ drawText(8,100,"read fail"); nn::fs::Unmount("data:"); return false; } fin.Finalize(); for(j=0;j<512;j++)if(src_buff[ofst+i] != get_buff[ofst+i]){ drawText(8,100,"verifi fail"); nn::fs::Unmount("data:"); return false; } i++; ofst+=512; } fin.Finalize(); nn::fs::Unmount("data:"); drawText(10,100,"end"); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); return true; } #define menu_ct 7 #define menu_max (menu_ct-1) char* menu_str[menu_ct] = {"Casual check","Large size","many files","Deep directry","max size name","data < create size","fat error name"}; #define menu_top_Y 80 #define menu_top_X 60 #define menu_spc 14 //---------------------------------------------------------------- main void TestMain() { u32 value; int curs = 0; int i; bool sccs; //Render setColor(1.0f,1.0f,1.0f,1.0f); //TEST PATTERN make_pattern(); while(1){ //menu 表示 s_RenderSystem.Clear(); drawText(8,20," Backup Verifi for SaveDataMover Test "); drawText(8,40," for 512KB Backup"); for (i=0;i"); drawText(menu_top_X,menu_top_Y+menu_spc*(menu_max+2),"push A:Write ,X:Verifi"); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); //ボタン待ち value = WaitKey(nn::hid::BUTTON_A | nn::hid::BUTTON_X |nn::hid::BUTTON_UP |nn::hid::BUTTON_DOWN); if (value & nn::hid::BUTTON_A){//ライト sccs = false; s_RenderSystem.Clear(); drawText(10,70,"writing"); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); switch(curs){ case 0:sccs = Test0_W(5);break; case 1:sccs = Test1_W();break; case 2:sccs = Test2_W(test2_ct);break; case 3:sccs = Test3_W();break; case 4:sccs = Test4_W();break; case 5:sccs = Test5_W();break; case 6:sccs = Test6_W();break; default:break; } }else if (value & nn::hid::BUTTON_X) {//ベリファイ sccs = false; s_RenderSystem.Clear(); drawText(10,70,"verifi"); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); res =nn::fs::MountSaveData(); if (res.IsFailure()){ drawText(8,100,"Mount Fail"); }else switch(curs){ case 0:sccs = Test0_V(5);break; case 1:sccs = Test1_V();break; case 2:sccs = Test2_V(680);break; case 3:sccs = Test3_V();break; case 4:sccs = Test4_V();break; case 5:sccs = Test5_V();break; case 6:sccs = Test6_V();break; default:break; } }else if (value & nn::hid::BUTTON_UP){ if(curs > 0)curs--; }else if(curs < menu_max)curs++; if (value & (nn::hid::BUTTON_A | nn::hid::BUTTON_X)){ if (sccs == false){ fin.Finalize(); fout.Finalize(); nn::fs::Unmount("data:"); drawText(8,120,"Failed"); } sprintf(str,"desc %d",res.GetDescription()); drawText(10,140,str); s_RenderSystem.SwapBuffers(); NN_LOG("desc %d",res.GetDescription()); WaitKey(nn::hid::BUTTON_B); } } } /*---------------------------------------------------------------------------* End of file *---------------------------------------------------------------------------*/