#==============================================================================
# ■ External_Variable (By TERENCE龙皇)
#------------------------------------------------------------------------------
# RM 外部变量操作 V1.0。
# RMEV 1.0
#==============================================================================
class External_Variable
# 外部变量档案中,最大变量的数目
MAX_VAR = 5000
# 请勿随意更动该值,除非会操作VC6.0编译『外部变量编辑器』
#------------------------------------------------------------------------------
# 修改 MAX_VAR 必要工具 : VC6.0 ( Microsoft Visual C++ 6.0 )
#
# (1) 下载 『外部变量编辑器』的 source code 专案
# (2) 使用VC6.0或直接开启 RM External Variable Editor.dsw
# (3) 在 FileView 中,点选 Header Files 文件夹後,再选择 RM External Variable EditorDlg.h
# (4) 在程序编写页中,找到 define MAX_VAR 5000
# (5) 修改该 define MAX_VAR 的值,并保证与此处 Ruby 脚本中 MAX_VAR 值相同
# (6) 编译『外部变量编辑器』
# (7) 在 source code 文件中,并在 Debug 文件夹下,找出编译完成的『外部变量编辑器』
# (8) 旧的 .rmev 档,可能会不适用於新编译的『外部变量编辑器』,恐会造成出错
#------------------------------------------------------------------------------
#--------------------------------------------------------------------------
# ● 定义实例变数
#--------------------------------------------------------------------------
attr_reader :filename # .rmev 档名
#--------------------------------------------------------------------------
# ● 初始化物件
# fstr : 外部变量档案名称
#--------------------------------------------------------------------------
def initialize(fstr = "ExternalVar")
if fstr.is_a?(String)
@filename = fstr+".rmev"
else
nfstr = "ExternalVar"
@filename = nfstr+".rmev"
end
# 档案不存在的情况下
unless File.exist?(@filename)
create_rmev(@filename[0, @filename.length-5], 0)
end
end
#--------------------------------------------------------------------------
# ● 读取「目前 RMEV 档案」外部变量
# index : 变量 ID (编号范围 : 0001 ~ 5000)
#--------------------------------------------------------------------------
def [](index)
# index 范围处理
index = index_limit(index)
# 主处理
data = File.read(@filename, 4, 4*(index-1))
k = data.unpack("i")
return k[0]
end
#--------------------------------------------------------------------------
# ● 读取「目前 RMEV 档案」外部变量 以开关访问
# switch_id : 开关 ID (编号范围 : 0001 ~ 5000)
#--------------------------------------------------------------------------
def get_bool(switch_id)
# index 范围处理
switch_id = index_limit(switch_id)
# 主处理
data = File.read(@filename, 4, 4*(switch_id-1))
k = data.unpack("i")
if k[0]==0
return false
end
return true
end
#--------------------------------------------------------------------------
# ● 更新「目前 RMEV 档案」外部变量
# index : 变量 ID (编号范围 : 0001 ~ 5000)
# value : 变量数值 (数值范围 : -2147483648 ~ 2147483647)
#--------------------------------------------------------------------------
def []=(index, value)
# 变量数值布林转换
blvar = bool_to_i(value)
# int 范围处理
lvar = int_range(blvar)
# index 范围处理
index = index_limit(index)
# 主处理
File.open(@filename, "r+b") do |f|
f.pos=4*(index-1)
f.write([lvar].pack("i"))
end
end
#--------------------------------------------------------------------------
# ● 建立新的外部变量档案
# newfstr : 外部变量档案名称
# initvalue : 初始值
#--------------------------------------------------------------------------
def create_rmev(fstr = "ExternalVar", initvalue = 0)
fstr += ".rmev"
# 变量数值布林转换
blvar = bool_to_i(initvalue)
# int 范围处理
lvar = int_range(blvar)
# 档案存在的情况下,不处理
if File.exist?(fstr)
return
end
# 档案不存在的情况下,建立新的外部变量档案
File.open(fstr, "wb") do |f|
for i in 1..MAX_VAR
f.write([lvar].pack("i"))
end
end
end
#--------------------------------------------------------------------------
# ● 初始「目前 RMEV 档案」 中所有变量
# initvalue : 初始值
#--------------------------------------------------------------------------
def init_rmev(initvalue = 0)
# 变量数值布林转换
blvar = bool_to_i(initvalue)
# int 范围处理
lvar = int_range(blvar)
# 主处理
File.open(@filename, "wb") do |f|
for i in 1..MAX_VAR
f.write([lvar].pack("i"))
end
end
end
#--------------------------------------------------------------------------
# ● 选择「目前 RMEV 档案」
# fstr : 外部变量档案名称
#--------------------------------------------------------------------------
def select_rmev(fstr = "ExternalVar")
fstr += ".rmev"
# 档案不存在的情况下
unless File.exist?(fstr)
create_rmev(fstr, 0)
end
@filename = fstr
end
#--------------------------------------------------------------------------
# ● 获取「目前 RMEV 档案」 名称
# (不含副档名)
#--------------------------------------------------------------------------
def current_rmev
return @filename[0, @filename.length-5]
end
private # 私有方法
#--------------------------------------------------------------------------
# ● 布林值转换
#--------------------------------------------------------------------------
def bool_to_i(value)
if value.is_a?(FalseClass)
return 0
elsif value.is_a?(TrueClass)
return 1
end
return value
end
#--------------------------------------------------------------------------
# ● 系统有符号 int 范围调整
#--------------------------------------------------------------------------
def int_range(value)
if value < -2147483648
return int_renegative(value) # -2147483648
end
if value > 2147483647
return int_repositive(value) # 2147483647
end
end
#--------------------------------------------------------------------------
# ● int 正数范围调整 大於 0x 7F FF FF FF 忽略进位
#--------------------------------------------------------------------------
def int_repositive(value)
if value > 2147483647
len = 2147483647*2+2
space = value - 2147483647
rem = (len + space)%len
return -2147483648+rem-1
end
return value
end
#--------------------------------------------------------------------------
# ● int 负数范围调整 小於 0x 80 00 00 00 忽略借位
#--------------------------------------------------------------------------
def int_renegative(value)
if value < -2147483648
n = (-value)/2147483648
if n%2 == 0
return value+n*2147483648
else
rem = (-value)%2147483648
return 2147483647-rem+1
end
end
return value
end
#--------------------------------------------------------------------------
# ● index 范围处理
#--------------------------------------------------------------------------
def index_limit(index)
if index < 1
return MAX_VAR-(-1*index)%MAX_VAR
end
if index > MAX_VAR
return (index-1)%MAX_VAR+1
end
return index
end
end