react-native-bt-device/ios/RNBTDevice/Device/DGMG/Algorithm/Algorithm20.m

280 lines
8.9 KiB
Mathematica
Raw Normal View History

#import "Algorithm20.h"
@implementation Algorithm20
- (instancetype)init {
self = [super init];
if (self) {
self.X = [[ParamX alloc] init];
self.iValueManager = [[IValueManager alloc] init];
self.rfManager = [[ReferenceManager alloc] init];
self.calIValue = [NSMutableArray array];
}
return self;
}
- (IValue *)getInitParam {
2024-09-02 18:06:27 +00:00
return self.iValueManager.preIValue;
}
- (void)setInitParam:(IValue *)iValue {
[self.iValueManager setPreIValue:iValue];
}
- (void)addRef:(NSNumber *)value time:(NSDate *)time {
[self.rfManager addReference:value.doubleValue time:time];
}
- (NSNumber *)calcBloodGlucose:(double)current datetime:(NSDate *)datetime {
NSNumber *bgValue = @(0.0);
IValue *cur_data = [[IValue alloc] initWithCurrentTime:datetime current:@(current)];
IValue *i4_data = nil;
[self.rfManager findReferenceByDate:datetime];
if ([self.rfManager isCalK]) {
i4_data = [self calKValueAlgorithm:cur_data];
} else {
i4_data = [self I4Algorith:cur_data];
}
if ([self.rfManager isCalK]) {
bgValue = @([self.rfManager getRefValue].value);
} else if ([self.rfManager isWaitCalK]) {
bgValue = @([self.rfManager getRefValue].value);
2024-09-02 18:06:27 +00:00
i4_data.rfTime = [self.rfManager getRefValue].time;
i4_data.rf = @([self.rfManager getRefValue].value);
} else if (i4_data.k != nil) {
bgValue = @([i4_data.I4 doubleValue] / [i4_data.k doubleValue]);
}
bgValue = [self roundDouble:bgValue.doubleValue precision:1];
if ((current >= 600.0) || (current <= 30.0)) {
bgValue = @(0.0);
}
[i4_data setBg:bgValue];
[self.iValueManager setPreIValue:i4_data];
2024-09-02 18:06:27 +00:00
NSString *rft = i4_data.rfTime == nil ? @"" : [self dateformate:i4_data.rfTime];
2024-09-02 18:06:27 +00:00
NSLog(@"%@\t%@\t%@", i4_data.current, [self dateformate:i4_data.currentTime], bgValue);
return bgValue;
}
- (NSNumber *)calcBloodGlucose:(double)current index:(NSInteger)index {
NSNumber *bgValue = @(0.0);
IValue *cur_data = [[IValue alloc] initWithCurrentTime:nil current:@(current)];
IValue *i4_data = nil;
[self.rfManager findReferenceByIndex:index];
if ([self.rfManager isCalK]) {
i4_data = [self calKValueAlgorithm:cur_data];
} else {
i4_data = [self I4Algorith:cur_data];
}
if ([self.rfManager isCalK]) {
bgValue = @([self.rfManager getRefValue].value);
} else if ([self.rfManager isWaitCalK]) {
bgValue = @([self.rfManager getRefValue].value);
2024-09-02 18:06:27 +00:00
i4_data.rfTime = [self.rfManager getRefValue].time;
i4_data.rf = @([self.rfManager getRefValue].value);
} else if (i4_data.k != nil) {
bgValue = @([i4_data.I4 doubleValue] / [i4_data.k doubleValue]);
}
bgValue = [self roundDouble:bgValue.doubleValue precision:1];
if ((current >= 600.0) || (current <= 30.0)) {
bgValue = @(0.0);
}
[i4_data setBg:bgValue];
[self.iValueManager setPreIValue:i4_data];
[self.calIValue addObject:i4_data];
return bgValue;
}
- (NSMutableArray<NSNumber *> *)calculateBloodGlucose:(NSInteger)index refValue:(NSNumber *)refValue values:(NSMutableArray<NSNumber *> *)values {
[self.rfManager addCurrentReference:refValue.doubleValue index:index];
NSMutableArray<NSNumber *> *dataList = [NSMutableArray array];
for (NSInteger i = 0; i < values.count; i++) {
NSNumber *electricValue = values[i];
NSNumber *bgValue = [self calcBloodGlucose:electricValue.doubleValue index:(index + i)];
[dataList addObject:bgValue];
}
return dataList;
}
- (IValue *)calTest:(double)current datetime:(NSDate *)datetime {
NSNumber *bgValue = @(0.0);
IValue *cur_data = [[IValue alloc] initWithCurrentTime:datetime current:@(current)];
IValue *i4_data = nil;
[self.rfManager findReferenceByDate:datetime];
if ([self.rfManager isCalK]) {
i4_data = [self calKValueAlgorithm:cur_data];
} else {
i4_data = [self I4Algorith:cur_data];
}
if ([self.rfManager isCalK]) {
bgValue = @([self.rfManager getRefValue].value);
} else if ([self.rfManager isWaitCalK]) {
bgValue = @([self.rfManager getRefValue].value);
[i4_data setRfTime:[self.rfManager getRefValue].time];
[i4_data setRf:@([self.rfManager getRefValue].value)];
2024-09-02 18:06:27 +00:00
} else if (i4_data.k != nil) {
bgValue = @([i4_data.I4 doubleValue] / [i4_data.k doubleValue]);
}
bgValue = [self roundDouble:bgValue.doubleValue precision:1];
if ((current >= 600.0) || (current <= 30.0)) {
bgValue = @(0.0);
}
[i4_data setBg:bgValue];
[self.iValueManager setPreIValue:i4_data];
2024-09-02 18:06:27 +00:00
NSString *rft = i4_data.rfTime == nil ? @"" : [self dateformate:i4_data.rfTime];
2024-09-02 18:06:27 +00:00
// NSLog(@"%@\t%@\t%@", [i4_data getI0], [i4_data getI1], [i4_data getI2], [i4_data getI3], [i4_data getI4], [i4_data getK], [i4_data getRf], [i4_data getBg], [i4_data getCurrent], [self dateformate:[i4_data getCurrentTime]], [i4_data getRf], rft);
return i4_data;
}
- (IValue *)calKValueAlgorithm:(IValue *)cur_data {
NSNumber *kValue = @(0.0);
cur_data = [self calI4ForK:cur_data];
2024-09-02 18:06:27 +00:00
kValue = cur_data.k;
I4Algorithm *i4Temp = nil;
if (kValue.doubleValue >= 10.0 && kValue.doubleValue <= 20.0) {
[cur_data setK:kValue];
return cur_data;
}
if (kValue.doubleValue < 10.0) {
2024-09-02 18:06:27 +00:00
[cur_data setI4:@([cur_data.I3 doubleValue] - [I4Algorithm I4_20].value)];
kValue = @([cur_data.I4 doubleValue] / [self.rfManager getRefValue].value);
i4Temp = [I4Algorithm I4_20];
} else if (kValue.doubleValue > 20.0) {
2024-09-02 18:06:27 +00:00
[cur_data setI4:@([cur_data.I3 doubleValue] - [I4Algorithm I4_60].value)];
kValue = @([cur_data.I4 doubleValue] / [self.rfManager getRefValue].value);
i4Temp = [I4Algorithm I4_60];
}
if (kValue.doubleValue >= 7.5 && kValue.doubleValue <= 25.0) {
[cur_data setK:kValue];
[cur_data setBgCurrent:i4Temp.value];
return cur_data;
}
if (kValue.doubleValue < 7.5) {
2024-09-02 18:06:27 +00:00
cur_data.I4 = @([cur_data.I3 doubleValue] - [I4Algorithm I4_0].value);
kValue = @([cur_data.I4 doubleValue] / [self.rfManager getRefValue].value);
i4Temp = [I4Algorithm I4_0];
} else if (kValue.doubleValue > 25.0) {
2024-09-02 18:06:27 +00:00
cur_data.I4 = @([cur_data.I3 doubleValue] - [I4Algorithm I4_80].value);
kValue = @([cur_data.I4 doubleValue] / [self.rfManager getRefValue].value);
i4Temp = [I4Algorithm I4_80];
}
if (kValue.doubleValue > 2.5 && kValue.doubleValue < 40.0) {
[cur_data setK:kValue];
[cur_data setBgCurrent:i4Temp.value];
}
return cur_data;
}
- (int)calRoc {
if (self.calIValue == nil) {
return 0;
}
NSInteger size = self.calIValue.count;
if (size == 0 || size <= 2) {
return 0;
}
2024-09-02 18:06:27 +00:00
double b0 = [self.calIValue[size - 3].bg doubleValue];
double b1 = [self.calIValue[size - 2].bg doubleValue];
double b2 = [self.calIValue[size - 1].bg doubleValue];
if (b0 == 0.0 || b1 == 0.0 || b2 == 0.0) {
return 0;
}
double roc = (0.3 * ((b1 - b0) / 3.0)) + (0.7 * ((b2 - b1) / 3.0));
if (roc >= 0.1) {
return 1;
} else if (roc > 0.05 && roc < 0.1) {
return 2;
} else if (roc >= -0.05 && roc <= 0.05) {
return 3;
} else if (roc > -0.1 && roc < -0.05) {
return 4;
} else if (roc <= -0.1) {
return 5;
}
return 0;
}
- (IValue *)calI4ForK:(IValue *)cur_data {
IValue *I4_redta = [self I4Algorith:cur_data];
2024-09-02 18:06:27 +00:00
NSNumber *kValue = @([I4_redta.I4 doubleValue] / [self.rfManager getRefValue].value);
[I4_redta setK:kValue];
return I4_redta;
}
- (IValue *)I4Algorith:(IValue *)cur_data {
2024-09-02 18:06:27 +00:00
IValue *prev_data = self.iValueManager.preIValue;
2024-09-02 18:06:27 +00:00
[cur_data setI0:cur_data.current];
2024-09-02 18:06:27 +00:00
[cur_data setI1:@([cur_data.I0 doubleValue] * (1.0 + self.X.X1 * (32.0 - self.X.X2)))];
2024-09-02 18:06:27 +00:00
if (prev_data != nil && prev_data.I3 != nil) {
cur_data.I3 = @(self.X.X4 * [cur_data.I1 doubleValue] + (1.0 - self.X.X4) * [prev_data.I3 doubleValue]);
cur_data.bgCurrent = prev_data.bgCurrent;
cur_data.k = prev_data.k;
2024-09-02 18:06:27 +00:00
if (cur_data.rf != nil && cur_data.rf.doubleValue != 0.0) {
cur_data.rf = prev_data.rf;
cur_data.rfTime = prev_data.rfTime;
}
} else {
2024-09-02 18:06:27 +00:00
cur_data.bgCurrent = [I4Algorithm I4_40].value;
cur_data.I3 = cur_data.I1;
}
2024-09-02 18:06:27 +00:00
cur_data.I4 = @([cur_data.I3 doubleValue] - cur_data.bgCurrent);
return cur_data;
}
- (NSNumber *)roundDouble:(double)val precision:(int)precision {
NSNumber *ret = nil;
@try {
double factor = pow(10.0, precision);
ret = @(floor(val * factor + 0.5) / factor);
}
@catch (NSException *exception) {
NSLog(@"%@", exception.reason);
}
return ret;
}
- (NSString *)dateformate:(NSDate *)date {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
return [formatter stringFromDate:date];
}
@end