静态查找表(litteral位图)

时间:2014-09-14 21:06:45

标签: ruby

我收到一些在Ruby脚本中解析的数据,解析数据的样本如下所示;

{"address":"00","data":"FF"}
{"address":"01","data":"00"}

该数据与工厂项目(风扇,冷却器,加热器等)的状态(开/关)有关,address是一个十六进制数字,用于告诉您data指的是哪一组位至。所以在上面的例子中,查找表将是;这两个值都以HEX形式接收,如本例所示。

             Bit1     Bit2     Bit3     Bit4     Bit5     Bit6     Bit7     Bit8
Address 00:  Fan1     Fan2     Fan3     Fan4     Cool1    Cool2    Cool3    Heat1
Address 01:  Hum1     Hum2     Fan5     Fan6     Heat2    Heat3    Cool4    Cool5
16 Addresses per block (This example is 00-0F)

Data: FF告诉我Address 00中的所有项都设置为(高/ 1)然后我需要输出每个位的查找结果,例如

{"element":"FAN1","data":{"type":"STAT","state":"1"}}
{"element":"FAN2","data":{"type":"STAT","state":"1"}}
{"element":"FAN3","data":{"type":"STAT","state":"1"}}
{"element":"FAN4","data":{"type":"STAT","state":"1"}}
{"element":"COOL1","data":{"type":"STAT","state":"1"}}
{"element":"COOL2","data":{"type":"STAT","state":"1"}}
{"element":"COOL3","data":{"type":"STAT","state":"1"}}
{"element":"HEAT1","data":{"type":"STAT","state":"1"}}

查找表可以是高达2048位的任何内容(尽管我目前没有使用任何大小的内容 - 这是我需要扩展到的最大值)

data字段是每个地址全部8位的状态,有些可能在某些地方可能已关闭,每次我的源向我推送新数据时都会更新。

我正在寻找一种方法在代码中为这位外行人做这件事,因为我对使用Ruby做很多事情仍然很陌生。这里有一个代码示例,但最终没有使用它,并且已从问题中删除,以免混淆。

根据以下示例,我使用以下代码取得了一些进展。 (注意这与现有的脚本集成在一起,所有这些都没有在这里显示。查找表现在也不是很大。)

data = [feeder]

data.each do |str|
  hash = JSON.parse(str)
  address = hash["address"]
  number = hash["data"].to_i(16)
  binary_str = sprintf("%0.8b", number)

    binary_str.reverse.each_char.with_index do |char, i|
        break if i+1 > max_binary_digits

        mouse = {"element"=>+table[address][i], "data"=>{"type"=>'STAT', "state"=>char}}
        mousetrap = JSON.generate(mouse)
        puts mousetrap
        end
    end

这给了我一个{"element":"COOL1","data":{"type":"STAT","state":"0"}}等输出......然后通过我的node.js脚本提供正确的输出。

我有一个新的问题/查询让这个工作并从昨晚收集了一大堆数据&今天早上。现在看来,我已经构建了我的查找表,我需要根据查找结果修改一些结果。我有其他传感器需要生成不同的输出来为我的SVG提供例子;

FAN objects need to output {"element":"FAN1","data":{"type":"STAT","state":"1"}}
DOOR objects need to output {"element":"DOOR1","data":{"type":"LAT","state":"1"}}
SWIPE objects need to output {"element":"SWIPE6","data":{"type":"ROUTE","state":"1"}}
ALARM objects need to output {"element":"PIR1","data":{"type":"PIR","state":"0"}}

这是由于SVG处理更新的方式 - 我不能修改DOM的东西,所以需要在我的Ruby脚本中解决这个问题。

所以为了解决这个问题,我最终要做的是制作现有查找表的精确副本,而不是列出我列出的输出类型的设备,如此;

Address 00: STAT STAT STAT ROUTE ROUTE LAT LAT PIR
Address 01: PIR PIR STAT ROUTE ROUTE LAT LAT PIR

这可能非常脏(这也意味着我必须复制我的查找表,但它实际上可能更适合我的特定需求,因为数据集中的设备可能有任何名称(我无法控制接收到的数据)构建了一个新的查找表后,我修改了下面提供的代码,并且已经用于原始查找,但是我必须删除这两行。如果没有删除它们,我会得到8次查找输出的结果!

binary_str.reverse.each_char.with_index do |char, i|
break if i+1 > max_binary_digits

使用以下内容构建最终数组;

mouse = {"element"=>+table[address][i], "data"=>{"type"=>typetable[address][i], "state"=>char}}
mousetrap = JSON.generate(mouse)
puts mousetrap

这给了我完全正确的输出,并且能够与现有脚本node.js websocket& mongodb'state'数据库(在初始加载时读取)

我还想尝试使用此代码,当某些元素状态设置为1时,我希望能够查看其他内容(然后使用那个结果)我认为这可能最好用find查询我的MongoDB,然后只使用结果。这样做会为每个查询命中数据库,但只会有少数或结果,所以大多数事情会返回null,这很好。我是否采用正确的思维方式?

1 个答案:

答案 0 :(得分:0)

require 'json'

table = {
  "00" => ["Fan1", "Fan2", "Fan3"],
  "01" => ["Hum1", "Hum2", "Fan5"],
}

max_binary_digits = table.first[1].size  

data = [
%Q[{"address": "00","data":"FF"}],
%Q[{"address": "01","data":"00"}],
%Q[{"address": "01","data":"03"}],
]

data.each do |str|
  hash = JSON.parse(str)
  address = hash["address"]
  number = hash["data"].to_i(16)
  binary_str = sprintf("%0.8b", number)
  p binary_str

  binary_str.reverse.each_char.with_index do |char, i|
    break if i+1 > max_binary_digits
    puts %Q[{"element":#{table[address][i]},"data":{"type":"STAT","state":"#{char}"}}}]
  end

  puts "-" * 20
end

--output:--
"11111111"
{"element":Fan1,"data":{"type":"STAT","state":"1"}}}
{"element":Fan2,"data":{"type":"STAT","state":"1"}}}
{"element":Fan3,"data":{"type":"STAT","state":"1"}}}
--------------------
"00000000"
{"element":Hum1,"data":{"type":"STAT","state":"0"}}}
{"element":Hum2,"data":{"type":"STAT","state":"0"}}}
{"element":Fan5,"data":{"type":"STAT","state":"0"}}}
--------------------
"00000011"
{"element":Hum1,"data":{"type":"STAT","state":"1"}}}
{"element":Hum2,"data":{"type":"STAT","state":"1"}}}
{"element":Fan5,"data":{"type":"STAT","state":"0"}}}
--------------------

我的回答假设您的表中的Bit1是最低有效位,如果不是这种情况,请删除代码中的.reverse

你可以问我关于代码的任何想法。