タイガー計算器(4)

数字ダイヤルが汚れている。

f:id:appkaihatsu:20210105184446j:plain

タイガー計算器 左ダイヤル

f:id:appkaihatsu:20210105184218j:plain

タイガー計算器 右ダイヤル

プラスチックだし、大丈夫かなと思いながら、クレのパーツクリーナでシュワシュワしながら歯ブラシでゴシゴシ。

f:id:appkaihatsu:20210105184732j:plain

タイガー計算器 ダイヤル清掃後

キレイになった。

f:id:appkaihatsu:20210105185003j:plain

タイガー計算器 置数レバードラム

置数レバードラム(というのかな?)もパーツクリーナでキレイに。写真は999999999にして、歯車が全て飛び出した状態。歯の位置が微妙にずれているのは、ダイヤルを回すタイミングをずらして、操作が軽くなるように(たぶん)。

内部の油も流出したためか、置数レバーの動きが引っ掛かる様になってしまった。クレ5−56を吹き付けてやると、軽く動く様になった。

下部には、引きすぎた時にチーンと鳴るはずのベルがあるんだけど、覗き込んでもこれを叩く様なものがない。引きすぎの動作をしてみると、この近くのレバーが動くんだけど、どの部品がベルを叩くのか分からない。

f:id:appkaihatsu:20210105190023j:plain

タイガー計算器 ベル

動きが悪いわけでもなさそうだし、でも、この部分を詳しく調べるには、キャリッジを外さないとダメだし、キャリッジ外すのは・・・元に戻す自信がない。

ということで、分解掃除はここまで。

タイガー計算器(3)

 

f:id:appkaihatsu:20210104221510j:plain

タイガー計算器

部分の名称を説明しておかないと、説明が難しい。

右に飛び出ているのがクランクハンドル。黒いツマミを引っ張って、加算の時は右に、減算の時は左に回す。

虎のマークの右は置数レバー、新しいモデルはこの置数レバーで値を設定するとその上部にチェックダイヤルというのがあって、そこに数値が現れるのだけれど、このモデルにはチェックダイヤルは無い。

置数レバーの下部数字がずらっと並んでいるのが右ダイヤル。ここに加算されていく。

右ダイヤルの右の小さいレバーは右帰零ハンドル。手前に回すと右ダイヤルが全てゼロになる。

左に数字がずらっと並んでいるのが左ダイヤル。これは、ハンドルを回した回数をカウントしてくれる。

左ダイヤルの左の小さなレバーは左帰零ハンドル。手前に回すと左ダイヤルが全てゼロになる。

右ダイヤルと左ダイヤルの塊をキャレージと呼ぶ。

前面下部のレバーは、桁送り。キャレージを左右に1桁ずつ移動する。

 

で、カバーを外すとこんな感じ。

f:id:appkaihatsu:20210104222117j:plain

タイガー計算器

内部は油とホコリでベタベタ。綺麗にしてあげよう。

タイガー計算器 (2)

f:id:appkaihatsu:20210104205641j:plain

タイガー計算器虎マーク

買ったタイガー計算機は虎のマークが刻印されている戦時中(?)のもの。

製造番号は32644。

タイガー計算器さんのサイトによると、製造番号26787が1940年、製造番号66566が1949年の製造。なので、そのあいだということは確か。

26787はダイアル桁数が6x7x12だけれど、これは9x10x18。

つまり9桁まで計算できる。(それがどうした?)

いや、その、9桁以下x10桁以下=18桁以下の計算ができる。(ふーん)

虎のマークの左、横に+、ーが書かれたレバーはハンドルが加算方向、減算方向どちらに回されたのかを示すもの。

webでみる説明では、これはクラッチと呼ばれ、リセットした後、ハンドルをどちらに回しても左ダイヤルが加算される・・・らしいのだけれど、

こいつはハンドルを右に回すと、白い数字、左に回すと赤い数字で、特にクラッチ機構はついていないみたい。(分解してわかったことだけどね)

後この写真でわかるのは、右の方、数字がいっぱい書かれているところは置数レバー、これで最初の数値を設定するんだけれど、その数字の左、袋ナットがついているレバー、これは、置数レバーを一気にクリアするもの。元は黒いツマミがついていたはずだけど、壊れちゃったのかな、袋ナットになっていました。

タイガー計算器

f:id:appkaihatsu:20210104200839j:plain

タイガー計算器

メルカリでタイガー計算器を衝動買い。

アンティーク用とのことだったけれど、ハンドル回るし、計算できているみたい。

割り算で繰り下がりがあるとチーンという音がするらしいけれど、音はしなかった。

