Transfer Files from the 3DS to PC Using the Internet!
Root / Talk About Programs / [.]
amihartCreated:
This is my second attempt at a data transferring program.
I wrote a program so that you can transfer files from the 3DS to the PC over the internet without the need of a webcam or an auxiliary cable. It's also significantly faster than those methods.
Basically, it works by encoding your SmileBASIC program into an image that it draws to the screen, and then you take a screenshot of it using Miiverse (Home button->Miiverse icon). You then download the screenshot onto your PC by accessing your Miiverse page and then load the screenshot into the PC version of the program and it will convert it back into the SmileBASIC program.
Each screenshot holds up to 3 kilobytes of data. If your program is bigger than 3 kilobytes, it will give you more screenshots. So if it's 9 kilobytes big, the program will give you 3 individual images to take screenshots of.
On the PC end of the program, as long as your screenshots are in the correct order, you can open multiple screenshots at once and it will combine it back into a single file. (You'll know if you got them out of order because they'll appear to be gibberish.)
The actual program on the 3DS is less than 3 kilobytes, so if I were to try and send that file it would give me this:
That's an example of what the images look like. If you plug that into the PC end of the program you will get the code for the SmileBASIC end.
This is the output:
Why does each screenshot hold 3 kilobytes of information? Why not more? Mainly because Miiverse uses lossy compression, so I had to come up with a way to encode the images that wouldn't get lost when the image gets compressed. I basically reused the code I used for the webcam one, where it uses an R, G, B color sequence, each change representing 1 bit, and I made the colors 2x2 boxes so they wouldn't bleed together together too much when compressed. So, if each 2x2 box is a bit, and the 3DS screen is 400x240 res, then that's enough room for 24,000 boxes, meaning 24,000 bits, meaning 3 kilobytes.
Here's the actual SmileBASIC program page.
Here's the link for the PC end.
I hope this hasn't already been done before.
The 3DS end is coded in, obviously, SmileBASIC, and the PC end is coded in JavaScript and is compatible with Windows, Mac, and Linux (tested on Debian 8.2 and Windows 10).
Spoiler
ACLS 'SOME VARIABLES BLK=RGB(0,0,0) W=RGB(255,255,255) R=RGB(255,0,0) G=RGB(0,255,0) B=RGB(0,0,255) TX=0 TY=0 'READ TXT FILE LIST DIM FILELIST$[100] FILES "TXT:",FILELIST$ 'LIST FILES REMOVING ASTERISKS COLOR 15 PRINT "Pick a file to transfer:" FOR I=0 TO LEN(FILELIST$)-1 IF MID$(FILELIST$[I],0,1)=="*" THEN FILELIST$[I]=MID$(FILELIST$[I],1,LEN(FILELIST$[I])-1) ENDIF PRINT " "+FILELIST$[I] NEXT 'UP/DOWN TO MOVE ARROW AND SELECT FILE W/ (A) SEL=0 WHILE BUTTON()!=16 IF SEL>0 THEN LOCATE 1,1+SEL-1 PRINT " " ENDIF LOCATE 1,1+SEL PRINT ">" LOCATE 1,1+SEL+1 PRINT " " IF BUTTON()==1 THEN SEL=SEL-1 IF BUTTON()==2 THEN SEL=SEL+1 IF SEL<0 THEN SEL=0 IF SEL>LEN(FILELIST$)-1 THEN SEL=LEN(FILELIST$)-1 ENDIF WAIT 5 WEND CLS IN$=FILELIST$[SEL] 'LOAD TEXT FILE AND CONVERT IT TO INT ARRAY LOAD "TXT:"+IN$, FALSE OUT TEXT$ DIM OUT_ARRAY[LEN(TEXT$)] FOR I=0 TO LEN(TEXT$)-1 OUT_ARRAY[I]=ASC(MID$(TEXT$,I,1)) NEXT PREV=W 'DISPLAY COLOR SEQUENCE FOR II=0 TO LEN(OUT_ARRAY)-1 IN=OUT_ARRAY[II] GOSUB @TOBIN IN$=OUT$ GOSUB @COLOROUT NEXT WAIT 15 WHILE BUTTON()!=16:WEND 'FINISH/END PROGRAM GCLS CLS COLOR 15 END 'INT TO BINARY STRING 'IN: IN 'OUT: OUT$ @TOBIN OUT$="" FOR I=0 TO 7 OUT$=STR$(IN MOD 2)+OUT$ IN=(IN-(IN MOD 2))/2 NEXT RETURN 'DISPLAY COLOR SEQUENCE FOR BINARY STRING 'IN: IN$ 'OUT: <VOID> @COLOROUT FOR I=0 TO LEN(IN$)-1 BIT=VAL(MID$(IN$,I,1)) 'COLOR CODE TRANSFER PROTOCOL (CCTP1) COL=0 IF BIT==0 THEN IF PREV==R THEN COL=G IF PREV==G THEN COL=R IF PREV==B THEN COL=R IF PREV==W THEN COL=G ENDIF IF BIT==1 THEN IF PREV==R THEN COL=B IF PREV==G THEN COL=B IF PREV==B THEN COL=G IF PREV==W THEN COL=B ENDIF GCOLOR COL GPSET TX+1,TY GPSET TX,TY+1 GPSET TX+1,TY+1 GPSET TX,TY TX=TX+2 IF TX>400-2 THEN TX=0 TY=TY+2 ENDIF IF TY>240-2 THEN WHILE BUTTON()!=16 IF BUTTON()==32 THEN ACLS END ENDIF WEND GCLS TX=0 TY=0 ENDIF PREV=COL NEXT RETURN