コンポーネントスクリプトの例
以下は,データ収集系を構成するコンポーネント群の配置と接続を記述したスクリプトの例です.
この例はかなり複雑ですが,通常,エンドユーザはこのレベルのスクリプトを編集する必要はありません.スクリプトの表現力の例として御覧ください.
/* SmallKinoko.kcom */
/* Created by Enomoto Sanshiro on 27 August 2000. */
/* Last updated by Enomoto Sanshiro on 15 May 2002. */
import KinokoCollector;
import KinokoDataFlowMeter;
import KinokoBuffer;
import KinokoRecorder;
import KinokoViewer;
import KinokoController;
import KinokoLogger;
import KinokoReporter;
string host = "localhost";
int buffer_size = 32 * 1024 * 1024;
string log_file_name = "log-smallkinoko.xml";
string report_file_name = "report-smallkinoko.xml";
string kinoko_root = getEnvironmentVariable("KINOKO_ROOT");
if (kinoko_root == "") {
println("ERROR: environment variable KINOKO_ROOT is not defined");
exit;
}
string script_path = kinoko_root + "/scripts";
int is_enterprise_mode = 0;
if (isOptionSpecified("--enterprise")) {
is_enterprise_mode = 1;
}
int default_port_base = 45000;
int port_base;
string port_base_string = getEnvironmentVariable("KINOKO_SHELL_PORT_BASE");
if (port_base_string != "") {
try {
port_base = port_base_string;
}
catch {
port_base = default_port_base;
}
}
else {
port_base = default_port_base;
}
int port_control = port_base;
int port_log = port_base + 1;
int port_view = port_base + 2;
string ui_control = "port: " + port_control;
string ui_log = "port: " + port_log;
string ui_view = "port: " + port_view;
execute("kinoko-control --client localhost " + port_control);
execute("kinoko-board --client localhost " + port_log);
execute("kinoko-canvas --client localhost " + port_view);
component KinokoController controller(host, ui_control);
component KinokoReporter reporter(host);
component KinokoCollector collector(host);
component KinokoBuffer buffer(host);
component KinokoRecorder recorder(host);
component KinokoDataFlowMeter flow_meter(host);
component KinokoViewer viewer(host, ui_view);
component KinokoLogger logger(host, ui_log);
string readout_script;
string readout_datasource;
string view_script;
string view_display;
string data_file;
long start_time = 0;
long stop_time = 0;
int error_count = 0;
int warning_count = 0;
int supernova_count = 0;
string error_message;
int is_constructed = 0;
int is_running = 0;
on startup()
{
println();
println("****************************");
println("* Welcome to SmallKinoko *");
println("****************************");
println();
setTimeout(10);
logger.startLogging(log_file_name);
if (is_enterprise_mode) {
controller.open(script_path + "/SmallKinoko-Enterprise.kcml");
controller.load("last.smallkinoko-enterprise.kcv");
}
else {
controller.open(script_path + "/SmallKinoko.kcml");
controller.load("last.smallkinoko.kcv");
}
controller.changeState("component_ready");
connect();
if (error_count == 0) {
controller.changeState("stream_ready");
}
else {
controller.set("message", "error: click [quit] to shutdown");
controller.changeState("error");
}
}
on shutdown()
{
println();
println("shutdown completed");
}
on controller.construct()
{
if (is_constructed) {
disableTimeout();
string dicision = controller.openQueryPopup("Warning", "Yes No", "system already constructed\n-- reconstruct?");
enableTimeout();
if (dicision != "Yes") {
return;
}
destruct();
is_constructed = 0;
}
controller.changeState("constructing");
controller.set("message", "constructing...");
if (construct() && (error_count == 0)) {
controller.changeState("system_ready");
controller.set("message", "system is ready to start data acquisition");
is_constructed = 1;
}
else {
controller.changeState("stream_ready");
controller.set("message", "system construction failed: try again.");
}
}
on controller.start()
{
controller.changeState("data_taking");
controller.set("message", "data taking...");
start();
is_running = 1;
}
on controller.stop()
{
controller.changeState("stopping");
controller.set("message", "stopping");
stop();
is_running = 0;
}
on recorder.finishRecording()
{
controller.changeState("system_ready");
controller.set("message", "system is ready to start data acquisition");
}
on controller.clear()
{
viewer.reset();
}
on controller.quit()
{
controller.changeState("shutdown");
controller.set("message", "shutting down");
if (is_enterprise_mode) {
controller.save("last.smallkinoko-enterprise.kcv");
}
else {
controller.save("last.smallkinoko.kcv");
}
if (is_constructed) {
destruct();
}
disconnect();
quit();
exit;
}
on recorder.diskSpaceExhausted()
{
logger.writeError("disk space exhausted");
if (is_running) {
controller.changeState("stopping");
controller.set("message", "stopping");
stop();
is_running = 0;
}
}
on logger.processWarning(string message)
{
++warning_count;
}
on logger.processError(string message)
{
if (error_count == 0) {
error_message = message;
controller.openPopup("Error", "OK", message);
}
print("\a");
++error_count;
}
on logger.processPanic(string message)
{
}
void connect()
{
buffer.setBufferSize(buffer_size);
buffer.start();
asynchronously {
collector.setSink(buffer);
recorder.setSource(buffer);
flow_meter.setSourceSink(buffer, viewer);
viewer.setSource(flow_meter);
}
asynchronously {
collector.connect();
recorder.connect();
flow_meter.connect();
viewer.connect();
}
}
int construct()
{
string run_name = getRegistry("control/run_name");
string comment = getRegistry("control/comment");
readout_script = getRegistry("control/readout_script");
readout_datasource = "";
view_script = getRegistry("control/view_script");
view_display = "";
data_file = getRegistry("control/data_file");
if (recorder.isFileReadable(data_file)) {
disableTimeout();
string dicision = controller.openQueryPopup("Warning", "Yes No", "file exists: " + data_file + " -- overwrite?");
enableTimeout();
if (dicision != "Yes") {
return 0;
}
}
if (! recorder.isFileWritable(data_file)) {
controller.openPopup("ERROR", "OK", "unable to create file: " + data_file);
return 0;
}
reporter.open(report_file_name);
reporter.write("run-name", run_name);
reporter.write("comment", comment);
reporter.write("date", localTime());
reporter.write("log-file", log_file_name);
reporter.write("buffer-size", buffer_size);
reporter.write("data-file", data_file);
reporter.write("script", readout_script, "target=collector", "type=kts");
reporter.write("script", view_script, "target=viewer", "type=kvs");
asynchronously {
collector.setReadoutScript(readout_script, readout_datasource);
viewer.setViewScript(view_script, view_display);
}
recorder.setDataFile(data_file);
recorder.requireDiskSpace(1024 * 1024);
// note that normal small-kinoko does not provide the following options
if (getRegistry("control/prohibit_overwrite") != 1) {
recorder.allowOverWrite();
}
if (getRegistry("control/set_readonly") == 1) {
recorder.setDataFileReadOnly();
}
if (getRegistry("control/enable_compression") == 1) {
recorder.enableCompression();
}
if (getRegistry("control/make_index") == 1) {
recorder.enableIndex();
}
recorder.addHeaderEntry("RunName", run_name);
recorder.addHeaderEntry("Comment", comment);
asynchronously {
collector.construct();
recorder.construct();
flow_meter.construct();
viewer.construct();
}
return 1;
}
void start()
{
start_time = time();
reporter.write("start-time", localTime());
reporter.write("start-unix-time", start_time);
collector.start();
}
void stop()
{
stop_time = time();
viewer.saveImage("picture-smallkinoko.png");
collector.stop();
reporter.write("picture", "picture-smallkinoko.png", "name=viewer");
reporter.write("stop-time", localTime());
reporter.write("stop-unix-time", stop_time);
reporter.write("running-time", stop_time - start_time);
}
void destruct()
{
asynchronously {
collector.destruct();
recorder.destruct();
flow_meter.destruct();
viewer.destruct();
}
reporter.write("event-count", warning_count, "type=warning");
reporter.write("event-count", error_count, "type=error");
reporter.write("error-message", error_message);
reporter.close();
error_message = "";
warning_count = 0;
error_count = 0;
}
void disconnect()
{
asynchronously {
collector.disconnect();
recorder.disconnect();
flow_meter.disconnect();
viewer.disconnect();
}
}
void quit()
{
asynchronously {
collector.quit();
recorder.quit();
flow_meter.quit();
viewer.quit();
buffer.quit();
logger.quit();
reporter.quit();
controller.quit();
}
}