感測器.

Slides:



Advertisements
Similar presentations
明新科技大學 資訊工程系 彭亦暄 台北科技大學 資訊工程系 江佩穎 教育部資通訊軟體創新人才推升推廣計畫 iOS 智慧裝置軟體設計 iOS 常用元件.
Advertisements

第四章 类、对象和接口.
河內塔(Hanoi)問題.
6. 6 Overloading methods and constructors 6
2017/3/6 WIRESHARK 的安裝與基本操作.
学生教育办介绍 2015年9月.
四資二甲 第三週作業 物件導向程式設計.
Memory Pool ACM Yanqing Peng.
Lua+wax在ios上的应用 白 衣.
第7章 C#函數與.NET Framework類別函數庫
中鸣虚拟搜救比赛项目 (一人) 现场主题创作(40%)(一人) 3D虚拟搜救(60%)(一人).
Oracle WebLogic 数据库连接原理及案例探讨
Objective C介紹與MVC.
提升时间管理.
第二章 JAVA语言基础.
資料儲存.
                                        導師健康關懷 健康是一輩子的事 義守大學衛生保健組 關心您.
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
《IOS应用开发教程》 QQ学习群:
Chapter 7 Search.
Microsoft Access 第十二組 黃彥維 陳重嘉.
Operating System Concepts 作業系統原理 Chapter 3 行程觀念 (Process Concept)
2.2 语法分析器生成器YACC 分析器的构造步骤: 产生式→识别活前缀的DFA→分析表(+驱动器) YACC概述
第二章 C# 基础知识.
《IOS应用开发教程》 QQ学习群:
Chapter 14 iPhone 平台簡介.
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
Java语言程序设计 第七部分 多线程.
卢斌 Software Development Engineer Microsoft Corporation
Chapter 3 行程觀念 (Process Concept)
C++ with Managed Extensions
STRUCTURE 授課:ANT 日期:2010/5/12.
ICT RTOS Research Group 胡伟平,王剑
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第 6 章 函式.
第6章 基本的IDL到C++的映射 3.2 简介 从IDL到C++的映射必须具备下面的条件 (1) 映射应该很直观,并且很容易使用
Segue.
IPHONE应用开发 资源管理项目组 2018年12月24日.
遊戲設計 Animation.
第8章 Service解析.
第一次课后作业 1. C/C++/Java 哪些值不是头等程序对象 2. C/C++/Java 哪些机制采用的是动态束定
 活动对象(Active Object).
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
Ch02-基礎語法.
第六章 安全衛生工作守則 6-1 前 言  6-2 訂定依據相關法令規定  6-3 工作守則製作程序及製作前應注意事項  6-4 如何訂定適合需要之安全衛生工作守則  6-5 結 論.
P2P聊天工具.
第三章 C# 基础知识.
《IOS应用开发基础教程》 QQ学习群:
Navigation Controller和 Table View
《JAVA程序设计》 语音答疑 辅导老师:高旻.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
第十二章 过滤器.
C#程序设计基础 $3 成员、变量和常量.
中国科学技术大学计算机系 陈香兰 Fall 2013 第三讲 线程 中国科学技术大学计算机系 陈香兰 Fall 2013.
《IOS应用开发教程》 QQ学习群:
Objective C練習.
第二章 Java基本语法 讲师:复凡.
Inheritance -II.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
A Simple iOS Application
第十二章 位运算.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
05 方法. 05 方法 5.1 方法 在一個較大型的程式中,通常會將具有特定功能或經常重複使用的程式,撰寫成獨立的小單元,稱為「方法」(Method),並賦予方法一個名稱,當程式需要時就可以呼叫此方法來執行該段特定程式。(此種重複使用的程式小單元在其他語言中可能稱為程序、副程式或函式, Visual.
C++程序语言设计 Chapter 14: Templates.
多點觸控與手勢.
Presentation transcript:

感測器

Connecting to the Net

Foundation Framework Many classes in the Foundation framework support initialization of some form via a URL NSString NSArray NSDictionary + (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error; + (id)arrayWithContentsOfURL:(NSURL *)url; + (id)dictionaryWithContentsOfURL:(NSURL *)url;

練習 URL: http://192.168.11.15/zipcode.php?zip=郵遞 區號,可查詢傳入郵遞區號的縣市鄉鎮 回傳資料 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>county</key><string>台北市</string> <key>city</key><string>信義區</string> </dict> </plist> 100,103~106,108,110

記得要將searchBar的delegate連接到此ViewCrotoller #import "IHViewController.h" #define webUrl @"http://140.113.236.58/zipcode.php” @implementation IHViewController - (void)viewDidLoad{ [super viewDidLoad]; } - (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{ NSString *zip = searchBar.text; NSString *urlStr = [NSString stringWithFormat:@"%@?zip=%@", webUrl, zip]; NSURL *url = [NSURL URLWithString:urlStr]; NSDictionary *results = [NSDictionary dictionaryWithContentsOfURL:url]; self.county.text =[results objectForKey:@"county"] ; self.city.text = [results objectForKey:@"city"] ; @end 記得要將searchBar的delegate連接到此ViewCrotoller

Network IO blocking What happens if the network request takes a long time to fulfill? The UI becomes totally unresponsive The network IO blocking is being done in the UI thread How does the user know the app is doing network IO and not just hung trying to perform some local operation?

Perform Blocking IO in Background You should not perform any potentially long- running IO in the main thread — it will halt the UI Instead you should run these in a different thread that doesn’t cause the UI to block Couple of ways to achieve this... Traditional threads Asynchronous functions Operation queues

NSThread Class + (void)detachNewThreadSelector: (SEL)aSelector toTarget:(id)aTarget withObject: (id)anArgument 自動執行 - (id)initWithTarget:(id)target selector: (SEL)selector object:(id)argument 需呼叫start selector: 執行緒入口點方法,只能有一個參數,無回傳 值 argument:傳入selector方法的參數 - (void)start

NSThread *thread1=[[NSThread alloc]initWithTarget:self selector:@selector(doInThread) object:nil]; [thread1 start]; -(void)doInThread { for(int i=0;i<100;i++) NSLog(@"執行緒中- %d",i); }

NSOperationQueue 在iOS中,可以建立多個不同步操作的執行緒, 可在目前執行緒中同時啟動多個操作 + (id)mainQueue Returns the operation queue associated with the main thread - (NSInteger)maxConcurrentOperationCount - (NSArray *)operations - (NSUInteger)operationCount

NSOperationQueue - (void)addOperation:(NSOperation *)op; - (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait wait YES:目前執行緒會被 blocked直到指定的操作執行完 NO:將操作放入佇列中後,馬上返回 - (void)addOperationWithBlock:(void (^) (void))block

NSOperationQueue - (void)cancelAllOperations - (void)waitUntilAllOperationsAreFinished Block目前執行緒直到佇列中的操作都執行完

NSOperation NSOperation:是一個抽象類別,用來包裝一個 任務工作 實體類別有 可調整任務工作的排程優先權 可設定一個 block工作 實體類別有 NSInvocationOperation NSBlockOperation

NSInvocationOperation - (id)initWithTarget:(id)target selector: (SEL)sel object:(id)arg NSInvocationOperation *invocation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doInThread) object:nil]; NSOperationQueue *queue=[[NSOperationQueue alloc]init]; [queue addOperation:invocation]; -(void)doInThread { for(int i=0;i<100;i++) NSLog(@"執行緒中- %d",i); }

Declaring and Using a Block use the ^ operator to declare a block variable and to indicate the beginning of a block literal. The body of the block itself is contained within {} int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier; };

