#import "TlwRecordManager.h"
#import "TlwConnectManager.h"
-@interface TlwDeviceInfo()
-@end
+
@implementation TlwDeviceInfo
-(NSString *)description{
NSString *info = [NSString stringWithFormat:@"\n version = %d\n DPI = %d\n batteryState = %d\n batteryValue = %d\n",self.version,self.DPI,self.batteryState,self.batteryValue];
return info;
}
@end
+@implementation TlwSnInfo
+-(NSString *)description{
+ NSString *info = [NSString stringWithFormat:@"\n code = %@\n brand = %@\n batch = %@\n sn = %@\n",self.code,self.brand,self.batch,self.sn];
+ return info;
+}
+@end
@interface TlwMouse()<TlwConnectManagerDelegate>
@property (nonatomic,strong)void (^closeRecord)(BOOL isSuccess,NSError *error);
@property (nonatomic,strong)void (^setDpi)(BOOL isSuccess,NSError *error);
@property (nonatomic,strong)void (^getMouseInfo)(TlwDeviceInfo *deviceInfo,NSError *error);
+@property (nonatomic,strong)void (^getSnInfo)(TlwSnInfo *snInfo,NSError *error);
@end
@implementation TlwMouse
}
- (void)switchConnect:(AiMouseConnectType)type isConnected:(BOOL)isConneted{
-// if(type != _connectType && self.connected){
-// [self.connectManager disConnected];
-// }
+ // if(type != _connectType && self.connected){
+ // [self.connectManager disConnected];
+ // }
_connected = isConneted;
if (isConneted) {
_connectType = type;
[self showLog:type == AiMouseConnectType_bluetooth?@"sdk切换到蓝牙模式":@"sdk切换到usb模式"];
}
[self TlwConnectManager:self.connectManager connectStateDidChange:isConneted];
-
+
if (type == AiMouseConnectType_hid && isConneted) {
[self.recordManager checkPermissions];
}
}
-(void)sendDeviceDataToSdk:(NSData *)data{
- [self showLog:[NSString stringWithFormat:@"[receive][info] %@",data]];
+ [self showLog:[NSString stringWithFormat:@"[receive][info] %@",[TlwTools dataToHexString:data]]];
if(self.connectType == AiMouseConnectType_hid){
[self hidReceiveDeviceData:data];
}
[mData appendBytes:&len length:1];
[self sendToDevice:mData];
}
-
+
}
- (void)setDPI:(uint8_t)value completation:(void (^)(BOOL isSuccess,NSError *error))finished{
[self sendToDevice:mData];
}
-
+
}
- (void)getDeviceInfo:(void (^)(TlwDeviceInfo *deviceInfo,NSError *error))finished{
if(self.connectType == AiMouseConnectType_hid){
self.getMouseInfo = finished;
-// 0x05fff1fec09f0114ef
+ // 0x05fff1fec09f0114ef
uint8_t cmd = 0x0c;
uint8_t len = 0x00;
uint8_t tail = 0xEF;
}
}
+- (void)getSnInfo:(void (^)(TlwSnInfo *info,NSError *error))finished{
+ if(self.connectType == AiMouseConnectType_hid){
+ self.getSnInfo = finished;
+ uint8_t cmd = 0x12;
+ uint8_t len = 0x00;
+ uint8_t tail = 0xEF;
+
+ NSMutableData *mData = NSMutableData.data;
+ [mData appendData:[self getHidHeader]];
+ [mData appendBytes:&cmd length:1];
+ [mData appendBytes:&len length:1];
+ [mData appendBytes:&tail length:1];
+ [self sendToDevice:mData];
+ }
+ else if (self.connectType == AiMouseConnectType_bluetooth){
+ self.getSnInfo = finished;
+ uint8_t cmd = 0x12;
+ uint8_t dir = 0x01;
+ uint8_t len = 0x00;
+ NSMutableData *mData = NSMutableData.data;
+ [mData appendBytes:&cmd length:1];
+ [mData appendBytes:&dir length:1];
+ [mData appendBytes:&len length:1];
+ [self sendToDevice:mData];
+ }
+}
+
#pragma mark - ble
- (void)bleReceiveAiData:(NSData *)data{
[self.connectManager resetTimeOut];
}
-(void)bleReceiveDeviceData:(NSData *)data{
- NSData *typeData = [data subdataWithRange:NSMakeRange(0, 1)];
uint8 type;
- [typeData getBytes:&type length:1];
-
- NSData *stateData = [data subdataWithRange:NSMakeRange(1, 1)];
- uint8 state;
- [stateData getBytes:&state length:1];
- BOOL success = state == 0x02;
+ [ [data subdataWithRange:NSMakeRange(0, 1)] getBytes:&type length:1];
- NSData *lenData = [data subdataWithRange:NSMakeRange(2, 1)];
uint8 len;
- [lenData getBytes:&len length:1];
+ [[data subdataWithRange:NSMakeRange(1, 1)] getBytes:&len length:1];
switch (type) {
case 0x6A:
+ {
//语音开启回复
+ uint8 state;
+ [[data subdataWithRange:NSMakeRange(2, 1)] getBytes:&state length:1];
+ BOOL success = state == 0;
+
[self showLog:[NSString stringWithFormat:@"语音开启回复 %@",@(success)]];
self.openRecord(success, nil);
break;
+ }
case 0x6B:
+ {
//语音停止回复
+ uint8 state;
+ [[data subdataWithRange:NSMakeRange(2, 1)] getBytes:&state length:1];
+ BOOL success = state == 0;
[self showLog:[NSString stringWithFormat:@"语音停止回复 %@",@(success)]];
self.closeRecord(success, nil);
break;
+ }
case 0x96:
+ {
//设置DPI回复
+ uint8 state;
+ [[data subdataWithRange:NSMakeRange(2, 1)] getBytes:&state length:1];
+ BOOL success = state == 0;
[self showLog:[NSString stringWithFormat:@"设置DPI回复 %@",@(success)]];
self.setDpi(success, nil);
break;
+ }
case 0x9c:
{ //鼠标状态查询回复
uint16_t version;
info.batteryValue = batteryValue;
[self showLog:info.description];
self.getMouseInfo(info, nil);
- }
break;
+ }
case 0x9f:
{
//鼠标按键上报
NSData *subData = [data subdataWithRange:NSMakeRange(3, 1)];
[self sendCmdData:subData];
+ break;
}
+
+ case 0x22:
+ {
+ // 220210 48584D33303030313031E6FCFF68D7D000
+ NSString *code = [TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(2, 1)]];
+ NSString *brand = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(3, 6)] encoding:NSUTF8StringEncoding];
+ NSString *batch = [TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(9, 2)]];
+ NSString *sn = [TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(11, 6)]];
+ TlwSnInfo *info = [[TlwSnInfo alloc] init];
+ info.code = code;
+ info.brand = brand;
+ info.batch = batch;
+ info.sn = sn;
+ [self showLog:info.description];
+ self.getSnInfo(info, nil);
break;
+ }
+
default:
break;
}
#pragma mark - hid
- (void)hidReceiveDeviceData:(NSData *)data{
-// 0x05fff1fec09f0114ef
- if(data.length < 7){
+ // 0x05fff1fec09f0114ef
+ if(data.length < 7 ){
[self showLog:@"收到异常数据"];
return;
}
[self startRecord];
break;
}
-
+
case 0x6B:
{
//语音停止回复
uint8 state;
[[data subdataWithRange:NSMakeRange(6, 1)] getBytes:&state length:1];
BOOL success = state == 0x02;
-
+
[self showLog:[NSString stringWithFormat:@"语音停止回复 %@",@(success)]];
[self stopRecord];
self.closeRecord(success, nil);
uint8 state;
[[data subdataWithRange:NSMakeRange(6, 1)] getBytes:&state length:1];
BOOL success = state == 0x02;
-
+
[self showLog:[NSString stringWithFormat:@"设置DPI回复 %@",@(success)]];
self.setDpi(success, nil);
break;
info.batteryValue = batteryValue;
[self showLog:info.description];
self.getMouseInfo(info, nil);
- }
break;
+ }
+
case 0x9f:
{
NSData *subData = [data subdataWithRange:NSMakeRange(7, 1)];
uint8 cmd;
[subData getBytes:&cmd length:1];
-
+
if(cmd == 0x13 || cmd == 0x11 || cmd == 0x01 ||cmd == 0x09){
self.recordManager.startCmd = subData;
[self startRecord];
else if(cmd == 0x14 || cmd == 0x12 || cmd == 0x02 ||cmd == 0x10){
[self stopRecord];
}
+ break;
}
+
+ case 0x22:
+ { //sn查询回复
+ // 05FFF1FEC022 1048584D33303030313031E6FCFF68D7D0EF00000000000000000000000000000000000000000000000000000000000000000000000000000000
+ // 220210 48584D33303030313031E6FCFF68D7D000
+ data = [data subdataWithRange:NSMakeRange(4, data.length - 4)];
+ NSString *code = [TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(2, 1)]];
+ NSString *brand = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(3, 6)] encoding:NSUTF8StringEncoding];
+ NSString *batch = [TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(9, 2)]];
+ NSString *sn = [TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(11, 6)]];
+ TlwSnInfo *info = [[TlwSnInfo alloc] init];
+ info.code = code;
+ info.brand = brand;
+ info.batch = batch;
+ info.sn = sn;
+ [self showLog:info.description];
+ self.getSnInfo(info, nil);
break;
+ }
+
default:
break;
}
uint16_t head2 = 0xFFF1;
uint8_t head3 = 0xfe;
uint8_t head4 = 0x00;
-
+
NSMutableData *mData = NSMutableData.data;
[mData appendBytes:&head1 length:1];
[mData appendBytes:&head2 length:2];
}
-- (void)sendToDevice:(NSData *)data{
+- (void)sendToDevice:(NSMutableData *)data{
+ if (data.length < 64) {
+ NSInteger len = 64 - data.length;
+ for (NSInteger i = 0; i < len; i++) {
+ uint8_t d = 0x00;
+ [data appendBytes:&d length:1];
+ }
+ }
[self showLog:[NSString stringWithFormat:@"[send][info] %@",data]];
[self.delegate tlwMouseSendDeviceInfoData:data];
}
if([self.delegate respondsToSelector:@selector(tlwMouseConnectStateDidChange:)]) [self.delegate tlwMouseConnectStateDidChange:connected];
}
-(void)TlwConnectManagerReSendData:(TlwConnectManager *)manager{
-// __weak typeof(self) ws = self;
-// [self.deviceInfoManager getVersion:^(NSString * _Nonnull version, NSError * _Nonnull error) {
-// if (error.code == AiMouseErrorCode_timeOut) {
-// [ws.connectManager addTimeOut];
-// }
-// }];
+ // __weak typeof(self) ws = self;
+ // [self.deviceInfoManager getVersion:^(NSString * _Nonnull version, NSError * _Nonnull error) {
+ // if (error.code == AiMouseErrorCode_timeOut) {
+ // [ws.connectManager addTimeOut];
+ // }
+ // }];
}
-(void)TlwConnectManager:(TlwConnectManager *)manager outputLog:(NSString *)log{
[self showLog:log];
#pragma mark ------ 设备初始化
- (void)setupTimer{
[TimerManager shared].timerCallBack = ^{
- [self showLog:@"timer action。。。"];
+// [self showLog:@"timer action。。。"];
if(self.tlwSdk.connected || self.frkSdk.connected){
[self.ble stopScan];
// [self.hid close];
info.version = [NSString stringWithFormat:@"%d",deviceInfo.version];
info.CPI_list = CPI_list;// 1-4,800 1200 1800 2400
info.CPI = cpi;
- // info.CPI_list = @"1,2,3,4";// 1-4,800 1200 1800 2400
- // info.CPI = [NSString stringWithFormat:@"%d",deviceInfo.DPI];
- info.brand = @"NNMouse";
- info.sn = @"MSCL1BKZ12105000042371";
- info.mac = @"C0310000A583";
+// info.brand = @"NNMouse";
+// info.sn = @"MSCL1BKZ12105000042371";
+// info.mac = @"C0310000A583";
self.deviceInfo = info;
- [self showLog:info.description];
- finished(info,nil);
+ [self.tlwSdk getSnInfo:^(TlwSnInfo *snInfo, NSError *error) {
+ if( info != nil){
+ info.brand = snInfo.brand;
+ info.sn = snInfo.sn;
+ info.mac = snInfo.sn;
+ finished(info, nil);;
+ }
+ else{
+ finished(nil,error);
+ }
+ }];
}];
}
else{
/// 鼠标按键指令回调
/// - Parameter data: 数据。
-/// 前 单击0x06, 按下0x13(开始录音)抬起0x14(结束录音)
-/// 中 单击0x03, 按下0x11(开始录音)抬起0x12(结束录音)
-/// 后 第一次单击0x01, 第二次单击0x02(结束录音) , 按下0x09(开始录音)抬起0x10(结束录音)
+/// M 单击0x06, 按下0x13(开始录音)抬起0x14(结束录音)
+/// AI键 单击0x03, 按下0x11(开始录音)抬起0x12(结束录音)
+/// 语音键 第一次单击0x01, 第二次单击0x02(结束录音) , 按下0x09(开始录音)抬起0x10(结束录音)
/// 其他未定义
///
/// /// 鼠标按键指令回调 富瑞坤
/// - Parameter data: 数据。
-/// 前 单击43,按下27(开始录音)抬起28(结束录音)
-/// 中 单击42, 按下25(开始录音)抬起26(结束录音)
-/// 后 第一次单击31(开始录音), 第二次单击32(结束录音) , 按下21(开始录音)抬起22(结束录音)
+/// M 单击43,按下27(开始录音)抬起28(结束录音)
+/// AI键 单击42, 按下25(开始录音)抬起26(结束录音)
+/// 语音键 第一次单击31(开始录音), 第二次单击32(结束录音) , 按下21(开始录音)抬起22(结束录音)
///
/// 其他未定义
+
+//@"06":@"43",
+//@"13":@"27",
+//@"14":@"28",
+//
+//@"03":@"42",
+//@"11":@"25",
+//@"12":@"26",
+//
+//@"01":@"31",
+//@"02":@"32",
+//@"09":@"21",
+//@"10":@"22",
+
- (void)tlwMouseSendCmdData:(NSData *)data{
uint8 cmd;
[data getBytes:&cmd length:1];