前提・実現したいこと
cntを正しく動作させたい
発生している問題・エラーメッセージ
cntでカウントしてそれに準じて処理を行なっているのですが
なぜか動作がおかしく、cntを表示させると値がおかしくて困っています
該当のソースコード
import UIKit
import CoreMotion
import AudioToolbox
import AVFoundation
class ViewController: UIViewController {
let motionManager = CMMotionManager()
var dataX:[Double] = []
var dataY:[Double] = []
var dataZ:[Double] = []
var deviY = [Double](repeating: 0.0, count: 15000)
var dispY = [Double](repeating: 0.0, count: 15000)
var btn = false
weak var timer: Timer!
var startTime = Date()
var totalTime = 0.0
var cnt:Int = 0
var alertY = true
@IBOutlet weak var timeL: UILabel!
@IBOutlet weak var accelX: UILabel!
@IBOutlet weak var accelY: UILabel!
@IBOutlet weak var accelZ: UILabel!
@IBOutlet weak var kakuninL: UILabel!
// 計測開始・停止ボタン
@IBAction func startB(_ sender: Any) {
let button = sender as! UIButton
if (btn == true) {
btn = false
cnt = 0
deviY = [Double](repeating: 0.0, count: 15000)
dispY = [Double](repeating: 0.0, count: 15000)
button.setTitle("計測開始", for: .normal)
stopTimer()
}
else {
btn = true
button.setTitle("計測停止", for: .normal)
startTimer()
cnt = 0
}
}
@IBAction func resetB(_ sender: Any) {
cnt = 0
deviY = [Double](repeating: 0.0, count: 15000)
dispY = [Double](repeating: 0.0, count: 15000)
resetTimer()
stopTimer()
}
// データの格納
func outputAccelData(acceleration: CMAcceleration){
if (btn) {
dataX.append(acceleration.x)
dataY.append(acceleration.y)
dataZ.append(acceleration.z)
accelX.text = String(format: "x = %.3f", acceleration.x)
accelY.text = String(format: "y = %.3f", acceleration.y)
accelZ.text = String(format: "z = %.3f", acceleration.z)
culculator()
}
}
// データの計算
func culculator() {
var tmpy:Double = 0.0
if(dataY.count > 10) {
for i in 0 ..< (dataY.count - 11) {
for j in i ..< (i + 10) {
tmpy = tmpy + dataY[j]
}
tmpy = tmpy / 10.0
for k in i ..< (i + 10) {
dispY[i] = dispY[i] + pow(dataY[k]-tmpy,2.0)
}
dispY[i] = dispY[i] / 10.0
deviY[i] = sqrt(dispY[i])
if(judgecount(deviY[i])){
cnt = cnt + 1
}
}
}
}
// 動作の判定
func judgecount(_ devi:Double) -> Bool {
var soundIdRing:SystemSoundID = 1005
kakuninL.text = String(format: "%d", cnt)
if((devi > 0.20)&&(cnt > 50)) {
cnt = 0
return false
}
else if((cnt == 100)&&(alertY)) {
alertY = false
let alert1 = UIAlertController(title: nil, message: nil, preferredStyle: .alert)
alert1.title = "警告!"
alert1.message = "1の方"
alert1.addAction(
UIAlertAction(
title: "OK",
style: .default,
handler: {(action) -> Void in
self.alertY = true
}))
self.present( alert1, animated: true, completion:nil)
if let soundUrl = CFBundleCopyResourceURL(CFBundleGetMainBundle(), nil, nil, nil){
AudioServicesCreateSystemSoundID(soundUrl, &soundIdRing)
AudioServicesPlaySystemSound(soundIdRing)
}
return true
}
else if((cnt > 200)&&(alertY)) {
alertY = false
let alert2 = UIAlertController(title: nil, message: nil, preferredStyle: .alert)
alert2.title = "警告!"
alert2.message = "2の方"
alert2.addAction(
UIAlertAction(
title: "OK",
style: .default,
handler: {(action) -> Void in
self.cnt = 0
self.alertY = true
}))
self.present( alert2, animated: true, completion:nil)
return false
}
else {
return true
}
}
// アラートの表示
func displayalert(_ message:String) {
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .alert)
alert.title = "警告!"
alert.message = message
alert.addAction(
UIAlertAction(
title: "OK",
style: .default,
handler: {(action) -> Void in
self.startTimer()
self.alertY = true
}))
self.present( alert, animated: true, completion:nil)
}
// 時間の表示
func displayTime(_ time: TimeInterval) {
let minute = (Int)(fmod((time/60), 60))
let second = (Int)(fmod(time, 60))
let msec = (Int)((time - floor(time))*100)
timeL.text = String(format: "%02d : %02d : %02d", minute, second, msec)
}
// 時間の計測
@objc func timerCounter() {
let currentTime = totalTime + Date().timeIntervalSince(startTime)
displayTime(currentTime)
}
// タイマーのスタート
func startTimer() {
if timer != nil {
timer.invalidate()
}
else {
startTime = Date();
}
timer = Timer.scheduledTimer(
timeInterval: 0.01,
target: self,
selector: #selector(self.timerCounter),
userInfo: nil,
repeats: true)
}
// タイマーの一時停止
func stopTimer() {
if timer != nil {
totalTime = totalTime + Date().timeIntervalSince(startTime)
timer.invalidate()
timer = nil
}
displayTime(totalTime)
}
// タイマーのリセット
func resetTimer() {
startTime = Date();
totalTime = 0.0
displayTime(totalTime)
startTimer()
}
// 加速度取得停止
func stopAccelerometer(){
if (motionManager.isAccelerometerActive) {
motionManager.stopAccelerometerUpdates()
}
}
override func viewDidLoad() {
super.viewDidLoad()
if motionManager.isAccelerometerAvailable {
motionManager.accelerometerUpdateInterval = 0.5
motionManager.startAccelerometerUpdates(
to: OperationQueue.current!,
withHandler: {(accelData: CMAccelerometerData?, errorOC: Error?) in
self.outputAccelData(acceleration: accelData!.acceleration)
})
}
UIApplication.shared.isIdleTimerDisabled = true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正の依頼
nakasho_dev
2017/12/30 11:52
「なぜか動作がおかしく」を具体的に書きましょう。想定している振る舞いを説明して、その振る舞いのどの処理がうまくいっていないのか、それに対する自分の現在の考えなどを書いていただけると回答が得られやすいのではないでしょうか。どのようなプログラムなのかソースを全部読まなくてはいけないという負担を感じると回答者も回答への意欲が薄れます。