Declaring and Using a Block

Declaring and Using a Block Block可以使用與Block定義相同範圍的變數 定義了一個block變數就可以像方法一樣使用 int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier; }; printf("%d", myBlock(3)); // prints "21"

int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier; }; NSLog(@"%d", myBlock(3)); multiplier = 8; 21 21 __block int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num * multiplier; }; NSLog(@"%d", myBlock(3)); multiplier = 8; 21 24

int multiplier = 7; int (^myBlock)(int) = ^(int num) { multiplier++; return num * multiplier; }; NSLog(@"multiplier:%d %d multiplier:%d", multiplier, myBlock(3),multiplier); __block multiplier:7 24 multiplier:8

Declaring and Using a Block 也可以不需要宣告一個block變數,直接在參數 中撰寫一個block區塊 如:UIViewController的方法 (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion [self presentViewController:viewController animated:YES completion:^{...} ];

NSBlockOperation + (id)blockOperationWithBlock:(void (^)(void))block; - (void)addExecutionBlock:(void (^)(void))block; 加入任務工作block - (void)setCompletionBlock:(void (^)(void))block 設定操作完成時執行的程式block

NSObject Class - (void)performSelectorOnMainThread: (SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 將此物件要執行的方法放到主執行緒中執行

- (void)performSelectorOnMainThread: (SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 要放到主執行緒中執行的方法 此方法不能有回傳直,最多只能有一個參數 arg: 要傳遞到方法中的參數 若方法無需參數,則此參數設為 nil wait: 設定目前執行緒是否需要等待主執行緒執行完該方法

Notifying the User of Network IO 設定網路存取指示 取得UIApplication物件 設定網路存取指示是否可見 @property(nonatomic,getter=isNetworkActivityIn dicatorVisible) BOOL networkActivityIndicatorVisible; + (UIApplication *)sharedApplication;

改良上一個練習 #import <UIKit/UIKit.h> @interface IHViewController : UIViewController<UISearchBarDelegate> @property (weak, nonatomic) IBOutlet UILabel *county; @property (weak, nonatomic) IBOutlet UILabel *city; @property (strong, nonatomic) NSOperationQueue *queue; @end

UIApplication *app = [UIApplication sharedApplication]; app.networkActivityIndicatorVisible = YES; NSString *zip = searchBar.text; NSString *urlStr=[NSString stringWithFormat:@"%@?zip=%@", webUrl, zip]; NSURL *url = [NSURL URLWithString:urlStr]; NSBlockOperation *lookupOp = [NSBlockOperation blockOperationWithBlock:^ { NSDictionary *results = [NSDictionary dictionaryWithContentsOfURL:url]; [self.county performSelectorOnMainThread:@selector(setText:) withObject: [results objectForKey:@"county"] waitUntilDone:YES]; [self.city performSelectorOnMainThread:@selector(setText:) withObject:[results objectForKey:@"city"] waitUntilDone:YES]; } ]; [lookupOp setCompletionBlock:^{ app.networkActivityIndicatorVisible = NO; }]; if (!self.queue) { self.queue = [[NSOperationQueue alloc] init]; [self.queue addOperation:lookupOp];

接近感測器

UIDevice 接近感測器相關屬性 提供設備相關資訊 + (UIDevice *)currentDevice BOOL proximityMonitoringEnabled 設定是否監測物體靠近 預設是NO. BOOL proximityState 是否有物體靠近

UIDevice Notifications UIDeviceProximityStateDidChangeNotification

Notification 採用廣播方式,將發送出去的訊息廣播給註冊 過的觀測者,觀測者對訊息進行處理 NSNotificationCenter 訊息中心,每一個Process都會有一個此物件 + (id)defaultCenter 回傳預設的NSNotificationCenter物件 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

Notification - (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender - (void)removeObserver: (id)notificationObserver - (void)removeObserver:(id)notificationObserver

接近感測器—練習 啟用接近感測器 訂閱接近感測器變化通知 取得接近狀態 [UIDevice currentDevice].proximityMonitoringEnabled=YES; 訂閱接近感測器變化通知 取得接近狀態 if ([UIDevice currentDevice].proximityMonitoringEnabled) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleProximityChange:) name:UIDeviceProximityStateDidChangeNotification object:nil]; } -(void)handleProximityChange:(NSNotification *) notification{ NSLog(@"Proximity State: %d",[UIDevice currentDevice].proximityState); }

Motion sensing

Motion sensing 主要感測器: 加速度計、陀螺儀、磁力計 取得感測器值主要類別CMMotionManager 使用alloc/init來建立物件,但每個應用程式只允許建 立一個此物件

Motion sensing 使用步驟 ... or ... 檢查硬體是否可用 開始取樣,並詢問 motion manager取得最新的感測值 ... or ... 設定感測值回報頻率 註冊一個block,每當一個取樣值取得時,會執行此 block

CMMotionManager Class 檢查感測器硬體是否可用 @property (readonly) BOOL {accelerometer,gyro,deviceMotion,magnetometer}Availa ble; deviceMotion是加速度計和陀螺儀兩者結合 啟動硬體開始收集資料 若要開始polling感測值,只需要呼叫啟動方法 - (void)start{Accelerometer,Gyro,DeviceMotion,Magnetom eter}Updates;

CMMotionManager Class 停止感測資料 (void)stop{Accelerometer,Gyro,DeviceMotion,Magnetometer}Upda tes; 判斷目前感測器是否active @property (readonly) BOOL {accelerometer,gyro,deviceMotion,magnetometer}Active;

Polling data 取得加速度感測資料 CMAccelerometerData物件有以下屬性 @property (readonly) CMAccelerometerData *accelerometerData; CMAccelerometerData物件有以下屬性 @property (readonly) CMAcceleration acceleration; 此加速度包含重力加速度 typedef struct { double x; double y; double z; } CMAcceleration;

Polling data 取得陀螺儀感測資料 @property (readonly) CMGyroData *gyroData; @property (readonly) CMRotationRate rotationRate; 旋轉速率正負值依據右手定則 此值會有偏差 typedef struct { double x; double y; double z; } CMRotationRate

Polling data 取得磁力計感測資料 @property(readonly) CMMagnetometerData *magnetometerData CMMagnetometerData物件有以下屬性 @property(readonly, nonatomic) CMMagneticField magneticField typedef struct { double x; double y; double z; } CMMagneticField;

Polling data 取得移動資料 @property (readonly) CMDeviceMotion *deviceMotion; 若裝置有此兩種感測器,可以有更佳的感測結果

CMDeviceMotion 加速度資訊 @property (readonly) CMAcceleration gravity; @property (readonly) CMAcceleration userAcceleration; 不含重力加速度

CMDeviceMotion 磁力資訊 @property(readonly, nonatomic) CMCalibratedMagneticField magneticField 去除地球磁場和裝置誤差 typedef struct { double x; double y; double z; } CMMagneticField; typedef struct { CMMagneticField field; CMMagneticFieldCalibrationAccuracy accuracy; } CMCalibratedMagneticField; typedef enum { CMMagneticFieldCalibrationAccuracyUncalibrated = -1,//未校準 CMMagneticFieldCalibrationAccuracyLow, CMMagneticFieldCalibrationAccuracyMedium, CMMagneticFieldCalibrationAccuracyHigh } CMMagneticFieldCalibrationAccuracy;

CMDeviceMotion 旋轉資訊 @property CMRotationRate rotationRate; Contains a measurement of gyroscope data whose bias has been removed . @property CMAttitude *attitude; 裝置在3-D空間中的朝向(姿勢) @interface CMAttitude : NSObject // 單位為徑度(弧度) @property (readonly) double roll; // 以Y軸為軸心旋轉方向的弧度 @property (readonly) double pitch; //以x軸為軸心 @property (readonly) double yaw; //以z軸為軸心 @end

Core Motion 設定感側值回報頻率 @property NSTimeInterval accelerometerUpdateInterval; @property NSTimeInterval gyroUpdateInterval; @property NSTimeInterval deviceMotionUpdateInterval; @property NSTimeInterval magnetometerUpdateInterval;

Core Motion 註冊接收加速度資料回報的區塊 (void)startAccelerometerUpdatesToQueue: (NSOperationQueue *)queue withHandler: (CMAccelerometerHandler)handler; CMAccelerometerHandler typedef void (^CMAccelerationHandler) (CMAccelerometerData *data, NSError *error);

Core Motion 註冊接收旋轉資料回報的區塊 (void) startGyroUpdatesToQueue: (NSOperationQueue *) queue withHandler: (CMGyroHandler)handler; CMGyroHandler typedef void (^CMGyroHandler)(CMGyroData *data, NSError *error);

Core Motion 註冊接收加速度和旋轉資料回報的區塊 (void) startDeviceMotionUpdatesToQueue: (NSOperationQueue *) queue withHandler: (CMDeviceMotionHandler)handler; CMDeviceMotionHandler typedef void (^CMDeviceMotionHandler) (CMDeviceMotion *motion, NSError *error);

Core Motion 註冊接收磁力資料回報的區塊 (void)startMagnetometerUpdatesToQueue:(NSOperationQu eue *)queue withHandler:(CMMagnetometerHandler)handler CMMagnetometerHandler typedef void (^CMMagnetometerHandler)(CMMagnetometerData *magnetometerData, NSError *error);

練習 讀出手機x, y, z軸之加速度,與使用者在三軸上 之移動加速度。 Add CoreMotion.framework

#import <UIKit/UIKit.h> #import <CoreMotion/CoreMotion.h> @interface weatherViewController : UIViewController @property(nonatomic,strong)CMMotionManager * motionMager; @end self.motionMager = [[CMMotionManager alloc] init]; NSOperationQueue *queue = [ [NSOperationQueue alloc] init]; if (self.motionMager.accelerometerAvailable) { self.motionMager.accelerometerUpdateInterval = 5.0; [self.motionMager startAccelerometerUpdatesToQueue:queue withHandler: ^(CMAccelerometerData *accelerometerData, NSError *error) { NSLog(@"x=%f",accelerometerData.acceleration.x); NSLog(@"y=%f",accelerometerData.acceleration.y); NSLog(@"z=%f",accelerometerData.acceleration.z); } ];

練習 畫面中顯示一個圖片,圖片會隨加速度計頃斜移 動