zh2x / SpO2-BLE-for-iOS

a sample demo for Berry Medical's Oximeter which have Bluetooth Low Energy inside.
9 stars 7 forks source link

EXC_BAD_ACCESS when running in Swift #2

Closed Isuru-Nanayakkara closed 3 years ago

Isuru-Nanayakkara commented 3 years ago

Hi,

I'm trying to use this in a Swift project. I created a bridging header and added the following 4 files to my Xcode project.

BMOximeterAnalyzer.h BMOximeterAnalyzer.m BMOximeterParams.h BMOximeterParams.m

When I run it and connect to the oximeter and start receiving data, it crashes with the following error when calling the removeObjectsInRange method at the end of the addData function.

Thread 1: EXC_BAD_ACCESS (code=1, address=0x50008f7f7f50008f)

-(void)addData:(NSData *)data
{
    BOOL isPackageHeaderFound = NO;
    Byte package[5]           = {0};
    int  packageIndex         = 0;

    int  parserIndex = 0;
    int  i = 0;

    Byte *bytes = (Byte *)[data bytes];
    for(int i= 0; i < data.length; i++)
    {
        [self.dataArray addObject: [NSNumber numberWithInt:(int)(bytes[i]&0xff) ]];
    }

    if(self.dataArray.count < 10)
    {
        return;
    }

    while (i < self.dataArray.count)
    {
        //scan for package header
        if([self.dataArray[i] integerValue] & 0x80)
        {
            isPackageHeaderFound     = YES;
            package[packageIndex ++] = [self.dataArray[i] integerValue];
            i++;
            continue;
        }

        if(isPackageHeaderFound)
        {
            package[packageIndex ++] = [self.dataArray[i] integerValue];
            if(packageIndex == 5)
            {
                BMOximeterParams *params = [[BMOximeterParams alloc] init];

                params.waveAmplitude  = package[1];
                params.pulseRateValue = package[3] | ((package[2] & 0x40) << 1);
                params.SpO2Value      = package[4];

                //refresh parameters
                if (params.SpO2Value != self.oximeterParams.SpO2Value || params.pulseRateValue != self.oximeterParams.pulseRateValue)
                {

                    if([self.delegate respondsToSelector:@selector(OximeterAnalyzer:didRefreshOximeterParams:)])
                    {
                        [self.delegate performSelector:@selector(OximeterAnalyzer:didRefreshOximeterParams:) withObject:params];
                    }
                }

                //refresh pulse wave
                if([self.delegate respondsToSelector:@selector(OximeterAnalyzer:didRefreshOximeterWaveAmplitude:)])
                {
                    [self.delegate performSelector:@selector(OximeterAnalyzer:didRefreshOximeterWaveAmplitude:) withObject:params];
                }

                self.oximeterParams = params;

                packageIndex         = 0;
                isPackageHeaderFound = NO;
                parserIndex          = i;
                memset(package, 0, sizeof(package));
            }
        }

        i++;

    }
    [self.dataArray removeObjectsInRange:NSMakeRange(0, parserIndex+1)];
}

@end
zh2x commented 3 years ago

Please refer: https://github.com/zhuchengji-berry/BluetoothDemo

Isuru-Nanayakkara commented 3 years ago

Thanks!