18862BA72C806BD900D3564D /* hwcontext_qsv.h in Headers */ = {isa = PBXBuildFile; fileRef = 180E7C4B2BD8FC4E008558E8 /* hwcontext_qsv.h */; };
18862BA82C806BD900D3564D /* aes_ctr.h in Headers */ = {isa = PBXBuildFile; fileRef = 180E7C4D2BD8FC4E008558E8 /* aes_ctr.h */; };
18862BA92C806BD900D3564D /* vorbis_parser.h in Headers */ = {isa = PBXBuildFile; fileRef = 180E7C762BD8FC4E008558E8 /* vorbis_parser.h */; };
- 18862BAA2C806BD900D3564D /* TlwRecordManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18EF7AF12C7603E800AC5223 /* TlwRecordManager.h */; };
18862BAB2C806BD900D3564D /* avcodec.h in Headers */ = {isa = PBXBuildFile; fileRef = 180E7C622BD8FC4E008558E8 /* avcodec.h */; };
18862BAC2C806BD900D3564D /* pixdesc.h in Headers */ = {isa = PBXBuildFile; fileRef = 180E7C0C2BD8FC4E008558E8 /* pixdesc.h */; };
18862BAE2C806BD900D3564D /* AiMouseAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 18FCA3962C7F2AD100C44A37 /* AiMouseAuth.m */; };
18862BBC2C806BD900D3564D /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 184A70FE2BDA4C040025A332 /* AFNetworkReachabilityManager.m */; };
18862BBD2C806BD900D3564D /* AiRecordManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 180E7B4E2BD7BD81008558E8 /* AiRecordManager.m */; };
18862BBE2C806BD900D3564D /* TlwAudioManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7AF52C7603E800AC5223 /* TlwAudioManager.m */; };
- 18862BBF2C806BD900D3564D /* TlwRecordManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7AE82C7603E800AC5223 /* TlwRecordManager.m */; };
18862BC02C806BD900D3564D /* AiFrameManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 180E7B4D2BD7BD81008558E8 /* AiFrameManager.m */; };
18862BC12C806BD900D3564D /* AiAudioManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 180E7B512BD7BD82008558E8 /* AiAudioManager.m */; };
18862BC22C806BD900D3564D /* AiConnectManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 189C15852C05726600676A80 /* AiConnectManager.m */; };
18AD83262BFAE8B9009BDE3B /* AiDeviceInfoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AD83242BFAE8B9009BDE3B /* AiDeviceInfoManager.m */; };
18AD83292BFB22DE009BDE3B /* AiSender.h in Headers */ = {isa = PBXBuildFile; fileRef = 18AD83272BFB22DE009BDE3B /* AiSender.h */; };
18AD832A2BFB22DE009BDE3B /* AiSender.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AD83282BFB22DE009BDE3B /* AiSender.m */; };
- 18EF7AF72C7603E800AC5223 /* TlwRecordManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7AE82C7603E800AC5223 /* TlwRecordManager.m */; };
18EF7AF92C7603E800AC5223 /* adpcm.h in Headers */ = {isa = PBXBuildFile; fileRef = 18EF7AEA2C7603E800AC5223 /* adpcm.h */; };
18EF7AFA2C7603E800AC5223 /* TlwMouseSdk.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7AEB2C7603E800AC5223 /* TlwMouseSdk.m */; };
18EF7AFB2C7603E800AC5223 /* TlwTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7AEC2C7603E800AC5223 /* TlwTools.m */; };
18EF7AFC2C7603E800AC5223 /* TlwConnectManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7AED2C7603E800AC5223 /* TlwConnectManager.m */; };
18EF7AFD2C7603E800AC5223 /* TlwAudioManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18EF7AEE2C7603E800AC5223 /* TlwAudioManager.h */; };
- 18EF7B002C7603E800AC5223 /* TlwRecordManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18EF7AF12C7603E800AC5223 /* TlwRecordManager.h */; };
18EF7B012C7603E800AC5223 /* adpcm.c in Sources */ = {isa = PBXBuildFile; fileRef = 18EF7AF22C7603E800AC5223 /* adpcm.c */; };
18EF7B022C7603E800AC5223 /* TlwTools.h in Headers */ = {isa = PBXBuildFile; fileRef = 18EF7AF32C7603E800AC5223 /* TlwTools.h */; };
18EF7B032C7603E800AC5223 /* TlwMouseSdk.h in Headers */ = {isa = PBXBuildFile; fileRef = 18EF7AF42C7603E800AC5223 /* TlwMouseSdk.h */; settings = {ATTRIBUTES = (Public, ); }; };
18AD83242BFAE8B9009BDE3B /* AiDeviceInfoManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiDeviceInfoManager.m; sourceTree = "<group>"; };
18AD83272BFB22DE009BDE3B /* AiSender.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AiSender.h; sourceTree = "<group>"; };
18AD83282BFB22DE009BDE3B /* AiSender.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AiSender.m; sourceTree = "<group>"; };
- 18EF7AE82C7603E800AC5223 /* TlwRecordManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TlwRecordManager.m; sourceTree = "<group>"; };
18EF7AEA2C7603E800AC5223 /* adpcm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adpcm.h; sourceTree = "<group>"; };
18EF7AEB2C7603E800AC5223 /* TlwMouseSdk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TlwMouseSdk.m; sourceTree = "<group>"; };
18EF7AEC2C7603E800AC5223 /* TlwTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TlwTools.m; sourceTree = "<group>"; };
18EF7AED2C7603E800AC5223 /* TlwConnectManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TlwConnectManager.m; sourceTree = "<group>"; };
18EF7AEE2C7603E800AC5223 /* TlwAudioManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TlwAudioManager.h; sourceTree = "<group>"; };
- 18EF7AF12C7603E800AC5223 /* TlwRecordManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TlwRecordManager.h; sourceTree = "<group>"; };
18EF7AF22C7603E800AC5223 /* adpcm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = adpcm.c; sourceTree = "<group>"; };
18EF7AF32C7603E800AC5223 /* TlwTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TlwTools.h; sourceTree = "<group>"; };
18EF7AF42C7603E800AC5223 /* TlwMouseSdk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TlwMouseSdk.h; sourceTree = "<group>"; };
children = (
18EF7AF42C7603E800AC5223 /* TlwMouseSdk.h */,
18EF7AEB2C7603E800AC5223 /* TlwMouseSdk.m */,
- 18EF7AF12C7603E800AC5223 /* TlwRecordManager.h */,
- 18EF7AE82C7603E800AC5223 /* TlwRecordManager.m */,
18EF7AF32C7603E800AC5223 /* TlwTools.h */,
18EF7AEC2C7603E800AC5223 /* TlwTools.m */,
18EF7AF62C7603E800AC5223 /* TlwConnectManager.h */,
180E7CD52BD8FC4E008558E8 /* hwcontext_qsv.h in Headers */,
180E7CD72BD8FC4E008558E8 /* aes_ctr.h in Headers */,
180E7CFC2BD8FC4F008558E8 /* vorbis_parser.h in Headers */,
- 18EF7B002C7603E800AC5223 /* TlwRecordManager.h in Headers */,
180E7CE82BD8FC4E008558E8 /* avcodec.h in Headers */,
180E7C962BD8FC4E008558E8 /* pixdesc.h in Headers */,
);
18862BA72C806BD900D3564D /* hwcontext_qsv.h in Headers */,
18862BA82C806BD900D3564D /* aes_ctr.h in Headers */,
18862BA92C806BD900D3564D /* vorbis_parser.h in Headers */,
- 18862BAA2C806BD900D3564D /* TlwRecordManager.h in Headers */,
18862BAB2C806BD900D3564D /* avcodec.h in Headers */,
18862BAC2C806BD900D3564D /* pixdesc.h in Headers */,
);
184A710C2BDA4C050025A332 /* AFNetworkReachabilityManager.m in Sources */,
180E7BE42BD7BD84008558E8 /* AiRecordManager.m in Sources */,
18EF7B042C7603E800AC5223 /* TlwAudioManager.m in Sources */,
- 18EF7AF72C7603E800AC5223 /* TlwRecordManager.m in Sources */,
180E7BE32BD7BD84008558E8 /* AiFrameManager.m in Sources */,
180E7BE72BD7BD84008558E8 /* AiAudioManager.m in Sources */,
189C15872C05726600676A80 /* AiConnectManager.m in Sources */,
18862BBC2C806BD900D3564D /* AFNetworkReachabilityManager.m in Sources */,
18862BBD2C806BD900D3564D /* AiRecordManager.m in Sources */,
18862BBE2C806BD900D3564D /* TlwAudioManager.m in Sources */,
- 18862BBF2C806BD900D3564D /* TlwRecordManager.m in Sources */,
18862BC02C806BD900D3564D /* AiFrameManager.m in Sources */,
18862BC12C806BD900D3564D /* AiAudioManager.m in Sources */,
18862BC22C806BD900D3564D /* AiConnectManager.m in Sources */,
_logLevel = AiMouseLogLevel_none;
_authState = kIsNeedAuth ? AiMouseAuthState_Unknow:AiMouseAuthState_Success;
_connectType = AiMouseConnectType_bluetooth;
- NSLog(@"[AiMouseSdk]%@",[NSString stringWithFormat:@"AiMouseSdk_v%@",self.version]);
+// NSLog(@"[AiMouseSdk]%@",[NSString stringWithFormat:@"AiMouseSdk_v%@",self.version]);
+ [self.recordManager checkPermissions];
}
return self;
}
_connectType = type;
[self showLog:type == AiMouseConnectType_bluetooth?@"sdk切换到蓝牙模式":@"sdk切换到usb模式"];
[self aiConnectManager:nil connectStateDidChange:true];
- if (type == AiMouseConnectType_hid ) {
- [self.recordManager checkPermissions];
- }
+// if (type == AiMouseConnectType_hid ) {
+// [self.recordManager checkPermissions];
+// }
}
else{
if (self.connected) {
#pragma mark - deviceInfoManager
-(void)sendDeviceDataToSdk:(NSData *)data{
- if (data.length == 0) {
+ if (data.length == 0 || (data.length == 6 && [[AiMouseTools dataToHexString:data] hasSuffix:@"f77f"])) {
+ [self showLog:@"收到异常数据!!!"];
[self switchConnect:self.connectType isConnected:false];
return;
}
if (self.delegate && [self.delegate respondsToSelector:@selector(aiMouseAddLog:)]) {
[self.delegate aiMouseAddLog:[NSString stringWithFormat:@"[AiMouseSdk][frk]%@",log]];
}
- if(self.logLevel == AiMouseLogLevel_info){
- NSLog(@"[AiMouseSdk][frk]%@",log);
- }
+// if(self.logLevel == AiMouseLogLevel_info){
+// NSLog(@"[AiMouseSdk][frk]%@",log);
+// }
}
- (void)checkAuthState{
}
- (void)checkPermissions{
+ [self showLog:@"查询录音授权状态"];
switch ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio]) {
case AVAuthorizationStatusAuthorized:
self.isAllowRecord = true;
[self openSettings];
break;
}
+
+
+
}
- (void)openSettings{
#pragma mark - public
- (void)startScan{
NSArray<CBPeripheral *> *devices = [self.centralManager retrieveConnectedPeripheralsWithServices:@[[CBUUID UUIDWithString:kFrkServiceUUID],[CBUUID UUIDWithString:kTlwServiceUUID]]];
- [self showLog:[NSString stringWithFormat:@"查询配对过的设备%@",devices]];
+// [self showLog:[NSString stringWithFormat:@"查询配对过的设备%@",devices]];
if (devices.count > 0) {
[self showLog:[NSString stringWithFormat:@"配对匹配过的设备%@",devices[0].name]];
if (self.deviceInfoCha ==nil) {
return;
}
- [self showLog:[NSString stringWithFormat:@"向蓝牙设备发送数据 %@",data]];
+// [self showLog:[NSString stringWithFormat:@"向蓝牙设备发送数据 %@",data]];
if (self.productType == AiMouseProductType_tlw) {
[self.curentPeripheral writeValue:data forCharacteristic:self.deviceInfoCha type:CBCharacteristicWriteWithResponse];
[self.timer invalidate];
self.timer = nil;
}
- dispatch_async(dispatch_queue_create("timeoutQueue", DISPATCH_QUEUE_SERIAL), ^{
- self.timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:true];
- [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
- [[NSRunLoop currentRunLoop] run];
- });
+// dispatch_async(dispatch_queue_create("timeoutQueue", DISPATCH_QUEUE_SERIAL), ^{
+// self.timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:true];
+// [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
+// [[NSRunLoop currentRunLoop] run];
+// });
+// self.timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:true];
+ self.timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:true];
}
- (void)timerAction{
#import "BleManager.h"
#import "TlwMouseSdk.h"
#import "TimerManager.h"
+#import "AiMouseConfig.h"
@interface DeviceManger()<TlwMouseDelegate,AiMouseDelegate>
-@property (nonatomic, strong) AiMouseDeviceInfo *deviceInfo;
+
@property (nonatomic,strong) NSMutableData *recordData;//录音的数据
@property (nonatomic,strong) BleManager *ble;
@property (nonatomic,strong) HidManager *hid;
- (void)setupSDK{
self.tlwSdk = [[TlwMouse alloc] init];
[self.tlwSdk setDelegate:self];
- [self.tlwSdk setLogLevel:(TlwMouseLogLevel_info)];
+ [self.tlwSdk setLogLevel:(TlwMouseLogLevel_none)];
self.frkSdk = [AiMouse shared];
[self.frkSdk setDelegate:self];
- [self.frkSdk setLogLevel:AiMouseLogLevel_info];
+ [self.frkSdk setLogLevel:AiMouseLogLevel_none];
}
self.hid.logCallBack = ^(NSString * _Nonnull log) {
[ws showLog:log];
};
+ [self.hid open];
}
- (void)setupBle{
self.ble.connectStateCallBack = ^(NSString *name,BOOL connected) {
if (connected) {
- [ws.hid close];
+// [ws.hid close];
ws.productType = ws.ble.productType;
if (ws.ble.productType == AiMouseProductType_tlw) {
- (void)begainMonitorAiMouseConnectStateDidChange:(NSString *)mouseName callBack:(void(^)(int connectType, BOOL connected))callBack{
self.aiMouseConnectStateDidChangeCallBack = callBack;
[self.ble start];
+ [self.hid open];
}
///获取设备信息
- (void)getDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))finished{
- [self showLog:@"getDeviceInfo request"];
if (self.productType == AiMouseProductType_tlw) {
- [self.tlwSdk getDeviceInfo:^(TlwDeviceInfo *deviceInfo, NSError *error) {
- NSString *CPI_list = @"800,1200,1800,2400";// 1-4,800 1200 1800 2400
- NSString *cpi = [[CPI_list componentsSeparatedByString:@","] objectAtIndex:deviceInfo.DPI - 1];
-
- AiMouseDeviceInfo *info = [[AiMouseDeviceInfo alloc] init];
- info.battery_power = [NSString stringWithFormat:@"%d",deviceInfo.batteryValue] ;
- info.version = [NSString stringWithFormat:@"%d",deviceInfo.version];
- info.CPI_list = CPI_list;// 1-4,800 1200 1800 2400
- info.CPI = cpi;
-// info.brand = @"NNMouse";
-// info.sn = @"MSCL1BKZ12105000042371";
-// info.mac = @"C0310000A583";
- self.deviceInfo = info;
-
- [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);
- }
- }];
- }];
+ [self.tlwSdk getFullDeviceInfo:finished];
}
else{
[self.frkSdk getDeviceInfo:finished];
/// - Parameter data: 数据
-(void)tlwMouseSendDeviceInfoData:(NSData *)data{
if (self.tlwSdk.connectType == AiMouseConnectType_bluetooth) {
+// [self showLog:@"send to ble"];
[self.ble writeToDevice:data];
}
else if (self.tlwSdk.connectType == AiMouseConnectType_hid){
+// [self showLog:@"send to usb"];
[self.hid writeToDevice:data];
}
}
}
/// hid错误
-(void)tlwHidDataError{
- [self.hid open];
+// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+// [self.hid open];
+// });
}
/// 输出日志
- (void)tlwMouseAddLog:(NSString *)log {
- if (self.aiMouseAddLogCallBack) {
- self.aiMouseAddLogCallBack(log);
- }
+ [self showLog:log];
}
#pragma mark - AiMouseDelegate
/// 输出sdk日志
/// - Parameter log: 日志
- (void)aiMouseAddLog:(NSString *)log{
- if (self.aiMouseAddLogCallBack) {
- self.aiMouseAddLogCallBack(log);
- }
+ [self showLog:log];
}
/// hid数据异常,需要重新开启监听usb设备
}
#pragma mark - other
- (void)showLog:(NSString *)log{
+ if (self.aiMouseAddLogCallBack) {
+ self.aiMouseAddLogCallBack(log);
+ }
NSLog(@"[AiMouseSdk] %@",log);
}
- (void)open;
-- (void)close;
+//- (void)close;
//写入数据
-(void)writeToDevice:(NSData *)data;
- (instancetype)init{
self = [super init];
if (self) {
-
+
}
return self;
}
/// 匹配到设备回调
static void hidAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef inIOHIDDeviceRef) {
if ([DeviceManger shared].isConneted) {
- [[HidManager shared] showLog:(@"当前处于连接状态,对监听到有USB 插入 的事件不做处理")];
+// [[HidManager shared] showLog:(@"当前处于连接状态,对监听到有USB 插入 的事件不做处理")];
return;
}
uint32_t pid = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDProductIDKey));
uint32_t vid = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDVendorIDKey));
- [[HidManager shared] showLog:([NSString stringWithFormat:@"发现设备 %@",inIOHIDDeviceRef])];
+ uint32_t PrimaryUsagePage = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDPrimaryUsagePageKey));
+ uint32_t PrimaryUsage = IOHIDDevGetUInt32Property(inIOHIDDeviceRef, CFSTR(kIOHIDPrimaryUsageKey));
+
if(vid == 0x10D6 && pid == 0xB008){
+ [[HidManager shared] showLog:([NSString stringWithFormat:@"发现设备%@,pid = %d,vid = %d ,page = %d, usage = %d",inIOHIDDeviceRef,pid,vid,PrimaryUsagePage,PrimaryUsage])];
[HidManager shared].productType = AiMouseProductType_tlw;
[HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
//注册消息回调
unsigned char InputBuffer[64];
IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), &hidReceiveData, NULL);
-
+
IOReturn result = IOHIDDeviceOpen([HidManager shared].deviceInfoCha, kIOHIDOptionsTypeNone);
if (result != kIOReturnSuccess) {
[[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备失败! %d",result]];
}else{
[[HidManager shared] showLog:@"打开设备成功!"];
- [HidManager shared].connectStateCallBack(true) ;
+// [HidManager shared].connectStateCallBack(true) ;
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+ [HidManager shared].connectStateCallBack(true);
+ });
}
- CFRetain([HidManager shared].deviceInfoCha);
- IOHIDDeviceScheduleWithRunLoop([HidManager shared].deviceInfoCha, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+// CFRetain([HidManager shared].deviceInfoCha);
+// IOHIDDeviceScheduleWithRunLoop([HidManager shared].deviceInfoCha, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
}
else if(vid == 0x6675 && pid == 0x8601){
[HidManager shared].productType = AiMouseProductType_frk;
if (result != kIOReturnSuccess) {
[[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备信息失败! %d",result]];
}else{
- CFRetain(inIOHIDDeviceRef);
- IOHIDDeviceScheduleWithRunLoop(inIOHIDDeviceRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+// CFRetain(inIOHIDDeviceRef);
+// IOHIDDeviceScheduleWithRunLoop(inIOHIDDeviceRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
[HidManager shared].deviceInfoCha = inIOHIDDeviceRef;
[[HidManager shared] showLog:@"打开设备信息成功!"];
else if(PrimaryUsagePage == 65283 && PrimaryUsage == 0){
unsigned char InputBuffer[128];
IOHIDDeviceRegisterInputReportCallback(inIOHIDDeviceRef, InputBuffer, sizeof(InputBuffer), hidReceiveData, NULL);
-
+
IOReturn result = IOHIDDeviceOpen(inIOHIDDeviceRef, kIOHIDOptionsTypeNone);
if (result != kIOReturnSuccess) {
[[HidManager shared] showLog:[NSString stringWithFormat:@"打开设备voice失败! %d",result]];
}else{
- CFRetain(inIOHIDDeviceRef);
- IOHIDDeviceScheduleWithRunLoop(inIOHIDDeviceRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
+// CFRetain(inIOHIDDeviceRef);
+// IOHIDDeviceScheduleWithRunLoop(inIOHIDDeviceRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
[HidManager shared].voiceCha = inIOHIDDeviceRef;
[[HidManager shared] showLog:@"打开设备voice成功!"];
[[HidManager shared] showLog:[NSString stringWithFormat:@"拔出设备 %@ ",inIOHIDDeviceRef]];
if([HidManager shared].deviceInfoCha){
- [[HidManager shared] close];
+ [HidManager shared].deviceInfoCha = nil;
+ [HidManager shared].voiceCha = nil;
+ [HidManager shared].hidManager = nil;
[HidManager shared].connectStateCallBack(false) ;
}
}
static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDReportType type, uint32_t reportID, uint8_t *report,CFIndex reportLength){
-
+
if([HidManager shared].productType == AiMouseProductType_tlw){
if (report[0] == 0x01 || report[0] == 0x02) {
//鼠标键盘活动事件
return;
}
- NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
- [[HidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data]];
- [HidManager shared].receiveInfoDataCallBack(data);
+ uint32_t primaryUsagePage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsagePageKey));
+ uint32_t primaryUsage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsageKey));
+
+ if(primaryUsagePage == 1 && primaryUsage == 2){
+ NSData *data = [[NSData alloc] initWithBytes:report length:reportLength];
+// [[HidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data]];
+ [HidManager shared].receiveInfoDataCallBack(data);
+ }
}
else{
NSData *data1 = [[NSData alloc] initWithBytes:report length:reportLength];
- [[HidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data1]];
+// [[HidManager shared] showLog:[NSString stringWithFormat:@"receive = %@",data1]];
NSInteger len = get_data_len(report, reportLength);
NSData *data = [[NSData alloc] initWithBytes:report length:len];
uint32_t PrimaryUsagePage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsagePageKey));
uint32_t PrimaryUsage = IOHIDDevGetUInt32Property(sender, CFSTR(kIOHIDPrimaryUsageKey));
-
+
if(PrimaryUsagePage == 1 && PrimaryUsage == 0){
[[AiMouse shared] sendDeviceDataToSdk:data];
}
[self close];
//初始化
self.deviceInfoCha = nil;
- self.voiceCha = nil;
+ self.voiceCha = nil;
self.hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
IOHIDManagerScheduleWithRunLoop(self.hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
IOReturn ret = IOHIDManagerOpen(self.hidManager, 0L);
[self showLog:(@"打开hid成功!")];
}
//设置匹配设备
-// ////供应商id
-// const long vendorID = 0x6675;
-// //产品id
-// const long productID = 0x8601;
-// //供应商id
-// const long vendorID = 0x10D6;
-// //产品id
-// const long productID = 0xB008;
+ // ////供应商id
+ // const long vendorID = 0x6675;
+ // //产品id
+ // const long productID = 0x8601;
+ // //供应商id
+ // const long vendorID = 0x10D6;
+ // //产品id
+ // const long productID = 0xB008;
NSMutableDictionary* dict= [NSMutableDictionary dictionary];
-// [dict setValue:[NSNumber numberWithLong:productID] forKey:[NSString stringWithCString:kIOHIDProductIDKey encoding:NSUTF8StringEncoding]];
-// [dict setValue:[NSNumber numberWithLong:vendorID] forKey:[NSString stringWithCString:kIOHIDVendorIDKey encoding:NSUTF8StringEncoding]];
+ // [dict setValue:[NSNumber numberWithLong:productID] forKey:[NSString stringWithCString:kIOHIDProductIDKey encoding:NSUTF8StringEncoding]];
+ // [dict setValue:[NSNumber numberWithLong:vendorID] forKey:[NSString stringWithCString:kIOHIDVendorIDKey encoding:NSUTF8StringEncoding]];
IOHIDManagerSetDeviceMatching(self.hidManager, (__bridge CFMutableDictionaryRef)dict);
//设置匹配到设备回调
IOHIDManagerRegisterDeviceMatchingCallback(self.hidManager, &hidAppearDevice, NULL);
return;
}
[self showLog:@"关闭hid"];
+
+
+// if (self.deviceInfoCha ) {
+// IOReturn result = IOHIDDeviceSetReport(self.deviceInfoCha, kIOHIDReportTypeInput, 0, NULL, 0);
+// if (result!= kIOReturnSuccess) {
+// [self showLog:(@"关闭deviceInfoCha 失败!")];
+// return;
+// }
+// }
+// if (self.voiceCha ) {
+// IOReturn result = IOHIDDeviceSetReport(self.voiceCha, kIOHIDReportTypeInput, 0, NULL, 0);
+// if (result!= kIOReturnSuccess) {
+// [self showLog:(@"关闭 voiceCha 失败!")];
+// return;
+// }
+// }
+
IOReturn ret = IOHIDManagerClose(self.hidManager, 0);
self.hidManager = nil;
[self showLog:(@"关闭hid失败!")];
}else{
[self showLog:(@"关闭hid成功!")];
+ self.deviceInfoCha = nil;
+ self.voiceCha = nil;
+ self.hidManager = nil;
}
- self.deviceInfoCha = nil;
- self.voiceCha = nil;
}
/// 发送数据给设备
-(void)writeToDevice:(NSData *)data{
+// [self showLog:[NSString stringWithFormat:@"hid收到数据:%@",data]];
if(self.deviceInfoCha == nil){
[self showLog:@"sendData: 请先连上设备"];
return;
}
- [self showLog:[NSString stringWithFormat:@"向usb设备发送数据 %@",data]];
+// [self showLog:[NSString stringWithFormat:@"向usb设备发送数据 %@",data]];
IOReturn ret = IOHIDDeviceSetReport(self.deviceInfoCha, kIOHIDReportTypeOutput, 0, data.bytes, data.length);
if (ret != kIOReturnSuccess) {
[self showLog:[NSString stringWithFormat:@"发送失败! code = %d",ret]];
}else{
- [self showLog:@"发送成功!"];
+// [self showLog:@"发送成功!"];
}
}
#pragma mark - timer
- (void)addSendTimer{
- dispatch_async(dispatch_queue_create("timeoutQueue", DISPATCH_QUEUE_SERIAL), ^{
- self.timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(timerAction) userInfo:nil repeats:true];
- [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
- [[NSRunLoop currentRunLoop] run];
- });
+// dispatch_async(dispatch_queue_create("timeoutQueue", DISPATCH_QUEUE_SERIAL), ^{
+// self.timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(timerAction) userInfo:nil repeats:true];
+// [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
+// [[NSRunLoop currentRunLoop] run];
+// });
+ self.timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:true];
}
- (void)timerAction{
@property (nonatomic, weak) id<TlwMouseDelegate> delegate;/// 代理
@property (nonatomic, readonly) AiMouseConnectType connectType;//连接类型
@property (nonatomic, readonly) BOOL connected;//是否已连接
-//
-///// 单利
-//+(TlwMouse *)shared;
/// 设置日志等级
/// - Parameter level: 等级
/// - Parameter completation: 如果获取成功,则deviceInfo有值,否则为nil
- (void)getDeviceInfo:(void (^)(TlwDeviceInfo *deviceInfo,NSError *error))finished;
+/// 获取设备信息
+/// - Parameter completation: 如果获取成功,则deviceInfo有值,否则为nil
+- (void)getFullDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))finished;
+
/// 获取sn信息
/// - Parameter completation: 如果获取成功,则info有值,否则为nil
- (void)getSnInfo:(void (^)(TlwSnInfo *info,NSError *error))finished;
#import "TlwMouseSdk.h"
#import "TlwAudioManager.h"
#import "TlwTools.h"
-#import "TlwRecordManager.h"
-#import "TlwConnectManager.h"
-
+#import "AiRecordManager.h"
@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];
+ NSString *info = [NSString stringWithFormat:@"version = %d DPI = %d batteryState = %d batteryValue = %d",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];
+ NSString *info = [NSString stringWithFormat:@"code = %@ brand = %@ batch = %@ sn = %@",self.code,self.brand,self.batch,self.sn];
return info;
}
@end
-@interface TlwMouse()<TlwConnectManagerDelegate>
+@interface TlwMouse()
@property (nonatomic, assign) TlwMouseLogLevel logLevel;
@property (nonatomic, strong) TlwAudioManager *audioManager;
-@property (nonatomic, strong) TlwRecordManager *recordManager;
-@property (nonatomic, strong) TlwConnectManager *connectManager;
+@property (nonatomic, strong) AiRecordManager *recordManager;
+
+@property (nonatomic,strong)void (^openRecordCallBack)(BOOL isSuccess,NSError *error);
+@property (nonatomic,strong)void (^closeRecordCallBaack)(BOOL isSuccess,NSError *error);
+@property (nonatomic,strong)void (^setDpiCallBack)(BOOL isSuccess,NSError *error);
+@property (nonatomic,strong)void (^getMouseInfoCallBack)(TlwDeviceInfo *deviceInfo,NSError *error);
+@property (nonatomic,strong)void (^getSnInfoCallBack)(TlwSnInfo *snInfo,NSError *error);
-@property (nonatomic,strong)void (^openRecord)(BOOL isSuccess,NSError *error);
-@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);
+@property (nonatomic,strong)void (^getFullInfoCallBack)(AiMouseDeviceInfo *info,NSError *error);
+@property (nonatomic,strong)AiMouseDeviceInfo *fullInfo;
+@property (nonatomic,assign)NSInteger questTimes;
@end
@implementation TlwMouse
-//+(TlwMouse *)shared{
-// static TlwMouse *manager = nil;
-// static dispatch_once_t oncePredicate;
-// dispatch_once(&oncePredicate, ^{
-// manager = [[TlwMouse alloc]init];
-// });
-// return manager;
-//}
-(instancetype)init{
if (self = [super init]) {
_logLevel = TlwMouseLogLevel_none;
_connectType = AiMouseConnectType_bluetooth;
- [self.connectManager start];
NSLog(@"[TlwMouseSdk]%@",[NSString stringWithFormat:@"AiMouseSdk_v%@",self.version]);
+ [self.recordManager checkPermissions];
}
return self;
}
return _audioManager;
}
-- (TlwRecordManager *)recordManager{
+- (AiRecordManager *)recordManager{
if (!_recordManager) {
- _recordManager = [[TlwRecordManager alloc] init];
+ _recordManager = [[AiRecordManager alloc] init];
__weak typeof(self) ws = self;
_recordManager.didRecordData = ^(NSData * _Nonnull data) {
[ws showLog:[NSString stringWithFormat:@"%@",data]];
}
return _recordManager;
}
-
-//-(TlwConnectManager *)connectManager{
-// if (!_connectManager) {
-// _connectManager = [[TlwConnectManager alloc] init];
-// _connectManager.delegate = self;
-// }
-// return _connectManager;
-//}
+- (void)sendOpenCmd{
+ uint8_t cmd = 0x0D;
+ 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];
+}
+- (void)sendDongleCmd{
+ uint8_t cmd = 0x01;
+ 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];
+}
#pragma mark - pub Api
- (void)setLogLevel:(TlwMouseLogLevel)level{
- (void)didDisconnect{
_connected = false;
[self stopRecord];
-// [self.connectManager disConnected];
}
- (void)switchConnect:(AiMouseConnectType)type isConnected:(BOOL)isConneted{
- if(isConneted ){
- _connected = true;
- _connectType = type;
- [self showLog:type == AiMouseConnectType_bluetooth?@"sdk切换到蓝牙模式":@"sdk切换到usb模式"];
- [self TlwConnectManager:self.connectManager connectStateDidChange:true];
- if (type == AiMouseConnectType_hid ) {
- [self.recordManager checkPermissions];
- }
+ if(isConneted ){
+ _connected = true;
+ _connectType = type;
+ [self showLog:type == AiMouseConnectType_bluetooth?@"sdk切换到蓝牙模式":@"sdk切换到usb模式"];
+ [self TlwConnectManager:nil connectStateDidChange:true];
+ if (type == AiMouseConnectType_hid ) {
+ [self.recordManager checkPermissions];
+ [self sendOpenCmd];
+ [self sendDongleCmd];
}
- else{
- [self stopRecord];
- if (self.connected) {
- _connected = false;
- [self TlwConnectManager:self.connectManager connectStateDidChange:false];
- }
+ }
+ else{
+ [self stopRecord];
+ if (self.connected) {
+ _connected = false;
+ [self TlwConnectManager:nil connectStateDidChange:false];
}
+ }
}
- (void)sendAiDataToSdk:(NSData *)data{
- [self.connectManager resetTimeOut];
-
[self showLog:[NSString stringWithFormat:@"[receive][Voice] %@",data]];
if(self.connectType == AiMouseConnectType_hid){
}
}
-(void)sendDeviceDataToSdk:(NSData *)data{
- [self showLog:[NSString stringWithFormat:@"[receive][info] %@",[TlwTools dataToHexString:data]]];
if(self.connectType == AiMouseConnectType_hid){
+ [self showLog:[NSString stringWithFormat:@"[receive][usb][info] %@",[TlwTools dataToHexString:data]]];
[self hidReceiveDeviceData:data];
}
else if (self.connectType == AiMouseConnectType_bluetooth){
+ [self showLog:[NSString stringWithFormat:@"[receive][ble][info] %@",[TlwTools dataToHexString:data]]];
[self bleReceiveDeviceData:data];
}
}
- (void)openRecord:(void (^)(BOOL isSuccess,NSError *error))finished{
if(self.connectType == AiMouseConnectType_hid){
- self.openRecord = finished;
+ self.openRecordCallBack = finished;
uint8_t cmd = 0x03;
uint8_t len = 0x00;
uint8_t tail = 0xEF;
[self sendToDevice:mData];
}
else if (self.connectType == AiMouseConnectType_bluetooth){
- self.openRecord = finished;
+ self.openRecordCallBack = finished;
uint8_t cmd = 0x03;
uint8_t dir = 0x01;
uint8_t len = 0x00;
}
- (void)closeRecord:(void (^)(BOOL isSuccess,NSError *error))finished{
if(self.connectType == AiMouseConnectType_hid){
- self.closeRecord = finished;
+ self.closeRecordCallBaack = finished;
uint8_t cmd = 0x04;
uint8_t len = 0x00;
uint8_t tail = 0xEF;
[self sendToDevice:mData];
}
else if (self.connectType == AiMouseConnectType_bluetooth){
- self.closeRecord = finished;
+ self.closeRecordCallBaack = finished;
uint8_t cmd = 0x04;
uint8_t dir = 0x01;
uint8_t len = 0x00;
- (void)setDPI:(uint8_t)value completation:(void (^)(BOOL isSuccess,NSError *error))finished{
if(self.connectType == AiMouseConnectType_hid){
- self.setDpi = finished;
+ self.setDpiCallBack = finished;
uint8_t type = 0x06;
uint8_t len = 0x01;
uint8_t tail = 0xEF;
[self sendToDevice:mData];
}
else if (self.connectType == AiMouseConnectType_bluetooth){
- self.setDpi = finished;
+ self.setDpiCallBack = finished;
uint8_t cmd = 0x06;
uint8_t dir = 0x01;
uint8_t len = 0x01;
}
- (void)getDeviceInfo:(void (^)(TlwDeviceInfo *deviceInfo,NSError *error))finished{
if(self.connectType == AiMouseConnectType_hid){
- self.getMouseInfo = finished;
+ self.getMouseInfoCallBack = finished;
// 0x05fff1fec09f0114ef
uint8_t cmd = 0x0c;
uint8_t len = 0x00;
[self sendToDevice:mData];
}
else if (self.connectType == AiMouseConnectType_bluetooth){
- self.getMouseInfo = finished;
+ self.getMouseInfoCallBack = finished;
uint8_t cmd = 0x0c;
uint8_t dir = 0x01;
uint8_t len = 0x00;
- (void)getSnInfo:(void (^)(TlwSnInfo *info,NSError *error))finished{
if(self.connectType == AiMouseConnectType_hid){
- self.getSnInfo = finished;
+ self.getSnInfoCallBack = finished;
uint8_t cmd = 0x12;
uint8_t len = 0x00;
uint8_t tail = 0xEF;
[self sendToDevice:mData];
}
else if (self.connectType == AiMouseConnectType_bluetooth){
- self.getSnInfo = finished;
+ self.getSnInfoCallBack = finished;
uint8_t cmd = 0x12;
uint8_t dir = 0x01;
uint8_t len = 0x00;
}
}
+
+- (void)getFullDeviceInfo:(void (^)(AiMouseDeviceInfo *deviceInfo,NSError *error))finished{
+ self.getFullInfoCallBack = finished;
+ self.questTimes = 0;
+ [self checkFullInfoAction];
+}
+
+- (void)checkFullInfoAction{
+ self.questTimes++;
+ if (self.questTimes > 3) {
+ [self switchConnect:AiMouseConnectType_hid isConnected:false ];
+ return;
+ }
+ if (self.getFullInfoCallBack) {
+ [self reGetFullInfoAction];
+ }
+}
+- (void)reGetFullInfoAction{
+ __weak typeof(self) ws = self;
+ [self getDeviceInfo:^(TlwDeviceInfo *deviceInfo, NSError *error) {
+ if(deviceInfo != nil){
+ NSString *CPI_list = @"800,1200,1800,2400";// 1-4,800 1200 1800 2400
+ NSString *cpi = [[CPI_list componentsSeparatedByString:@","] objectAtIndex:deviceInfo.DPI - 1];
+
+ AiMouseDeviceInfo *info = [[AiMouseDeviceInfo alloc] init];
+ info.battery_power = [NSString stringWithFormat:@"%d",deviceInfo.batteryValue] ;
+ info.version = [NSString stringWithFormat:@"%d",deviceInfo.version];
+ info.CPI_list = CPI_list;// 1-4,800 1200 1800 2400
+ info.CPI = cpi;
+ ws.fullInfo = info;
+
+ [ws getSnInfo:^(TlwSnInfo *snInfo, NSError *error) {
+ if( info != nil){
+ info.brand = snInfo.brand;
+ info.sn = snInfo.sn;
+ info.mac = snInfo.sn;
+ [ws showLog:info.description];
+ if(ws.getFullInfoCallBack)ws.getFullInfoCallBack(info, nil);
+ ws.getFullInfoCallBack = nil;
+ }
+ else{
+ if(ws.getFullInfoCallBack)ws.getFullInfoCallBack(nil,error);
+ }
+ }];
+ }
+ else{
+ if(ws.getFullInfoCallBack) ws.getFullInfoCallBack(nil,error);
+ }
+ }];
+
+ [self performSelector:@selector(checkFullInfoAction) withObject:nil afterDelay:1];
+}
#pragma mark - ble
- (void)bleReceiveAiData:(NSData *)data{
- [self.connectManager resetTimeOut];
[self.audioManager receiveData:data];
}
BOOL success = state == 0;
[self showLog:[NSString stringWithFormat:@"语音开启回复 %@",@(success)]];
- self.openRecord(success, nil);
+ if(self.openRecordCallBack)self.openRecordCallBack(success, nil);
break;
}
case 0x6B:
[[data subdataWithRange:NSMakeRange(2, 1)] getBytes:&state length:1];
BOOL success = state == 0;
[self showLog:[NSString stringWithFormat:@"语音停止回复 %@",@(success)]];
- self.closeRecord(success, nil);
+ if(self.closeRecordCallBaack)self.closeRecordCallBaack(success, nil);
break;
}
case 0x96:
[[data subdataWithRange:NSMakeRange(2, 1)] getBytes:&state length:1];
BOOL success = state == 0;
[self showLog:[NSString stringWithFormat:@"设置DPI回复 %@",@(success)]];
- self.setDpi(success, nil);
+ if(self.setDpiCallBack)self.setDpiCallBack(success, nil);
break;
}
case 0x9c:
info.batteryState = batteryState;
info.batteryValue = batteryValue;
[self showLog:info.description];
- self.getMouseInfo(info, nil);
+ if(self.getMouseInfoCallBack)self.getMouseInfoCallBack(info, nil);
break;
}
case 0x9f:
info.batch = batch;
info.sn = sn;
[self showLog:info.description];
- self.getSnInfo(info, nil);
+ if(self.getSnInfoCallBack)self.getSnInfoCallBack(info, nil);
break;
}
// 0x05fff1fec09f0114ef
if(data.length < 7 ){
[self showLog:@"收到异常数据"];
- [self switchConnect:AiMouseConnectType_hid isConnected:false ];
- [self.delegate tlwHidDataError];
+ // [self switchConnect:AiMouseConnectType_hid isConnected:false ];
return;
}
if(![[[TlwTools dataToHexString:[data subdataWithRange:NSMakeRange(1, 2)]] lowercaseString] isEqualToString:@"fff1"]){
[self showLog:@"收到异常数据"];
- [self switchConnect:AiMouseConnectType_hid isConnected:false ];
- [self.delegate tlwHidDataError];
+ // [self switchConnect:AiMouseConnectType_hid isConnected:false ];
return;
}
[[data subdataWithRange:NSMakeRange(6, 1)] getBytes:&state length:1];
BOOL success = state == 0x02;
[self showLog:[NSString stringWithFormat:@"语音开启回复 %@",@(success)]];
- self.openRecord(true, nil);
+ if(self.openRecordCallBack)self.openRecordCallBack(true, nil);
[self startRecord];
break;
}
[self showLog:[NSString stringWithFormat:@"语音停止回复 %@",@(success)]];
[self stopRecord];
- self.closeRecord(true, nil);
+ if(self.closeRecordCallBaack)self.closeRecordCallBaack(success, nil);
break;
}
case 0x96:
BOOL success = state == 0x02;
[self showLog:[NSString stringWithFormat:@"设置DPI回复 %@",@(success)]];
- self.setDpi(true, nil);
+ if(self.setDpiCallBack)self.setDpiCallBack(true, nil);
break;
}
case 0x9c:
info.batteryState = batteryState;
info.batteryValue = batteryValue;
[self showLog:info.description];
- self.getMouseInfo(info, nil);
+ if(self.getMouseInfoCallBack)self.getMouseInfoCallBack(info, nil);
break;
}
+ case 0x9d:
+ {
+ uint16_t version;
+ [[data subdataWithRange:NSMakeRange(7, 2)] getBytes:&version length:2];
+ uint8_t state;
+ [[data subdataWithRange:NSMakeRange(9, 1)] getBytes:&state length:1];
+
+ [self showLog:[NSString stringWithFormat:@"dongle version = %d,bind = %d",version,state]];
+ break;
+ }
case 0x9f:
{
NSData *subData = [data subdataWithRange:NSMakeRange(7, 1)];
info.batch = batch;
info.sn = sn;
[self showLog:info.description];
- self.getSnInfo(info, nil);
+ if(self.getSnInfoCallBack)self.getSnInfoCallBack(info, nil);
break;
}
}
- (NSData *)getHidHeader{
uint8_t head1 = 0x05;
- uint16_t head2 = 0xFFF1;
+ uint16_t head2 = 0xF1FF;
uint8_t head3 = 0xfe;
uint8_t head4 = 0x00;
- (void)showLog:(NSString *)log{
if (self.delegate && [self.delegate respondsToSelector:@selector(tlwMouseAddLog:)]) {
- [self.delegate tlwMouseAddLog:[NSString stringWithFormat:@"[AiMouseSdk][tlw]%@",log]];
- }
- if(self.logLevel == TlwMouseLogLevel_info){
- NSLog(@"[AiMouseSdk][tlw]%@",log);
+ [self.delegate tlwMouseAddLog:[NSString stringWithFormat:@"[AiMouseSdk][tlw] %@",log]];
}
+ // if(self.logLevel == TlwMouseLogLevel_info){
+ // NSLog(@"[AiMouseSdk][tlw]%@",log);
+ // }
}
[data appendBytes:&d length:1];
}
}
- [self showLog:[NSString stringWithFormat:@"[send][info] %@",data]];
+ [self showLog:[NSString stringWithFormat:@"[send][info] %@",[TlwTools dataToHexString:data]]];
[self.delegate tlwMouseSendDeviceInfoData:data];
}
#pragma mark - deviceInfo
}
#pragma mark - TlwConnectManagerDelegate
--(void)TlwConnectManager:(TlwConnectManager *)manager connectStateDidChange:(BOOL)connected{
+-(void)TlwConnectManager:(NSString *)manager connectStateDidChange:(BOOL)connected{
_connected = connected;
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];
- // }
- // }];
-}
--(void)TlwConnectManager:(TlwConnectManager *)manager outputLog:(NSString *)log{
- [self showLog:log];
-}
- (NSString *)getBrand:(NSData *)data{
- NSMutableString *mText = [[NSMutableString alloc] init];
NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
for (NSInteger i = 0; i < text.length;i++) {
if ([[text substringWithRange:NSMakeRange(i, 1)] isEqual:@"0"]) {
return [text substringWithRange:NSMakeRange(0, i)];
}
}
-
return text;
}
@end
+++ /dev/null
-//
-// TlwRecordManager.h
-// AudioRecorder
-//
-// Created by incar on 2024/3/29.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface TlwRecordManager : NSObject
-@property (nonatomic,assign)BOOL recording;
-@property (nonatomic,strong)NSData *startCmd;
-@property (nonatomic,readonly)NSData *stopCmd;
-@property (nonatomic,strong)void (^didRecordData)(NSData *data);
-
-- (void)checkPermissions;
-
-- (void)start;
-
-- (void)stop;
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// TlwRecordManager.m
-// AudioRecorder
-//
-// Created by incar on 2024/3/29.
-//
-
-#import "TlwRecordManager.h"
-#import <AVFoundation/AVFoundation.h>
-
-@interface TlwRecordManager()
-@property (nonatomic,assign)BOOL isAllowRecord;
-@property (nonatomic,strong)AVAudioEngine *audioEngine;
-@property (nonatomic,strong)AVAudioFile *outputFile;
-
-@end
-
-@implementation TlwRecordManager
-//+(TlwRecordManager *)shared{
-// static TlwRecordManager *manager = nil;
-// static dispatch_once_t oncePredicate;
-// dispatch_once(&oncePredicate, ^{
-// manager = [[TlwRecordManager alloc]init];
-// });
-// return manager;
-//}
-
-
--(instancetype)init{
- if (self = [super init ]) {
- self.isAllowRecord = false;
-// [self checkPermissions];
- }
- return self;
-}
-
-- (void)start{
- if (self.isAllowRecord == false) {
- return;
- }
- // let audioSession = AVAudioSession.sharedInstance()
- // do {
- // try audioSession.setCategory(.playAndRecord, options: .defaultToSpeaker)
- // try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
- // catch let error as NSError {
- // print("ERROR:", error)
- // }
- self.recording = true;
-
- self.audioEngine = [[AVAudioEngine alloc] init];
- AVAudioInputNode *input = self.audioEngine.inputNode;
- AVAudioNodeBus bus = 0;
- AVAudioFormat *inputFormat = [input inputFormatForBus:bus];
- // NSString *fullPath = [NSString stringWithFormat:@"%@1.pcm",NSTemporaryDirectory()];
- // NSURL *fileURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject URLByAppendingPathComponent:@"record.caf"];
- // [self showLog:fileURL.absoluteString];
- // NSError *err0;
- // self.outputFile = [[AVAudioFile alloc] initForWriting:fileURL settings:inputFormat.settings commonFormat:inputFormat.commonFormat interleaved:inputFormat.isInterleaved error:&err0];
- // if (err0) {
- // [self showLog:[NSString stringWithFormat:@"设置写入路径 %@", err0.description]];
- // }
- // else{
- // [self showLog:@"写入路径设置成功"];
- // }
- // self.recordData = [[NSMutableData alloc] init];
- __weak typeof(self) ws = self;
- [input installTapOnBus:bus bufferSize:32 format:inputFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
- NSData *data = [ws pcm_downsample:buffer];
- if (ws.didRecordData) {
- ws.didRecordData(data);
- }
-// NSLog(@"%@",data);
-// NSError *err0;
- // [ws.outputFile writeFromBuffer:buffer error:&err0];
- // if (err0) {
- // [self showLog:[NSString stringWithFormat:@"写入失败 %@", err0.description]];
- // }
- // else{
- // [self showLog:@"写入成功"];
- // }
- }];
-
- NSError *err1;
- [self.audioEngine prepare];
- [self.audioEngine startAndReturnError:&err1];
- if (err1) {
- [self showLog:[NSString stringWithFormat:@"启动录音失败 %@", err1.description]];
- }
- else{
- [self showLog:@"启动成功"];
- }
-}
-
-- (void)stop{
- [self.audioEngine stop];
- self.recording = false;
- // [self finishRecored:self.recordData];
-}
-
-- (void)checkPermissions{
- switch ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio]) {
- case AVAuthorizationStatusAuthorized:
- self.isAllowRecord = true;
- [self showLog:@"录音已经授权"];
- break;
- case AVAuthorizationStatusNotDetermined:
- {
- [self showLog:@"录音未授权"];
- [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) {
- if (granted) {
- self.isAllowRecord = true;
- [self showLog:@"录音已经授权"];
- }
- else{
- [self showLog:@"已拒绝"];
- }
- }];
- }
- break;
- case AVAuthorizationStatusDenied:
- [self showLog:@"已拒绝"];
- [self openSettings];
- break;
- default:
- [self showLog:@"已拒绝"];
- [self openSettings];
- break;
- }
-}
-
-- (void)openSettings{
-// NSURL *url = [NSURL URLWithString:@""];
-}
-
-- (void)showLog:(NSString *)log{
- NSLog(@"%@",log);
-}
-
-//将录音数据保存
-- (void)finishRecored:(NSData *)data{
- NSString *doc = NSTemporaryDirectory();
- NSString *fullPath = [NSString stringWithFormat:@"%@1.pcm",doc];
- NSError *err;
- [data writeToFile:fullPath options:NSDataWritingAtomic error:&err];
- if (err) {
- [self showLog:[NSString stringWithFormat:@"录音保存失败 %@",err.description]];
- }
- else{
- [self showLog:[NSString stringWithFormat:@"录音保存成功 path = %@",fullPath]];
- }
-}
-
--(NSData*) pcm_downsample:(AVAudioPCMBuffer*)buffer {
- //位深转换 float32 转 int16_t
- NSData* pData = [[NSData alloc] initWithBytes:buffer.floatChannelData[0] length:buffer.frameLength * 4];
- Byte*dataByte = (Byte*)[pData bytes];
- NSUInteger srcSize = pData.length/4;
- Float32 vf32[srcSize];
- memcpy(vf32, &dataByte[0], pData.length);
- int16_t bArr[srcSize];
- int r;
- for(size_t i =0; i < srcSize; ++i) {
- float x = vf32[i];
- float c;
- c = ((x < -1) ? -1: ((x >1) ?1: x));
- c = c +1;
- r = (int)(c *32767.5f);
- r = r -32768;
- bArr[i] = (short)r;
- }
- //码率转换 44100 转 16000
- uint32_t last_pos = (uint32_t)(srcSize -1);
- uint32_t dstSize = (srcSize/44100.0)*16000;
- int16_t bArr16[dstSize];
- for(uint32_t idx =0; idx < dstSize; idx++) {
- float index = ((float) idx *44100.0) / (16000.0);
- uint32_t p1 = (uint32_t) index;
- float coef = index - p1;
- uint32_t p2 = (p1 == last_pos) ? last_pos : p1 +1;
- bArr16[idx] = (int16_t) ((1.0f- coef) * bArr[p1] + coef * bArr[p2]);
- }
- NSMutableData *data1 = [[NSMutableData alloc] init];
- for(NSUInteger i =0; i < dstSize; i++) {
- unsigned char valChar[2];
- valChar[0] =0xff& bArr16[i];
- valChar[1] = (0xff00& bArr16[i]) >>8;
- [data1 appendBytes:valChar length:2];
- }
- return data1;
-}
-
-
-
-@end
version = "2.0">
<Breakpoints>
<BreakpointProxy
- BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+ BreakpointExtensionID = "Xcode.Breakpoint.RuntimeIssueBreakpoint">
<BreakpointContent
- uuid = "019E5380-401C-4E19-9E7F-0F7DA329E81F"
+ uuid = "24BABF42-95D7-48D8-8974-95C4DD64248D"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
- filePath = "AiMouseSdk/AiMouseAudioRecord.m"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "220"
- endingLineNumber = "220"
- landmarkName = "audioBufferCallBack(inRefCon, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData)"
- landmarkType = "9">
+ breakpointStackSelectionBehavior = "1"
+ type = "65535">
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint">
<BreakpointContent
- uuid = "F738AAA8-B689-4FF7-AA28-A46920AE7879"
+ uuid = "D2ABCC85-A36A-4F6F-916F-5A94A9ABAEBD"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy
- BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+ BreakpointExtensionID = "Xcode.Breakpoint.SymbolicBreakpoint">
<BreakpointContent
- uuid = "049FE207-4E22-4DF6-9ABE-D8D05DE11A83"
+ uuid = "FD7765B2-C0F6-4516-8B22-405653751077"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
- filePath = "AliIotConnectKitSDK/AliIotConnectKit/Mqtt/IotMqtt/IotMqttManager_C.swift"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "166"
- endingLineNumber = "166"
- landmarkName = "startQulianConnect()"
- landmarkType = "7">
+ symbolName = ""
+ moduleName = "">
<Locations>
- <Location
- uuid = "049FE207-4E22-4DF6-9ABE-D8D05DE11A83 - f59a5d25c341706d"
- shouldBeEnabled = "Yes"
- ignoreCount = "0"
- continueAfterRunningActions = "No"
- symbolName = "AliIotConnectKit.IotMqttManager_C.startQulianConnect() throws -> ()"
- moduleName = "AliIotConnectKit"
- usesParentBreakpointCondition = "Yes"
- urlString = "file:///Users/apple/Desktop/code/MouseSdk-iOS/MouseSdk/AliIotConnectKitSDK/AliIotConnectKit/Mqtt/IotMqtt/IotMqttManager_C.swift"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "166"
- endingLineNumber = "166"
- offsetFromSymbolStart = "2048">
- </Location>
- <Location
- uuid = "049FE207-4E22-4DF6-9ABE-D8D05DE11A83 - 8550d5cd9362e6d1"
- shouldBeEnabled = "Yes"
- ignoreCount = "0"
- continueAfterRunningActions = "No"
- symbolName = "closure #1 () -> () in AliIotConnectKit.IotMqttManager_C.startQulianConnect() throws -> ()"
- moduleName = "AliIotConnectKit"
- usesParentBreakpointCondition = "Yes"
- urlString = "file:///Users/apple/Desktop/code/MouseSdk-iOS/MouseSdk/AliIotConnectKitSDK/AliIotConnectKit/Mqtt/IotMqtt/IotMqttManager_C.swift"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "166"
- endingLineNumber = "166"
- offsetFromSymbolStart = "127">
- </Location>
- <Location
- uuid = "049FE207-4E22-4DF6-9ABE-D8D05DE11A83 - f59a5d25c341706d"
- shouldBeEnabled = "Yes"
- ignoreCount = "0"
- continueAfterRunningActions = "No"
- symbolName = "AliIotConnectKit.IotMqttManager_C.startQulianConnect() throws -> ()"
- moduleName = "AliIotConnectKit"
- usesParentBreakpointCondition = "Yes"
- urlString = "file:///Users/apple/Desktop/code/MouseSdk-iOS/MouseSdk/AliIotConnectKitSDK/AliIotConnectKit/Mqtt/IotMqtt/IotMqttManager_C.swift"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "166"
- endingLineNumber = "166"
- offsetFromSymbolStart = "2590">
- </Location>
</Locations>
</BreakpointContent>
</BreakpointProxy>
- <BreakpointProxy
- BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
- <BreakpointContent
- uuid = "BE1E231B-12D2-47AA-A5E0-AAAA81898EEC"
- shouldBeEnabled = "No"
- ignoreCount = "0"
- continueAfterRunningActions = "No"
- filePath = "MouseSdk/TlwVC.m"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "23"
- endingLineNumber = "23"
- landmarkName = "unknown"
- landmarkType = "0">
- </BreakpointContent>
- </BreakpointProxy>
- <BreakpointProxy
- BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
- <BreakpointContent
- uuid = "118785A3-0345-4F36-A89C-961E056FE6DB"
- shouldBeEnabled = "Yes"
- ignoreCount = "0"
- continueAfterRunningActions = "No"
- filePath = "AiMouseSdk/AiMouseSdk/AiMouseSdk.m"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "88"
- endingLineNumber = "88"
- landmarkName = "-deviceInfoManager"
- landmarkType = "7">
- </BreakpointContent>
- </BreakpointProxy>
- <BreakpointProxy
- BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
- <BreakpointContent
- uuid = "2B44EFED-983B-42C3-A846-42E824FFEC4F"
- shouldBeEnabled = "Yes"
- ignoreCount = "0"
- continueAfterRunningActions = "No"
- filePath = "AiMouseSdk/AiMouseSdk/AiMouseSdk.m"
- startingColumnNumber = "9223372036854775807"
- endingColumnNumber = "9223372036854775807"
- startingLineNumber = "293"
- endingLineNumber = "293"
- landmarkName = "-getDeviceInfo:"
- landmarkType = "7">
- </BreakpointContent>
- </BreakpointProxy>
</Breakpoints>
</Bucket>
if(connected){
ws.typeLabel.stringValue = connectType == 0 ?@"连接模式:蓝牙":@"连接模式:hid";
ws.connectLabel.stringValue = connected?@"连接状态:已连接":@"连接状态:未连接";
- [ws geviceInfoAction];
}
else{
ws.typeLabel.stringValue = @"连接模式:--";
}];
}
- (void)setDPI:(NSMenuItem*)sender {
- [[DeviceManger shared] setCPI:1600 completation:^(BOOL isSuccess, NSError * _Nonnull error) {
+ [[DeviceManger shared] setCPI:800 completation:^(BOOL isSuccess, NSError * _Nonnull error) {
}];
}