ま、繰り下がりでカウンターが一斉にガチャガチャと9999になるから分かるんだけど。

カバーのねじが数本抜けていたり、ゴム足がつぶれているんだけど、ま、いっか。

データの保存と読込み

ホームボタンで閉じるだけなら実行が止まるだけなので、再び開くと止まった所から再開する。

スワイプで完全に終了してしまうと内部のデータは全て消えてしまうので、それでも続きから再開したければ、データを保存する必要がある。

保存するデータが少量の場合は、

UserDefaults.standard

に保存するのが簡単。

UserDefaults.standard.set(val, forKey: "data")

とすれば、valの値が"data"という名前で保存される。

valの型はなんでも良い。

これを読み出すときは、

UserDefaults.standard.object(forKey: "data")

なのだけれど、値が保存されていない時、nilが返される。

そのため、直接valに代入しようとすると、値がないときはエラーとなってしまう。

そこで、こんな関数を用意してみる。

    func readInt(key : String,org : Int) -> Int{

        if UserDefaults.standard.object(forKey: key) != nil{

            return UserDefaults.standard.object(forKey: key) as! Int

        }else{

            return org

        }

    }

そして

val = readInt(key: "data", org: 0)

として読み込む。

つまり、"data"という名前がついた値があるか、あればその値をIntとして読み込んで返す。

この関数はInt型のデータ読み込み専用である。

そして、値がなければ、orgで指定した値がvalに代入される。

他の方の値を読み込むには、その型用の関数をつくる。

String型のデータを読み込むなら、上記の関数のIntをStringに変えたものを用意すれば良い。

 

データの読み込みは初期化の時に読み込めば良い。

データの書出しは?

プログラムを終了する時に書き込めば無駄がないのだけれど、いつ終了されるのかが分からない。

仕方がないので、プログラムのループ毎に書き出すことにする。

大量のデータ保存には向いていない。

サンプル作成中

Xーcodeで File>new>Project  プロジェクトの作成だよ

ios、SingleView App >next

Product name プログラムの名前(今回はGAMEとした)

ファイルの場所を指定して(デスクトップに作ったけど)

ContentView.swift を含むプロジェクトが作成される。

Classをつくる

File>new>File で SwiftUI.View

SaveAs のところにClass名(GAME)を指定してCreate

Classの定義なので、View表示のところは消してしまう。

 

GAME.swift

//

//  GAME.swift

//  base

//

//  Created by **** on 2020/09/22.

//  Copyright © 2020 ****. All rights reserved.

//

 

import SwiftUI

 

class Game: ObservableObject{

    @Published var count:Int = 0

    var timer = Timer()

    

    init(){

        count = 1

        timerStart()

    }

    

    func timerStart(){

        self.timer = Timer.scheduledTimer(withTimeInterval: 0.3, repeats: true){ timer in

            self.timercall()

        }

    }

    

    func timercall(){

        count += 1

    }

 

}

 

struct GAME_Previews: PreviewProvider {

    static var previews: some View {

        /*@START_MENU_TOKEN@*/Text("Hello, World!")/*@END_MENU_TOKEN@*/

    }

}

 

Swiftuiで作ったら、Previewsを消しても勝手にまた出来ちゃった。

swiftで作れば良かったのかも。

ContentView

//

//  ContentView.swift

//  base

//

//  Created by **** on 2020/09/22.

//  Copyright © 2020 ****. All rights reserved.

//

 

import SwiftUI

 

struct ContentView: View {

    @EnvironmentObject var game: Game

    var body: some View {

        Text("count \(game.count)")

    }

}

 

struct ContentView_Previews: PreviewProvider {

    static var previews: some View {

        ContentView()

        .environmentObject(Game())  //これがないと表示の時にエラーとなる

    }

}

それから、SceneDelegate.swiftの

        let contentView = ContentView()

の後に1行足して

        let contentView = ContentView()

            .environmentObject(Game())

とする。

このプログラムは、タイマ割り込みでcountをインクリメントして、表示するだけのもの。

シミュレータで実行するとカウントアップしていく様子がわかる。

シミュレータでホームボタンを押してしばらくしてからもう一度開くと、

カウント値が3〜5増えた所からスタートする。

つまり、ホームボタンで閉じると数秒はまだ動いているけれど、その後停止するということみたい。

ゲームプログラムの基本構造

SWIFTで「動く」プログラムをつくる基本構造(構想)

表示はContentView.swiftで作成

動かすプログラムはObservableObjectとしてClassを作成して

ContentViewの中で@EnvironmentObjectとしてインスタンス作成

Classのコンストラクタで初期設定して、タイマコールして終わる。

うーん、サンプル作った方がいいな。

動いてくれるのか・・・