2014-03-03 9 views
1

나는 컴퓨터 클럽에서 아이들과 함께 스페로를 탐험한다. 우리는 재미있는 일을하는 간단한 orbBasic 프로그램을 개발합니다. 나는 모바일 장치에서 orbBasic 응용 프로그램을 포기 했었습니다. 프로그래밍에 사용할 수 없기 때문입니다 (작은 글꼴, 모바일에서 편집하기가 어렵습니다). Sphero Mac SDK를 발견했으며 이제 orbBasicLoader를 사용하여 Mac에서 프로그램을 업로드합니다. 그러나 우리 프로그램이 커지면 Sphero에 이러한 방식으로로드되지 않을 것입니다. 아마 Sphero 메모리를 Mac SDK에서 올바르게 처리하지 못하는 두 개의 블록으로 분할해야하기 때문입니다. 장치의 orbBasic 앱에서 처리하므로 가능합니다.Mac SDK를 사용하여 Sphero에 큰 (2 블록) orbBasic 프로그램을 업로드하는 방법은 무엇입니까?

Mac SDK를 사용하여 Sphero에 큰 orbBasic 프로그램을 업로드하는 방법은 무엇입니까?

이것은 우리 프로그램 중 하나입니다.이 문제로 고통받는 orbBasic으로 작성된 Sphero 용 스네이크 게임과 같습니다. 공간 4 * 4 미터 (구가 프로그램 시작시 공간의 중심에 있음)에는 숨겨진 '음식'이 있으며 목표는 밝기를 기준으로 '음식'근처에서 스페로를 몰아서 '음식을 먹는 것'입니다. 5 가지 음식을 먹은 후에 게임을 끝내십시오. Sphero를 두 번 흔들어 다시 시작하십시오.

10 locate 0,0 
20 E=0 
30 X=200-rnd 400 
40 Y=200-rnd 400 
50 C=xpos-X 
60 D=ypos-Y 
70 L=sqrt(C*C+D*D) 
80 if L>200 then L=200 
90 O=255-L 
100 RGB O,O,O 
110 if L<10 then goto 140 
120 delay 100 
130 goto 50 
140 E=E+1 
150 RGB 0,E*51,0 
160 delay 1000 
170 if E<5 then goto 30 
180 LEDC 1+rnd 7 
190 delay 100 
200 if dshake > 0 then goto 10 
210 goto 180 

답변

1

알아 냈습니다!

조각을 수동으로 Sphero에 업로드해야하며 조각은 253 개의 한계에 가깝지 않아야합니다. 조각의 최대 크기는 200입니다. 그것은 매우 간단합니다. 여기

-(void)setProgram:(NSString *)inProgram { 
    NSArray *lines = [inProgram componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; 

    if(fragments != nil) { 
     [fragments release]; 
    } 

    char buffer[1024]= {0}; 

    fragments = [[NSMutableArray alloc] initWithCapacity:2]; 

    NSMutableData *data = [[NSMutableData alloc] init]; 
    for(int i = 0; i<[lines count]; i++) { 
     NSString *currentLine = [lines objectAtIndex:i]; 

     //strip comments - lines starting with apostrophe 
     if([currentLine hasPrefix:@"'"]) continue; 

     if((data.length + [currentLine lengthOfBytesUsingEncoding:NSASCIIStringEncoding]) > 200) { 
      [fragments addObject:data]; 
      [data release]; 
      data = [[NSMutableData alloc] init]; 
     } 

     if([currentLine getCString:buffer maxLength:253 encoding:NSASCIIStringEncoding]) { 
      [data appendBytes:buffer length:strlen(buffer)]; 
      [data appendBytes:"\r" length:1]; 
     } 
    } 

    [fragments addObject:data]; 
    [data release]; 
} 

코드 보내고 :

기능이 YES로 설정된로드까지 Sphero로부터 수신 할 때마다 응답 성공 호출되어야에게 여기

는 프로그램 단편을 분리하는 코드이다. 모든 조각을 한 번에 보내려고하면 응답 코드 -2가 반환되고 프로그램이로드되지 않습니다.

-(void)execute { 
    if(loaded == YES) { 
     RKOrbBasicExecuteCommand *execCmd = [[RKOrbBasicExecuteCommand alloc] initWithStorageArea:RKOrbBasicStorageTypeTemporary startLine:10]; 
     [execCmd sendCommand]; 
     [execCmd release]; 
    } 
} 

-(void)erase { 
    RKOrbBasicEraseStorageCommand *eraseCmd = [[RKOrbBasicEraseStorageCommand alloc] initWithStorageType:RKOrbBasicStorageTypeTemporary]; 
    [eraseCmd sendCommand]; 
    [eraseCmd release]; 
    loaded=NO; 
} 

-(void)abort { 
    RKOrbBasicAbortCommand *abortCmd = [[RKOrbBasicAbortCommand alloc] init]; 
    [abortCmd sendCommand]; 
    [abortCmd release]; 
} 
:

-(void)loadToSphero { 
    if(loaded == YES) { 
     [self abort]; 
     [self erase]; 
     curFragment = 0; 
    } 


    if(curFragment < [fragments count]) { 
     RKOrbBasicAppendFragmentCommand *appendCmd = [[RKOrbBasicAppendFragmentCommand alloc] initWithStorageType:RKOrbBasicStorageTypeTemporary fragment:[fragments objectAtIndex:curFragment]]; 
     [appendCmd sendCommand]; 
     [appendCmd release]; 
     curFragment++; 
    } 
    else { 
     loaded = YES; 
    } 
} 

여기에 다른 프로그램 명령입니다