/***
* KMComBase.js
* Created by Harada Hiroshi on 2017/12/07.
*
* Copyright (c) 2017 Keigan Inc. https://keigan-motor.com/
* This software is released under the MIT License.
* http://opensource.org/licenses/mit-license.php
*/
'use strict';
let KMUtl = require('./KMUtl');
let KMStructures=require('./KMStructures');
/**
* @classdesc 通信クラスの基底
* @ignore
*/
class KMComBase{
/**********************
* 定数
**********************/
/**
* constructor
*/
constructor(){
this._commandCount=0;
this._deviceInfo=new KMStructures.KMDeviceInfo();
this._motorMeasurement=new KMStructures.KMRotState();
this._motorLed=new KMStructures.KMLedState();
this._motorImuMeasurement=new KMStructures.KMImuState();
this._onInitHandler=function(connector){};
this._onConnectHandler=function(connector){};
this._onDisconnectHandler=function(connector){};
this._onConnectFailureHandler=function(connector, msg){};
this._onMotorMeasurementCB=function(){};
this._onImuMeasurementCB=function(){};
this._onMotorSettingCB=function(){};
this._onMotorLogCB=function(){};
this._isInit=false;
/**
* _onBleMotorSettingのコマンド モーター設定情報の通知受信時にパースする用
* @type {{maxSpeed: number, minSpeed: number, curveType: number, acc: number, dec: number, maxTorque: number, qCurrentP: number, qCurrentI: number, qCurrentD: number, speedP: number, speedI: number, speedD: number, positionP: number, ownColor: number}}
* @ignore
*/
this._MOTOR_RX_READREGISTER_COMMAND={
"maxSpeed":0x02,
"minSpeed":0x03,
"curveType":0x05,
"acc":0x07,
"dec":0x08,
"maxTorque":0x0E,
"teachingInterval":0x16,
"playbackInterval":0x17,
"qCurrentP":0x18,
"qCurrentI":0x19,
"qCurrentD":0x1A,
"speedP":0x1B,
"speedI":0x1C,
"speedD":0x1D,
"positionP":0x1E,
"motorMeasurementInterval":0x2C,
"motorMeasurementByDefault":0x2D,
"interface":0x2E,
"response":0x30,
"ownColor":0x3A,
"iMUMeasurementInterval":0x3C,
"iMUMeasurementByDefault":0x3D,
"deviceName":0x46,
"deviceInfo":0x47,
"speed":0x58,
"positionOffset":0x5B,
"moveTo":0x66,
"hold":0x72,
"status":0x9A,
"tasksetName":0xA5,
"tasksetInfo":0xA6,
"tasksetUsage":0xA7,
"motionName":0xAF,
"motionInfo":0xB0,
"motionUsage":0xB1,
"i2CSlaveAddress":0xC0,
"led":0xE0,
"enableCheckSum":0xF3,
"deviceSerial":0xFA
};
/**
* モーターログ用エラーコード表
* @type {{}}
* @ignore
*/
this._MOTOR_LOG_ERRORCODE={
0:{id:0,type:"KM_SUCCESS",msg:"Successful command"},//成功時に返却する
1:{id:1,type:"KM_ERROR_INTERNAL",msg:"Internal Error"},//内部エラー
2:{id:2,type:"KM_ERROR_NO_MEM",msg:"No Memory for operation"},//メモリ不足
3:{id:3,type:"KM_ERROR_NOT_FOUND",msg:"Not found"},//見つからない
4:{id:4,type:"KM_ERROR_NOT_SUPPORTED",msg:"Not supported"},//サポート外
5:{id:5,type:"KM_ERROR_INVALID_COMMAND",msg:"Invalid Command"},//不正なコマンド
6:{id:6,type:"KM_ERROR_INVALID_PARAM",msg:"Invalid Parameter"},//不正な引数
7:{id:7,type:"KM_ERROR_STORAGE_FULL",msg:"Storage is full"},//記録領域が一杯
8:{id:8,type:"KM_ERROR_INVALID_FLASH_STATE",msg:"Invalid flash state, operation disallowed in this state"},//フラッシュの状態が不正
9:{id:9,type:"KM_ERROR_INVALID_LENGTH",msg:"Invalid Length"},//不正な引数の長さ(サイズ)
10:{id:10,type:"KM_ERROR_INVALID_CHECKSUM",msg:"Invalid Check Sum (Validation is failed)"},//不正なチェックサム
13:{id:13,type:"KM_ERROR_TIMEOUT",msg:"Operation timed out"},//タイムアウト
15:{id:15,type:"KM_ERROR_FORBIDDEN",msg:"Forbidden Operation"},//不許可な操作
16:{id:16,type:"KM_ERROR_INVALID_ADDR",msg:"Bad Memory Address"},//不正なアドレス参照
17:{id:17,type:"KM_ERROR_BUSY",msg:"Busy"},//ビジー
18:{id:18,type:"KM_ERROR_RESOURCE",msg:"Not enough resources for operation"},//リソース不足
20:{id:20,type:"KM_ERROR_MOTOR_DISABLED",msg:"Motor state is disabled"},//モーターが動作許可されていない
60:{id:60,type:"KM_ERROR_DEVICE_DRIVER",msg:"KM_ERROR_DEVICE_DRIVER"},//内容未定義
61:{id:61,type:"KM_ERROR_DEVICE_FLASH",msg:"KM_ERROR_DEVICE_FLASH"},//内容未定義
62:{id:62,type:"KM_ERROR_DEVICE_LED",msg:"KM_ERROR_DEVICE_LED"},//内容未定義
63:{id:63,type:"KM_ERROR_DEVICE_IMU",msg:"KM_ERROR_DEVICE_IMU"},//内容未定義
70:{id:70,type:"KM_ERROR_NRF_DEVICE",msg:"Error related to BLE module (nRF52832)"},//BLEモジュールのエラー
80:{id:80,type:"KM_ERROR_WDT_EVENT",msg:"Watch Dog Timer Event"},//ウォッチドッグタイマーイベントの発動(再起動直前)
81:{id:81,type:"KM_ERROR_OVER_HEAT",msg:"Over Heat (over temperature)"}//温度異常
}
}
/**********************
* プロパティ
**********************/
/**
* デバイス情報
* @type {KMDeviceInfo}
*
*/
get deviceInfo(){
return this._deviceInfo.Clone();
}
/**
* 有効無効
* @type {boolean}
*/
get isConnect(){
return this._deviceInfo.isConnect;
}
/**
* モーターコマンド順監視用連番の発行
* @type {number}
*/
get createCommandID(){
return this._commandCount=(++this._commandCount)&0b1111111111111111;//65535でループ
}
/**
* isConnectの設定変更(子クラスから使用)
* @param {boolean} bool
* @ignore
*/
_statusChange_isConnect(bool){
this._deviceInfo.isConnect=bool;
if(this._isInit){
if(bool){
this._onConnectHandler(this);
}else{
this._onDisconnectHandler(this);
}
}
}
/**
* 初期化状態の設定(子クラスから使用)
* @param {boolean} bool
* @ignore
*/
_statusChange_init(bool){
this._isInit=bool;
if(this._isInit){
this._onInitHandler(this);
}
}
/**********************
* callback
**********************/
/**
* 初期化完了して利用できるようになった
* @type {function(KMComBase)}
*/
set onInit(handlerFunction){
if(typeof handlerFunction ==="function"){
this._onInitHandler=handlerFunction;
}
}
/**
* 応答・再接続に成功した
* @type {function(KMComBase)}
*/
set onConnect(handlerFunction){
if(typeof handlerFunction ==="function"){
this._onConnectHandler=handlerFunction;
}
}
/**
* 応答が無くなった・切断された
* @type {function(KMComBase)}
*/
set onDisconnect(handlerFunction){
if(typeof handlerFunction ==="function"){
this._onDisconnectHandler=handlerFunction;
}
}
/**
* 接続に失敗
* @type {function(KMComBase,string)}
*/
set onConnectFailure(handlerFunction){
if(typeof handlerFunction ==="function"){
this._onConnectFailureHandler=handlerFunction;
}
}
/**
* モーターの回転情報callback
* @type {function(position:number,velocity:number,torque:number)}
*/
set onMotorMeasurement(func){
if(typeof func==="function"){
this._onMotorMeasurementCB=func;
}
}
/**
* モーターのジャイロ情報callback
* @type {function({accelX:number,accelY:number,accelZ:number,temp:number,gyroX:number,gyroY:number,gyroZ:number})}
*/
set onImuMeasurement(func){
if(typeof func==="function"){
this._onImuMeasurementCB=func;
}
}
/**
* モーター設定情報取得callback
* @type {function(registerCmd:number,res:number)}
*/
set onMotorSetting(func){
if(typeof func==="function"){
this._onMotorSettingCB=func;
}
}
/**
* モーターログ情報取得callback
* @type {function(cmdID:number,res:errorlogObject)}
*/
set onMotorLog(func){
if(typeof func==="function"){
this._onMotorLogCB=func;
}
}
//////class//
}
module.exports =KMComBase;