設計カバレッジで漏れの確認

本文分享了日经BP社的一篇IT专业文章,详细内容请访问提供的网页链接。

今天跟大家分享的内容

网页地址

http://itpro.nikkeibp.co.jp/article/COLUMN/20070920/282545/

package jp.or.jaf.syg.feature.jafrsho99.jafrsho99130 import jp.or.jaf.syg.core.common.base.JafViewModel import jp.or.jaf.syg.core.common.event.JafAction import jp.or.jaf.syg.core.common.event.JafEvent import jp.or.jaf.syg.core.common.ext.utils.DateUtils import jp.or.jaf.syg.domain.message.Message import jp.or.jaf.syg.feature.jafrsho99.jafrsho99010.Jafrsho99010Routes import jp.or.jaf.syg.feature.jafrsho99.jafrsho99050.JAFRSHO99050Model import jp.or.jaf.syg.feature.jafrsho99.jafrsho99130.mappers.createInitialUiStateData import jp.or.jaf.syg.feature.jafrsho99.jafrsho99130.mappers.generateCalendarData import jp.or.jaf.syg.feature.jafrsho99.jafrsho99130.mappers.generateSelectDayList import jp.or.jaf.syg.feature.jafrsho99.jafrsho99130.mappers.generateSelectMonthList import java.io.Serializable import javax.inject.Inject /** * 【機能ID: JAFRSHO99】業務共通機能 * 【画面ID: JAFRSHO99130】カレンダーポップアップ * * カレンダーポップアップのViewModel実装 * 年月日入力時に使用するポップアップである。 */ class JAFRSHO99130ViewModel @Inject constructor() : JafViewModel<JAFRSHO99130UiStateData>() { /** * システムイベント処理 * JafUiStateHostが自動的に呼び出すイベント処理 */ private var monthSelectResult: Pair<Any, Any>? = null private var daySelectResult: Pair<Any, Any>? = null override fun onEvent(event: JafEvent) { when (event) { JafEvent.Companion.Initialize -> { // パラメータなしの場合はデフォルト初期化 launchReplaceContent { onPopupDisplay("カレンダー", null, InputControlType.NO_SEIGEN) } } is JafEvent.Companion.InitializeWithParameters<*> -> { val params = event.params as? CalendarPopupParams launchReplaceContent { onPopupDisplay( params?.itemName ?: "カレンダー", params?.date, params?.inputControlType ?: InputControlType.NO_SEIGEN ) } } } } /** * Actionハンドリング * 各ActionIDは処理仕様のEYY形式と対応 */ override fun onAction(action: JafAction) { when (action) { is JAFRSHO99130Action.OnMonthSelect -> onMonthSelect() is JAFRSHO99130Action.OnDaySelect -> onDaySelect() is JAFRSHO99130Action.OnMonthScrollLeft -> onMonthScrollLeft() is JAFRSHO99130Action.OnMonthScrollRight -> onMonthScrollRight() is JAFRSHO99130Action.OnCalendarInput -> onCalendarInput(action.selectedDay) is JAFRSHO99130Action.OnClear -> onClear() is JAFRSHO99130Action.OnConfirm -> onConfirm() is JAFRSHO99130Action.OnClose -> onClose() is JAFRSHO99130Action.OnWindowClose -> onWindowClose() } } /** * 【処理仕様: JAFRSHO99130E001】画面表示 * カレンダーポップアップを作成する。 */ private fun onPopupDisplay( itemName: String, date: String?, inputControlType: Int ): JAFRSHO99130UiStateData { return createInitialUiStateData(itemName, date, inputControlType) } /** * 【処理仕様: JAFRSHO99130E002】月-選択 * 選択する候補月をプルダウン形式で表示する。 */ private fun onMonthSelect() { val currentData = getCurrentData() ?: return val currentDay = currentData.selectedDay val selectMonthList = generateSelectMonthList( currentDay,currentData.yearMonth.substring(0,4).toInt()) val monthParamList = selectMonthList.map { month -> Pair(first = "${month}月", second = month) } // 選択月リストの設定 val defaultSelectedMonth = if (currentData.selectedMonth.isNotEmpty()) { Pair( first = "${currentData.selectedMonth}月", second = currentData.selectedMonth ) } else { null } val params = JAFRSHO99050Model( listNameParam = monthParamList, listCountParam = monthParamList.size, listBoxSelectParam = defaultSelectedMonth, onConfirmCallBack = { result -> monthSelectResult = result val selectedMonth = result.second.toString() val currentYear = currentData.yearMonth.substring(0, 4) val targetDay = if (currentData.selectedDay.isNotEmpty()) { val maxDayOfNewMonth = generateSelectDayList( month = selectedMonth.padStart(2, '0'), year = currentYear, ).size val currentDayInt = currentData.selectedDay.toInt() if (currentDayInt > maxDayOfNewMonth) maxDayOfNewMonth else currentDayInt } else { 1 } val newYearMonth = "${currentYear}${selectedMonth.padStart(2, '0')}" val newCalendarData = generateCalendarData(newYearMonth, targetDay) updateSuccess { data -> data.copy( yearMonth = newYearMonth, selectedMonth = selectedMonth.padStart(2, '0'), selectedDay = targetDay.toString(), calendarData = newCalendarData, isMonthScrollLeftEnabled = newYearMonth != "190001", isMonthScrollRightEnabled = newYearMonth != "209912" ) } } ) navigate( route = Jafrsho99010Routes.LIST_SELECT, params = params as Serializable ) } /** * 【処理仕様: JAFRSHO99130E003】日-選択 * 選択する候補日をプルダウン形式で表示する。 */ private fun onDaySelect() { val currentData = getCurrentData() ?: return val currentYear = currentData.yearMonth.substring(0, 4) val currentMonth = currentData.yearMonth.substring(4, 6) val selectDayList = generateSelectDayList(currentMonth, currentYear) val dayParamList = selectDayList.map { day -> Pair(first = "${day}日", second = day) } // 選択日リストを設定 val defaultSelectedDay = if (currentData.selectedDay.isNotEmpty()) { Pair( first = "${currentData.selectedDay}日", second = currentData.selectedDay ) } else { null } val params = JAFRSHO99050Model( listNameParam = dayParamList, listCountParam = dayParamList.size, listBoxSelectParam = defaultSelectedDay, onConfirmCallBack = { result -> daySelectResult = result val selectedDay = result.second.toString() val newCalendarData = generateCalendarData( yearMonth = currentData.yearMonth, selectedDay = selectedDay.toInt() ) updateSuccess { data -> data.copy( selectedDay = selectedDay, calendarData = newCalendarData ) } } ) navigate( route = Jafrsho99010Routes.LIST_SELECT, params = params as Serializable ) } /** * 【処理仕様: JAFRSHO99130E004】月スクロール左-押下 * 月を1つ前に移動する。(例:202505⇒202504) */ private fun onMonthScrollLeft() { val currentData = getCurrentData() ?: return val currentMonth = currentData.yearMonth.substring(4, 6).toInt() val currentYear = currentData.yearMonth.substring(0, 4).toInt() val dayTmp = currentData.selectedDay val (newYear, newMonth) = if (currentMonth == 1) { Pair(currentYear - 1, 12) } else { Pair(currentYear, currentMonth - 1) } val newYearMonth = "$newYear${newMonth.toString().padStart(2, '0')}" val targetDay = if (dayTmp.isNotEmpty()) { val maxDayOfMonth = generateSelectDayList(newMonth.toString().padStart(2, '0'), newYear.toString()).size if (dayTmp.toInt() > maxDayOfMonth) maxDayOfMonth else dayTmp.toInt() } else { 1 } // カレンダー入力領域リフレッシュ val newCalendarData = generateCalendarData(newYearMonth, targetDay) updateSuccess { data -> data.copy( yearMonth = newYearMonth, selectedMonth = newMonth.toString().padStart(2, '0'), selectedDay = targetDay.toString(), calendarData = newCalendarData, isMonthScrollLeftEnabled = newYearMonth != "190001", isMonthScrollRightEnabled = newYearMonth != "209912" ) } } /** * 【処理仕様: JAFRSHO99130E005】月スクロール右-押下 * 月を1つ次に移動する。(例:202505⇒202506) */ private fun onMonthScrollRight() { val currentData = getCurrentData() ?: return val currentMonth = currentData.yearMonth.substring(4, 6).toInt() val currentYear = currentData.yearMonth.substring(0, 4).toInt() val dayTmp = currentData.selectedDay val (newYear, newMonth) = if (currentMonth == 12) { Pair(currentYear + 1, 1) } else { Pair(currentYear, currentMonth + 1) } val newYearMonth = "$newYear${newMonth.toString().padStart(2, '0')}" val targetDay = if (dayTmp.isNotEmpty()) { val maxDayOfMonth = generateSelectDayList(newMonth.toString().padStart(2, '0'), newYear.toString()).size if (dayTmp.toInt() > maxDayOfMonth) maxDayOfMonth else dayTmp.toInt() } else { 1 } val newCalendarData = generateCalendarData(newYearMonth, targetDay) updateSuccess { data -> data.copy( yearMonth = newYearMonth, selectedMonth = newMonth.toString().padStart(2, '0'), selectedDay = targetDay.toString(), calendarData = newCalendarData, isMonthScrollLeftEnabled = newYearMonth != "190001", isMonthScrollRightEnabled = newYearMonth != "209912" ) } } /** * 【処理仕様: JAFRSHO99130E006】カレンダー入力領域-押下 * カレンダー表示領域での日付選択処理 */ private fun onCalendarInput(selectedDay: Int) { val currentData = getCurrentData() ?: return val currentSelectedDay = currentData.selectedDay.toIntOrNull() ?: 0 // 同じ日が選択された場合は処理終了 if (selectedDay == currentSelectedDay) { return } // 項目定義を設定 val monthTmp = currentData.yearMonth.substring(4, 6) // 日にち強調表示設定 val newCalendarData = generateCalendarData(currentData.yearMonth, selectedDay) updateSuccess { data -> data.copy( selectedDay = selectedDay.toString(), selectedMonth = monthTmp.padStart(2, '0'), calendarData = newCalendarData ) } } /** * 【処理仕様: JAFRSHO99130E007】クリア-押下 * 入力された日付をクリアする */ private fun onClear() { val today = DateUtils.getCurrentFormatString(DateUtils.TYPE_5) val yearMonth = today.substring(0, 6) val selectedMonth = today.substring(4, 6).toInt().toString() val selectedDay = today.substring(6, 8).toInt() val newCalendarData = generateCalendarData(yearMonth, selectedDay) updateSuccess { data -> data.copy( yearMonth = yearMonth, selectedMonth = selectedMonth.padStart(2, '0'), selectedDay = selectedDay.toString(), calendarData = newCalendarData, isMonthScrollLeftEnabled = yearMonth != "190001", isMonthScrollRightEnabled = yearMonth != "209912" ) } } /** * 【処理仕様: JAFRSHO99130E008】確定-押下 * 選択された日付を確定して呼び出し元に返却 */ private fun onConfirm() { val currentData = getCurrentData() ?: return if (currentData.selectedMonth.isNotEmpty() ||currentData.selectedDay.isNotEmpty()) { val year = currentData.yearMonth.substring(0, 4) val month = currentData.selectedMonth.padStart(2, '0') val day = currentData.selectedDay.padStart(2, '0') val dateTmp = "$year/$month/$day" onConfirmCallback(dateTmp) }else{ showMessage( Message.JAFRSHO99010IC00230.id, listOf("") ) } navigateBack() } /** * コールバックメソッド */ fun onConfirmCallback(dateTmp: String) = Unit /** * 【処理仕様: JAFRSHO99130E009】閉じる-押下 * ポップアップを閉じる */ private fun onClose() { navigateBack() } /** * 【処理仕様: JAFRSHO99130E010】×(閉じる)-押下 * ウィンドウの×ボタンでポップアップを閉じる */ private fun onWindowClose() { navigateBack() } } /** * カレンダーポップアップの初期パラメータ */ data class CalendarPopupParams( /** 項目名 */ val itemName: String, /** 年月日 */ val date: String?, /** 入力制御種別 */ val inputControlType: Int ) 在onConfirm方法中加一个check IF (inputControlType(入力制御種別) == FUTURE_SEIGEN) ❘ ❘ IF (dateTmp(年月日) > (LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE))) ❘ ❘ ❘ ❘ 業務共通部品(メッセージダイアログ)を呼び出し、エラーメッセージ「未来日の入力はできません。」を表示する。 ❘ ❘ 呼び出し関数名 【画面表示】メッセージダイアログ ❘ ❘ 処理ID JAFRSHO99020 ❘ ❘ 引数 メッセージID "JAFRSHO99010EC00161" ❘ ❘ メッセージパラメータ なし ❘ ❘ 戻り値 なし ❘ ❘ ❘ ❘ 「OK」ボタンを押下すると、処理を終了する。 ❘ ❘ ❘ END IF ❘ ELSE IF (inputControlType(入力制御種別) ==PAST_SEIGEN) ❘ ❘ IF (dateTmp(年月日) < (LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE))) ❘ ❘ ❘ ❘ 業務共通部品(メッセージダイアログ)を呼び出し、エラーメッセージ「過去日の入力はできません。」を表示する。 ❘ ❘ 呼び出し関数名 【画面表示】メッセージダイアログ ❘ ❘ 処理ID JAFRSHO99020 ❘ ❘ 引数 メッセージID "JAFRSHO99010EC00098" ❘ ❘ メッセージパラメータ なし ❘ ❘ 戻り値 なし ❘ ❘ ❘ ❘ 「OK」ボタンを押下すると、処理を終了する。 ❘ ❘ ❘ END IF ❘ END IF
09-26
変更前:制御仕様書No 変更後:制御仕様書No シート名/ページ "変更前 セル" "変更後 セル" 章 変更前:要求ID 変更後:要求ID 変更前 変更後 確認者 差分種別 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link "関係各部署: 変更 履歴 ---------------------- 関係各部署: ---------------------- 関係各部署: ---------------------- FOR LIMITED DISTRIBUTION 関係者外秘: ---------------------- 原紙保管: ---------------------- 年 月: ---------------------- 年 月: " 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link Link No. gncxpiecufunc-a00-00-a No. gncxpiecufunc-a00-01-a 変更 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link Link 作成:電子プラットフォーム開発室第51電子開発室 作成:電子プラットフォーム開発部 車載ネットワーク開発室 変更 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link Link 調査 作成 変更 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link Link 日付 変更内容 変更 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link Link 2015.03.25 初版 変更 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link Link 2018年4月26日 変更 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link Link TEL:050-3184-5798 変更 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link 画像 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link "関係各部署: 特記 事項 ---------------------- 年 月: 新設 or 変更 ・ベース仕様はgncxpiecufunc-a00-00-a ・電子データはCEMS管理(表紙のみ紙面で配布) CEMS:CXPI(CXPI) Folder:CXPI(CXPI)/公開資料(OPEN)/仕様書(SPEC)/ 04_通信機能仕様書(FUNC) " 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 1 Link "関係各部署: 変更 履歴 ---------------------- 関係各部署: ---------------------- 関係各部署: a00-01-a ---------------------- FOR LIMITED DISTRIBUTION 関係者外秘: 改訂履歴参照 <概要> ・上位文書の版数を最新化 ・エラービットに関する要件追加 ・フレーム情報のカウンタに関する要件追加 ・スリープ禁止要因に関する要件修正 ・受信タイムアウトに関する要件修正 ・メモリバンクとスケジュール切替え要件削除 ・制御フレームシーケンスに関する要件修正 ・ウェイクアップパルス検出に関する要件 修正と補足追加 ---------------------- 原紙保管: 2018.04.26 ---------------------- 年 月: 53F3G 梶田 ---------------------- 年 月: " 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 3 Link Link 目次 目次 変更 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link はじめに 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link 本書の目的 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link 本仕様書は、トヨタの通信を標準化するために、Clock Extension Peripheral Interface(CXPI)通信の機能を規定する。 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link 概要 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link 本仕様書はCXPI通信の送信機能、受信機能、フェールセーフ機能、ネットワークマネジメント機能について記載する。 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link 適用範囲 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link トヨタ標準CXPIネットワークに接続するECUの通信機能に本仕様を適用すること。 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link 関連文書 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link 上位文書 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link "ID | ドキュメント名 | バージョン | 発行元 ---------------------- JASO- CXPI- UCS | 自動車 -クロックエクステンション ペリフェラルインターフェース(CXPI)- 第1部: 規格概要とユースケース定義 | JASO D 015-1:2015 2014年11月部会提出版 | 公益社団法人自動車技術会(JSAE) ---------------------- JASO- CXPI- PS | 自動車 -クロックエクステンション ペリフェラルインターフェース(CXPI)- 第3部: プロトコル仕様 | JASO D 015-3:2015 2014年11月部会提出版 | 公益社団法人自動車技術会(JSAE) ---------------------- JASO- CXPI- PCT | 自動車 -クロックエクステンション ペリフェラルインターフェース(CXPI)- 第5部: プロトコルコンフォーマンステスト仕様 | JASO D 015-5:2015 2014年11月部会提出版 | 公益社団法人自動車技術会(JSAE) ---------------------- TMC- CXSTR | CXPI通信ストラテジ仕様書 | gncxpistg | TMC 51F2G" 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link 参考文書 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 4 Link "ID | ドキュメント名 | オブジェクト名称 | 発行元 ---------------------- TMC-CXHW | CXPI ECU標準ハードウェア仕様書 | gncxpiecuhard | TMC 51F2G ---------------------- TMC-CXNDF | CXPIネットワーク記述仕様書 | gncxpinetfmt | TMC 51F2G ---------------------- TMC-DS | Phase4 ダイアグシステム通信仕様書 | 2.15-d | TMC 21F4G ---------------------- TMC-CXDS | CXPIダイアグシステム通信仕様書 | gncxpidiadcmn | TMC" 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link "1 はじめに 7" はじめに 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1 はじめに 本書の目的 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1.1 本書の目的 本仕様書は、トヨタの通信を標準化するために、Clock Extension Peripheral Interface(CXPI)通信の機能を規定する。 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1 はじめに 概要 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1.2 概要 本仕様書はCXPI通信の送信機能、受信機能、フェールセーフ機能、ネットワークマネジメント機能について記載する。 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1 はじめに 適用範囲 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1.3 適用範囲 トヨタ標準CXPI通信ネットワークに接続するECUの通信機能に本仕様を適用すること。 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1 はじめに 関連文書 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1.4 関連文書 上位文書 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 用語 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1.4 関連文書 画像 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link "名称 | 説明 ---------------------- +B系ノード | 電源状態が+B/ACC on/IG onで通信を行うノード ---------------------- ACC系ノード | 電源状態がACC on/IG onで通信を行うノード ---------------------- IG系ノード | 電源状態がIG onで通信を行うノード ---------------------- フレーム | データリンク層の伝送ユニットとして伝送メディアへ送り出される、 情報の論理的なグループ ---------------------- メッセージ | アプリケーション層における情報の論理グループ ---------------------- フレーム(メッセージ) スロット | 1つのフレームのために予約された時間 時間単位であるtime baseの自然数倍で定義する ---------------------- ダイアグ | 機器の故障部位を特定しやすくするための情報 例) ・通信システム自体の異常の有無 ・システム内のノード故障状態または履歴 ・システム内のノードの接続状態 ---------------------- scan tool(サービスツール) | サービスツール/工場の設備など ---------------------- リモートツール | リモートダイアグを実施するときにセンタからの要求をCANへ送信する ツール(例:EMV) ---------------------- 送信ノード | PID領域または、レスポンス領域を送信するノード ---------------------- 受信ノード | PID領域または、レスポンス領域を受信するノード ---------------------- 通信無効判定 | メッセージを受信できないことなどにより各システムがフェールセーフを 行うか否かを判断すること ---------------------- 通信無効判定時間 | 通信無効判定する時間の閾値 ---------------------- 通信異常判定 | メッセージを受信できないことにより各システムがダイアグコードを 記憶するか否かを判断すること ---------------------- 通信異常判定時間 | 通信異常判定する時間の閾値 ---------------------- チャネル | 送信と受信を行う単位。1つのECUで複数持つことが可能 ---------------------- 受信DLC値 | CXPIプロトコル(DL)処理部品が受信した正当なメッセージの フレーム情報のDLC(バーストフレームの場合は拡張DLC)の値 ---------------------- 定義DLC値 | トヨタ通信仕様書で、受信するメッセージごとに定義されているDLCの値 ---------------------- CXPIプロトコル(DL)処理部品 | [JASO-CXPI-PS]5.4”データリンク層“に準拠した動作をする部品。 図 4-2参照 ---------------------- 送信禁止 | エラーカウンタ値が255を超えたことにより、PIDおよびレスポンスの送信が 禁止されたCXPIプロトコル(DL)処理部品の状態[JASO-CXPI-PS]5.4.11”フェール管理“ ---------------------- メッセージレジスタ | CXPIコントローラ内のメッセージを送受信するためのレジスタ ---------------------- データレジスタ | UARTコントローラ内のバイトデータを送受信するためのレジスタ" 削除 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1.4 関連文書 画像 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1.4 関連文書 画像 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 5 Link 1.4 関連文書 "ID | ドキュメント名 | バージョン | 発行元 ---------------------- JASO- CXPI- UCS | 自動車 -クロックエクステンション ペリフェラルインターフェース(CXPI)- 第1部: 規格概要とユースケース定義 | JASO D 015-1:2015 | 公益社団法人自動車技術会(JSAE) ---------------------- JASO- CXPI- PS | 自動車 -クロックエクステンション ペリフェラルインターフェース(CXPI)- 第3部: プロトコル仕様 | JASO D 015-3:2015 | 公益社団法人自動車技術会(JSAE) ---------------------- JASO- CXPI- PCT | 自動車 -クロックエクステンション ペリフェラルインターフェース(CXPI)- 第5部: プロトコルコンフォーマンステスト仕様 | JASO D 015-5:2015 | 公益社団法人自動車技術会(JSAE) ---------------------- TMC- CXSTR | CXPI通信ストラテジ仕様書 | gncxpistg | TMC 53F3G" 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 6 Link 1.4 関連文書 参考文書 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 6 Link 1.4 関連文書 画像 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 6 Link 1.4 関連文書 画像 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 6 Link 1.4 関連文書 画像 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 6 Link 1.4 関連文書 画像 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 6 Link 1.4 関連文書 画像 追加 gncxpiecufunc-a00-00-a-1.docx gncxpiecufunc-a00-00-a-2.docx 6 Link 1.4 関連文書 "ID | ドキュメント名 | オブジェクト名称 | 発行元 ---------------------- TMC-CXSTG | CXPI 通信ストラテジ仕様書 | gncxpistggncxpispf | TMC 53F3G ---------------------- TMC-CXHW | CXPI ECU標準ハードウェア仕様書 | gncxpiecuhard | TMC 53F3G ---------------------- TMC-CXNDF | CXPIネットワーク記述仕様書 | gncxpinetfmt | TMC 53F3G ---------------------- TMC-DS | Phase4 ダイアグシステム通信仕様書 | 2.15-d | TMC 21F4G ---------------------- TMC-CXDS | CXPI Phase5 ダイアグシステム標準通信仕様書(Phase5 on CXPI) CXPIダイアグシステム通信仕様書 | docxpi-rd000 CXPI-DGCOM-rd000-000-a | TMC F5X" 追加 明明内容是一样的,为什么会被判定为追加删除
12-10
参照下面代码的写法和设计书的逻辑,做出JAFRSHO99080ViewModel 参照: @HiltViewModel class JAFRSHO99150ViewModel @Inject constructor() : JafViewModel<JAFRSHO99150UiStateData>() { private lateinit var onConfirmCallBack: ((String) -> Unit) /** * システムイベント処理 * @param event イベントオブジェクト */ override fun onEvent(event: JafEvent) { when (event) { // 初期化イベント(パラメータ付き) is JafEvent.Companion.InitializeWithParameters<*> -> { val params = event.params as JAFRSHO99150Model onConfirmCallBack = params.onConfirmCallBack launchReplaceContent { onPopupDisplay( params.inputValueParam, params.titleParam ) } } } } /** * アクション処理 * @param action アクション */ override fun onAction(action: JafAction) { when (action) { // 時刻 時表示領域フォーカス is JAFRSHO99150Action.OnHourActive -> { onHourActive() } // 時刻 分表示領域フォーカス is JAFRSHO99150Action.OnMinuteActive -> { onMinuteActive() } // ×(閉じる)ボタン押下アクション is JAFRSHO99150Action.OnWindowClose -> { onWindowClose() } // 数値入力 is JAFRSHO99150Action.OnTimeInput -> { onTimeInput(action.inputValueParam) } // 閉じるボタン押下アクション is JAFRSHO99150Action.OnClose -> { onClose() } // クリアボタン押下 is JAFRSHO99150Action.OnClear -> { onClear() } // 確定押下 is JAFRSHO99150Action.OnConfirm -> { onConfirm() } } } /** * 【処理ID: JAFRSHO99150E001】 * 画面表示 * @param inputValueParam 入力値 * @param titleParam タイトル項目 * * @return 初期化されたUI状態データ */ public fun onPopupDisplay( inputValueParam: String, titleParam: String ): JAFRSHO99150UiStateData { // 入力時刻を時表示領域と分表示領域に分割 val (hourPart, minutePart) = if (inputValueParam == "") { Pair("", "") } else { val houtPart = inputValueParam.substring(0, 2) val minutePart = inputValueParam.takeLast(2) Pair(houtPart, minutePart) } return JAFRSHO99150UiStateData( title = titleParam, lblHourDisplay = hourPart, lblMinuteDisplay = minutePart, focusField = "hour" ) } /** * 【処理ID: JAFRSHO99150E002】 * 時刻 時表示領域 - 押下 */ public fun onHourActive() { val currentData = getCurrentData() ?: return // focusField(フォーカス領域)=="hour"の場合、処理を終了する。 if (currentData.focusField == "hour") return // 項目定義.lblMinuteDisplay(時刻 分表示領域).length==1 if (currentData.lblMinuteDisplay.length == 1) { updateSuccess { data -> data.copy( focusField = "hour", lblMinuteDisplay = data.lblMinuteDisplay.padStart( 2, '0' ) ) } } else { // 項目定義.lblHourDisplay(時刻 時表示領域)にフォーカスを設定し、選択状態にする。 setSuccess(currentData.copy(focusField = "hour")) } } /** * 【処理ID: JAFRSHO99150E003】 * 時刻 分表示領域 - 押下 */ public fun onMinuteActive() { val currentData = getCurrentData() ?: return // focusField(フォーカス領域)=="minute"の場合、処理を終了する。 if (currentData.focusField == "minute") return // (項目定義.lblHourDisplay(時刻 時表示領域).length == 1) if (currentData.lblHourDisplay.length == 1) { updateSuccess { data -> data.copy( focusField = "minute", lblHourDisplay = data.lblHourDisplay.padStart( 2, '0' ) ) } } else { // 項目定義.lblMinuteDisplay(時刻 分表示領域)にフォーカスを設定し、選択状態にする。 setSuccess(currentData.copy(focusField = "minute")) } } /** * 【処理ID: JAFRSHO99150E005】 * 時刻入力領域 - 押下 * @param inputValueParam 設定値 */ public fun onTimeInput(inputValueParam: String) { // 入力値検証 val currentData = getCurrentData() ?: return // 現在のフォーカス領域判断 when (currentData.focusField) { // 時表示領域 "hour" -> { if (inputValueParam == "00") { val updatedData = currentData.copy(lblHourDisplay = "00") setSuccess(updatedData.copy(focusField = "minute")) } else if (inputValueParam.toIntOrNull() ?.takeIf { 0 <= it && it <= 9 } != null ) { // 時表示領域に追加入力可能な場合 if (currentData.lblHourDisplay.length < MAX_INPUT_LENGTH) { val newHour = currentData.lblHourDisplay + inputValueParam val updatedData = currentData.copy(lblHourDisplay = newHour) // 時表示領域が最大長に達したら分表示領域にフォーカス移動 if (newHour.length == MAX_INPUT_LENGTH) { setSuccess(updatedData.copy(focusField = "minute")) } else { // 処理を終了する。 setSuccess(updatedData) } // 分表示領域に追加入力可能な場合(時表示領域から) } else if (currentData.lblMinuteDisplay.length < MAX_INPUT_LENGTH) { val newMinute = currentData.lblMinuteDisplay + inputValueParam setSuccess( currentData.copy( lblMinuteDisplay = newMinute, focusField = "minute" ) ) } else { // 処理を終了する。 setSuccess(currentData) } } else if (inputValueParam == "DEL") { if (currentData.lblHourDisplay.isNotEmpty()) { setSuccess( // 時表示領域末尾に一桁削除 currentData.copy( lblHourDisplay = currentData.lblHourDisplay.dropLast( 1 ) ) ) } else { // 処理を終了する。 setSuccess(currentData) } } } // 分表示領域 "minute" -> { if (inputValueParam == "00") { val updatedData = currentData.copy(lblMinuteDisplay = "00") setSuccess(updatedData) } else if (inputValueParam.toIntOrNull() ?.takeIf { 0 <= it && it <= 9 } != null ) { // 分表示領域に追加入力可能な場合 if (currentData.lblMinuteDisplay.length < MAX_INPUT_LENGTH) { val newMinute = currentData.lblMinuteDisplay + inputValueParam setSuccess(currentData.copy(lblMinuteDisplay = newMinute)) } else { // 処理を終了する。 setSuccess(currentData) } } else if (inputValueParam == "DEL") { if (currentData.lblMinuteDisplay.isNotEmpty()) { // 分表示領域末尾に一桁削除 setSuccess( currentData.copy( lblMinuteDisplay = currentData.lblMinuteDisplay.dropLast(1) ) ) // 分表示領域が空の場合は時表示領域にフォーカス移動して削除 } else if (currentData.lblHourDisplay.isNotEmpty()) { setSuccess( // 時表示領域末尾に一桁削除 currentData.copy( lblHourDisplay = currentData.lblHourDisplay.dropLast(1), focusField = "hour" ) ) } else { // 処理を終了する。 setSuccess(currentData) } } } else -> { // 処理を終了する。 setSuccess(currentData) } } } /** * 【処理ID: JAFRSHO99150E004】 * ×(閉じる) - 押下 * 時刻入力用ポップアップを閉じる */ public fun onWindowClose() { navigateBack() } /** * 【処理ID: JAFRSHO99150E006】 * 閉じる処理 * 時刻入力用ポップアップを閉じる */ public fun onClose() { navigateBack() } /** * 【処理ID: JAFRSHO99150E007】 * クリア - 押下 */ public fun onClear() { // 入力値検証 val currentData = getCurrentData() ?: return setSuccess( // 時表示領域と分表示領域をクリアして、時表示領域にフォーカス移動する currentData.copy( lblHourDisplay = "", lblMinuteDisplay = "", focusField = "hour" ) ) } /** * 【処理ID: JAFRSHO99150E008】 * 確定 - 押下 * @return 時刻 (String型) */ public fun onConfirm() { // 入力値検証 val currentData = getCurrentData() ?: JAFRSHO99150UiStateData() // 項目定義.lblHourDisplay(時刻 時表示領域).toInt() > 23 if (currentData.lblHourDisplay.isNotEmpty() && currentData.lblHourDisplay.toInt() > 23 ) { showMessage( messageId = Message.JAFRSHO99010EC00126.id, messageParameter = listOf("") ) return } // 項目定義.lblMinuteDisplay(時刻 分表示領域).toInt() > 59 if (currentData.lblMinuteDisplay.isNotEmpty() && currentData.lblMinuteDisplay.toInt() > 59 ) { showMessage( messageId = Message.JAFRSHO99010EC00158.id, messageParameter = listOf("") ) return } // 時刻 時表示領域と時刻 分表示領域の入力値をコロンで連結し、内部変数.入力時刻に退避する。 val timeTmp: String = currentData.lblHourDisplay.padStart( 2, '0' ) + ":" + currentData.lblMinuteDisplay.padStart(2, '0') // 呼び出し元画面クラスのコールバックメソッドを呼び出し、入力時刻を引数として渡す。 onConfirmCallBack(timeTmp) // 時刻入力用ポップアップを閉じる。 navigateBack() } } 参照: /** * 数値入力用用ポップアップの成功状態のデータを表すデータクラス * * @property screenId 画面ID * @property title タイトル項目 * @property txtboxNumShowArea 数値表示領域 * @property currentState 現在の状態 */ data class JAFRSHO99080UiStateData( override var screenId: String = "Jafrsho99080", /** タイトル項目 */ val title: String = "", /** 数値表示領域 */ val txtboxNumShowArea: String = "0", /** 設定値 */ val inputValueParam: String = "", /** 現在の状態 */ val currentState: JAFRSHO99080Action? = null ) : JafUiStateData /** * 数値入力用ポップアップの成功状態のデータを表すデータクラス */ data class JAFRSHO99080Model( /** ダイアログタイトル(リソースID) */ override var titleRes: Int = -1, /** ダイアログタイトル(文字列) */ override var titleString: String = "", /** 入力値 */ val inputValue: String, /** 入力欄の最大文字数 */ val digitMax: Int = 10, /** コールバック関数 */ val onConfirmCallBack: (String) -> Unit = {} ) : JafNavModel sealed class JAFRSHO99080Action : JafAction { /** * 数値入力領域押下アクション *@property input 設定値 */ data class OnNumInputArea(val input: String) : JAFRSHO99080Action() /** 閉じるボタン押下アクション */ object OnClose : JAFRSHO99080Action() /** クリアボタン押下アクション */ object OnClear : JAFRSHO99080Action() /** 確定ボタン押下アクション */ object OnConfirm : JAFRSHO99080Action() /** ×(閉じる)ボタン押下アクション */ object OnWindowClose : JAFRSHO99080Action() } public fun onPopupDisplay( iteamNameParam: String, inputNumberParam: String, digitMaxParam: String){} 参照: E001画面表示onPopupDisplay 1. 数値入力用ポップアップ画面を初期化する。 1.1 インスタンス変数を設定する。 No. インスタンス変数 設定値 1 digitMaxParam(桁数上限値) 引数.digitMaxParam(桁数上限値) 2. 数値入力用ポップアップを作成する。 2.1 ダイアログのタイトルを設定する。 title = 引数.iteamNameParam(項目名) 2.2 画面の項目に設定する。 項目定義 設定値 txtboxNumShowArea(数値表示領域) 引数.inputNumberParam(入力値) 2.3 受信した内容を表示する。 画面UIが以下の基本設計書の「画面レイアウト」シートをご参照ください。 ※JAF_RS-24-基設-車業-画面117-01_画面設計書数値入力用ポップアップ.xlsx 2.4 ボタンの出力値を設定する。 数値入力領域にボタンと対応する出力値を定義する。 ボタン名 設定値 1 "1" 2 "2" 3 "3" 4 "4" 5 "5" 6 "6" 7 "7" 8 "8" 9 "9" 0 "0" 00 "00" ← "DEL" 2.5 【業務共通部品】ポップアップ画面を表示する。 ボタンリスト - 1 ボタン名 数値入力領域 Func機能 onNumInputArea()を呼び出すこと。 引数 設定値(ボタンと対応する出力値) 表示/非表示 表示 活性/非活性 活性 2 ボタン名 閉じる Func機能 onClose()を呼び出すこと。 表示/非表示 表示 活性/非活性 活性 3 ボタン名 クリア Func機能 onClear()を呼び出すこと。 表示/非表示 表示 活性/非活性 活性 4 ボタン名 確定 Func機能 onConfirm()を呼び出すこと。 表示/非表示 表示 活性/非活性 活性 5 ボタン名 ×(閉じる) Func機能 onWindowClose()を呼び出すこと。 表示/非表示 表示 活性/非活性 活性 E002数値入力領域 - 押下OnNumInputArea 1. 数値入力領域押下を処理する。 IF (inputValueParam(設定値) == "DEL") ❘ ❘ IF (項目定義.txtboxNumShowArea(数値表示領域).isNullOrEmpty()) ❘ ❘ ❘ ❘ 処理を終了する。 ❘ ❘ ❘ ELSE ❘ ❘ ❘ ❘ 項目定義.txtboxNumShowArea(数値表示領域).dropLast(1) ❘ ❘ ❘ END IF ❘ ELSE IF (inputValueParam(設定値) >= "1" && inputValueParam(設定値) <= "9")) ❘ ❘ IF (項目定義.txtboxNumShowArea(数値表示領域).length >= digitMax(桁数上限値)) ❘ ❘ ❘ ❘ 項目定義.txtboxNumShowArea(数値表示領域)に挿入しない。 ❘ ❘ ❘ ELSE ❘ ❘ ❘ ❘ 項目定義.txtboxNumShowArea(数値表示領域) +=inputValueParam(設定値) ❘ ❘ ❘ END IF ❘ ELSE IF (inputValueParam(設定値) == "0" || inputValueParam(設定値) == "00") ❘ ❘ IF (項目定義.txtboxNumShowArea(数値表示領域).isNullOrEmpty()) ❘ ❘ ❘ ❘ 処理を終了する。 ❘ ❘ ❘ ELSE IF (項目定義.txtboxNumShowArea(数値表示領域)の設定値桁数>=digitMax(桁数上限値)) ❘ ❘ ❘ ❘ 項目定義.txtboxNumShowArea(数値表示領域)に挿入しない ❘ ❘ ❘ ELSE IF (項目定義.txtboxNumShowArea(数値表示領域).length == (digitMax(桁数上限値) -1)) ❘ ❘ ❘ ❘ 項目定義.txtboxNumShowArea(数値表示領域) +="0" ❘ ❘ ❘ ELSE ❘ ❘ ❘ ❘ 項目定義.txtboxNumShowArea(数値表示領域) +=inputValueParam(設定値) ❘ ❘ ❘ END IF ❘ END IF E003OnClose 1. 数値入力用ポップアップを閉じる。 E004クリア - 押下OnClear 1. 項目定義.数値表示領域に' '(空)を設定する。 E005確定 - 押下OnConfirm 1. 呼び出し元画面クラスのコールバックメソッドを呼び出し、数値を引数として渡す。 呼び出し関数名 【コールバックメソッド】onConfirmCallBack 引数 入力数値 項目定義.txtboxNumShowArea(数値表示領域) 戻り値 なし 2. 数値入力用ポップアップを閉じる。 E006×(閉じる) - 押下OnWindowClose 1. 数値入力用ポップアップを閉じる。
11-12
考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值