Class: NotifierPlugin

Inherits:
CelltypePlugin show all
Defined in:
lib/tecsgen/plugin/NotifierPlugin.rb

Defined Under Namespace

Classes: ActivateTaskHandlerType, AdapterGenerator, BaseHandlerType, BaseTaskHandlerType, DataqueueHandlerType, Handler, HandlerAttribute, IncrementVariableHandlerType, NullHandlerType, SendErrorCodeToDataqueueHandlerType, SendToDataqueueHandlerType, SetEventflagHandlerType, SetVariableHandlerType, SetVariableToErrorCodeHandlerType, SignalSemaphoreHandlerType, UserHandlerType, WakeUpTaskHandlerType

Constant Summary collapse

EVENT_HANDLER =

通常のハンドラ

Handler.new("ciNotificationHandler")
ERROR_HANDLER =

エラーハンドラ (通常のハンドラが失敗した場合に呼び出される)

Handler.new("ciErrorNotificationHandler")
HANDLERS =
[
  EVENT_HANDLER,
  ERROR_HANDLER
]
SETVAR_ADDR_ATTR =

—— 通知の属性の定義 ——-

ハンドラタイプに合致しない属性が指定された場合に エラーを出力できるよう、全ての属性をここで列挙する。

HandlerAttribute.new("setVariableAddress")
SETVAR_VALUE_ATTR =
HandlerAttribute.new("setVariableValue")
INCVAR_ADDR_ATTR =
HandlerAttribute.new("incrementedVariableAddress")
SNDDTQ_VALUE_ATTR =
HandlerAttribute.new("dataqueueSentValue")
SETFLG_FLAG_ATTR =
HandlerAttribute.new("flagPattern")
ATTRS =
[
  SETVAR_ADDR_ATTR,
  SETVAR_VALUE_ATTR,
  INCVAR_ADDR_ATTR,
  SNDDTQ_VALUE_ATTR,
  SETFLG_FLAG_ATTR
]
HANDLER_TYPES =
[
  ActivateTaskHandlerType.new,
  WakeUpTaskHandlerType.new,
  SetVariableHandlerType.new,
  SetVariableToErrorCodeHandlerType.new,
  IncrementVariableHandlerType.new,
  SignalSemaphoreHandlerType.new,
  SetEventflagHandlerType.new,
  SendToDataqueueHandlerType.new,
  SendErrorCodeToDataqueueHandlerType.new,
  UserHandlerType.new,
  NullHandlerType.new
]

Constants inherited from Plugin

Plugin::PluginArgProc

Instance Method Summary collapse

Methods inherited from CelltypePlugin

gen_post_code, #new_cell

Methods inherited from Plugin

#cdl_error, #check_plugin_arg, #gen_cdl_file, #gen_ep_func?, #gen_postamble, #gen_preamble, #new_cell, #parse_plugin_arg, #print_msg, #set_locale, #set_silent

Methods inherited from Node

#cdl_error, #cdl_error2, #cdl_error3, #cdl_info, #cdl_info2, #cdl_warning, #cdl_warning2, #get_locale, #locale_str, #set_locale

Constructor Details

#initialize(celltype, option) ⇒ NotifierPlugin

@celltype

Celltype

@option

String :オプション文字列



927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
# File 'lib/tecsgen/plugin/NotifierPlugin.rb', line 927

def initialize(celltype, option)
  super
  @plugin_arg_check_proc_tab = NotifierPluginArgProc
  @plugin_arg_str = option
  @plugin_arg_str = option.gsub(/\A"(.*)/, '\1') # 前後の "" を取り除く
  @plugin_arg_str.sub!(/(.*)"\z/, '\1')
  @factory = nil
  @output_file = nil
  parse_plugin_arg
  unless @factory
    cdl_error("NTF1003 celltype $1: option factory is not specified",
      celltype.get_name)
  end
  unless @output_file
    cdl_error("NTF1003 celltype $1: option output_file is not specified",
      celltype.get_name)
  end
end

Instance Method Details

#gen_factory(file) ⇒ Object



962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
# File 'lib/tecsgen/plugin/NotifierPlugin.rb', line 962

def gen_factory(file)
    # puts "===== begin #{@celltype.get_name.to_s} plugin ====="

  kernelCfg = AppFile.open("#{$gen}/#{@output_file}")
    kernelCfg.print "\n/* Generated by #{self.class.name} */\n"
    kernelCfg.print "\#include \"tTimeEventHandler.h\"\n"

# アダプタ関数を生成する準備
@adpt_gen = AdapterGenerator.new("tTimeEventHandler", @celltype.get_global_name)

  # 属性置換が行えることを検証する。
  # ここで行うのは、factoryで指定された属性名が
  # 存在することを確認し、しなければエラーを出力することのみである。
  # セルごとの処理の最中にエラーを出力することも可能ではあるが、
  # そうするとセルタイプ側の問題であるのにもかかわらず、セルごとに
  # エラーが表示されてしまう。
  # {{attribute_name}} -> attribute_value
  @factory.scan(/\{\{([a-zA-Z0-9_]*?)\}\}/) {|match|
  name = $1.to_sym

    # {{_handler_params_}} はハンドラに関する指定。プラグイン内で値が生成される
    next if name == :_handler_params_

  subst_attr = @celltype.find(name)
  unless subst_attr
    cdl_error("NTF1007 celltype $1: additional_param: attribute $2 does not exist.",
      @celltype.get_name, name)
  end
}

    @celltype.get_cell_list.each {|cell|
      gen_factory_for_cell kernelCfg, cell
    }

# アダプタ関数の生成を完了させる
@adpt_gen.finish

    kernelCfg.close
    # puts "===== end #{@celltype.get_name.to_s} plugin ====="
end

#gen_sac(file, cell, indent) ⇒ Object



1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
# File 'lib/tecsgen/plugin/NotifierPlugin.rb', line 1197

def gen_sac(file, cell, indent)
  domain_root = cell.get_region.get_domain_root
  if domain_root.get_domain_type
    id = (cell.get_attr_initializer :id).to_s
              name_array = cell.get_celltype.get_name_array(cell)
    case cell.get_celltype.get_name
    when :tCyclicNotifier
      obj_type = "CYC"
    when :tAlarmNotifier
      obj_type = "ALM"
    else
      raise "NotifierPlugin: unknown celltype #{cell.get_celltype.get_name}"
    end
    id = cell.get_celltype.subst_name(id, name_array)
    # p obj_type
    # p HRPPlugin.get_sac_str cell
    file.print indent, "SAC_#{obj_type}( #{id}, #{HRPPlugin.get_sac_str cell} );\n"
  end
end

#set_factory(template_string) ⇒ Object



946
947
948
949
950
951
952
# File 'lib/tecsgen/plugin/NotifierPlugin.rb', line 946

def set_factory(template_string)
  unless @factory.nil?
    cdl_error("NTF1003 celltype $1: option factory was specified more than once",
      celltype.get_name)
  end
  @factory = template_string
end

#set_factory_output_file(output_file) ⇒ Object



954
955
956
957
958
959
960
# File 'lib/tecsgen/plugin/NotifierPlugin.rb', line 954

def set_factory_output_file(output_file)
  unless @output_file.nil?
    cdl_error("NTF1003 celltype $1: option output_file was specified more than once",
      celltype.get_name)
  end
  @output_file = output_file
end