// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import <LoggerInterface.camkes>;
import <ProcessControlInterface.camkes>;
import <PackageManagementInterface.camkes>;
import <MlCoordinatorInterface.camkes>;
import <MemoryInterface.camkes>;
import <UARTDriverInterface.camkes>;
import <SecurityCoordinatorInterface.camkes>;
import <TimerServiceInterface.camkes>;
import <SDKManagerInterface.camkes>;

component DebugConsole {
  control;

  provides LoggerInterface logger;
  uses MemoryInterface memory;
  // NB: load+unload are optional shell commands
  maybe uses PackageManagementInterface pkg_mgmt;
  uses ProcessControlInterface proc_ctrl;
  maybe uses SecurityCoordinatorInterface security;
  maybe uses SDKManagerInterface sdk_manager;

  // Optional device support.

  // ML Coordinator service (currently needs ML accelerator)
  maybe uses MlCoordinatorInterface mlcoord;

  // Timer service requires device support
  maybe uses Timer timer;

  // UART device
  maybe dataport Buf tx_dataport;
  maybe uses uart_write_inf uart_write;

  maybe dataport Buf rx_dataport;
  maybe uses uart_read_inf uart_read;

  // Enable CantripOS CAmkES support.
  attribute int cantripos = true;

  // When dynamic loading is configured, install requests upload a
  // package that requires enough slots to hold dynamically allocated
  // memory for the package contents. Size this to handle up to 4MB
  // (at 4KB / page) though that exceeds our target memory config.
//  attribute int cnode_headroom = 1024;

  // Copyregions for zmodem upload and for loading bundle images.
  // Could do this with one region since upload never happens
  // concurrently with bundle image loading.
  has copyregion BUNDLE_IMAGE;
  has copyregion UPLOAD;

  // Disable unused threads.
  attribute int timer_has_thread = false;
  attribute int mlcoord_has_thread = false;
}
