如何使用Mac SDK将大型(2块)orbBasic程序上传到Sphero



我在电脑俱乐部和孩子们一起探索Sphero。我们开发简单的orbBasic程序来做有趣的事情。我确实放弃了在移动设备上使用orbBasic应用程序,因为它几乎不可用于编程(字体很小,很难在手机上编辑)。我找到了Sphero Mac SDK,现在我们使用它的orbBasicLoader从Mac上传程序。但当我们的程序变得更大时,我们发现它们不会以这种方式加载到Sphereo,可能是因为它们必须拆分为两个Sphereo内存块,而Mac SDK无法正确处理这些内存块。它由设备上的orbBasic应用程序处理,因此这是可能的。

如何使用Mac SDK将大型orbBasic程序上传到Sphereo?

这是我们的一个程序-Sphero的蛇形游戏,用orbBasic编写,遇到了这个问题。在4*4米的空间(程序开始时球体位于空间中心)中隐藏着"食物",您的目标是通过将Sphero驾驶到"食物"附近,以其亮度为向导来"吃食物"。你在吃了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

我想通了!

您必须手动将片段上传到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];
}

这是发送代码:

每次从Sphero收到响应成功时,必须调用函数,直到加载设置为YES。若您尝试一次发送所有片段,则会返回响应代码-2,并且程序不会加载。

-(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;
}
}

还有其他程序命令:

-(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];
}

相关内容

最新更新