diff options
Diffstat (limited to 'mesecons_microcontroller')
| -rw-r--r-- | mesecons_microcontroller/init.lua | 82 | 
1 files changed, 39 insertions, 43 deletions
| diff --git a/mesecons_microcontroller/init.lua b/mesecons_microcontroller/init.lua index 2cea23c..7e290a3 100644 --- a/mesecons_microcontroller/init.lua +++ b/mesecons_microcontroller/init.lua @@ -1,5 +1,7 @@  EEPROM_SIZE = 255 +local microc_rules = {} +  for a = 0, 1 do  for b = 0, 1 do  for c = 0, 1 do @@ -34,7 +36,7 @@ if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z =  0, name = "A"})  if (b == 0) then table.insert(input_rules, {x =  0, y = 0, z =  1, name = "B"}) end  if (c == 0) then table.insert(input_rules, {x =  1, y = 0, z =  0, name = "C"}) end  if (d == 0) then table.insert(input_rules, {x =  0, y = 0, z = -1, name = "D"}) end -mesecon:add_rules(nodename, rules) +microc_rules[nodename] = rules  local mesecons = {effector =  { @@ -131,8 +133,8 @@ minetest.register_node(nodename, {  	sounds = default.node_sound_stone_defaults(),  	mesecons = mesecons,  	after_dig_node = function (pos, node) -		rules = mesecon:get_rules(node.name) -		mesecon:receptor_off(pos, rules) +		rules = microc_rules[node.name] +		mesecon.receptor_off(pos, rules)  	end,  })  end @@ -164,7 +166,7 @@ function update_yc(pos)  	if (mesecon.do_overheat(pos)) then  		minetest.remove_node(pos)  		minetest.after(0.2, function (pos) -			mesecon:receptor_off(pos, mesecon.rules.flat) +			mesecon.receptor_off(pos, mesecon.rules.flat)  		end , pos) -- wait for pending parsings  		minetest.add_item(pos, "mesecons_microcontroller:microcontroller0000")  	end @@ -183,7 +185,7 @@ end  --Code Parsing  function yc_code_remove_commentary(code) -	is_string = false +	local is_string = false  	for i = 1, #code do  		if code:sub(i, i) == '"' then  			is_string = not is_string --toggle is_string @@ -203,15 +205,17 @@ function yc_parsecode(code, pos)  	local c  	local eeprom = meta:get_string("eeprom")  	while true do +		local command, params  		command, endi = parse_get_command(code, endi)  		if command == nil then return nil end  		if command == true then break end --end of code  		if command == "if" then +			local r  			r, endi = yc_command_if(code, endi, yc_merge_portstates(Lreal, Lvirtual), eeprom)  			if r == nil then return nil end  			if r == true then  -- nothing  			elseif r == false then -				endi_new = yc_skip_to_else (code, endi) +				local endi_new = yc_skip_to_else (code, endi)  				if endi_new == nil then --else > not found  					endi = yc_skip_to_endif(code, endi)  				else @@ -221,7 +225,7 @@ function yc_parsecode(code, pos)  			end  		else  			params, endi = parse_get_params(code, endi) -			if params  == nil then return nil end +			if not params then return nil end  		end  		if command == "on" then  			L = yc_command_on (params, Lvirtual) @@ -234,6 +238,7 @@ function yc_parsecode(code, pos)  			local su = yc_command_after(params, pos)  			if su == nil then return nil end  		elseif command == "sbi" then +			local new_eeprom  			new_eeprom, Lvirtual = yc_command_sbi (params, eeprom, yc_merge_portstates(Lreal, Lvirtual), Lvirtual)  			if new_eeprom == nil then return nil  			else eeprom = new_eeprom end @@ -251,7 +256,7 @@ end  function parse_get_command(code, starti)  	i = starti -	s = nil +	local s  	while s ~= "" do  		s = string.sub(code, i, i)  		if s == "(" then @@ -277,7 +282,7 @@ end  function parse_get_params(code, starti)  	i = starti -	s = nil +	local s  	local params = {}  	local is_string = false  	while s ~= "" do @@ -300,7 +305,7 @@ end  function yc_parse_get_eeprom_param(cond, starti)  	i = starti -	s = nil +	local s  	local addr  	while s ~= "" do  		s = string.sub(cond, i, i) @@ -403,7 +408,7 @@ function yc_command_sbi(params, eeprom, L, Lv)  	end  	--is an eeprom address -	new_eeprom = ""; +	local new_eeprom = "";  	for i=1, #eeprom do  		if tonumber(params[1])==i then   			new_eeprom = new_eeprom..status @@ -457,17 +462,17 @@ function yc_command_if(code, starti, L, eeprom)  	cond = yc_command_parsecondition(cond, L, eeprom) +	local result  	if cond == "0" then result = false -	elseif cond == "1" then result = true -	else result = nil end -	if result == nil then end +	elseif cond == "1" then result = true end +	if not result then end  	return result, endi --endi from local cond, endi = yc_command_if_getcondition(code, starti)  end  --Condition parsing  function yc_command_if_getcondition(code, starti)  	i = starti -	s = nil +	local s  	local brackets = 1 --1 Bracket to close  	while s ~= "" do  		s = string.sub(code, i, i) @@ -501,8 +506,8 @@ function yc_command_parsecondition(cond, L, eeprom)  	while i<=l do  		local s = cond:sub(i,i)  		if s == "#" then -			addr, endi = yc_parse_get_eeprom_param(cond, i+1) -			buf = yc_eeprom_read(tonumber(addr), eeprom) +			local addr, endi = yc_parse_get_eeprom_param(cond, i+1) +			local buf = yc_eeprom_read(tonumber(addr), eeprom)  			if buf == nil then return nil end  			local call = cond:sub(i, endi-1)  			cond = string.gsub(cond, call, buf) @@ -576,10 +581,8 @@ end  --Virtual-Hardware functions  function yc_eeprom_read(number, eeprom) -	if number == nil then return nil, nil end -	value = eeprom:sub(number, number) -	if value  == nil then return nil, nil end -	return value, endi +	if not number then return end +	return eeprom:sub(number, number)  end  --Real I/O functions @@ -600,24 +603,24 @@ function yc_action_setports(pos, L, Lv)  	local name = "mesecons_microcontroller:microcontroller"  	local rules  	if Lv.a ~= L.a then -		rules = mesecon:get_rules(name.."0001") -		if L.a == true then mesecon:receptor_on(pos, rules) -		else mesecon:receptor_off(pos, rules) end +		rules = microc_rules[name.."0001"] +		if L.a == true then mesecon.receptor_on(pos, rules) +		else mesecon.receptor_off(pos, rules) end  	end  	if Lv.b ~= L.b then -		rules = mesecon:get_rules(name.."0010") -		if L.b == true then mesecon:receptor_on(pos, rules) -		else mesecon:receptor_off(pos, rules) end +		rules = microc_rules[name.."0010"] +		if L.b == true then mesecon.receptor_on(pos, rules) +		else mesecon.receptor_off(pos, rules) end  	end  	if Lv.c ~= L.c then  -		rules = mesecon:get_rules(name.."0100") -		if L.c == true then mesecon:receptor_on(pos, rules) -		else mesecon:receptor_off(pos, rules) end +		rules = microc_rules[name.."0100"] +		if L.c == true then mesecon.receptor_on(pos, rules) +		else mesecon.receptor_off(pos, rules) end  	end  	if Lv.d ~= L.d then  -		rules = mesecon:get_rules(name.."1000") -		if L.d == true then mesecon:receptor_on(pos, rules) -		else mesecon:receptor_off(pos, rules) end +		rules = microc_rules[name.."1000"] +		if L.d == true then mesecon.receptor_on(pos, rules) +		else mesecon.receptor_off(pos, rules) end  	end  end @@ -637,10 +640,6 @@ function yc_update_real_portstates(pos, node, rulename, newstate)  		return  	end  	local n = meta:get_int("real_portstates") - 1 -	if n < 0 then -		mesecon.legacy_update_ports(pos) -		n = meta:get_int("real_portstates") - 1 -	end  	local L = {}  	for i = 1, 4 do  		L[i] = n%2 @@ -662,9 +661,6 @@ function yc_get_real_portstates(pos) -- determine if ports are powered (by itsel  	local meta = minetest.get_meta(pos)  	local L = {}  	local n = meta:get_int("real_portstates") - 1 -	if n < 0 then -		return mesecon.legacy_update_ports(pos) -	end  	for _, index in ipairs({"a", "b", "c", "d"}) do  		L[index] = ((n%2) == 1)  		n = math.floor(n/2) @@ -673,12 +669,12 @@ function yc_get_real_portstates(pos) -- determine if ports are powered (by itsel  end  function yc_get_virtual_portstates(pos) -- portstates according to the name -	name = minetest.get_node(pos).name -	b, a = string.find(name, ":microcontroller") +	local name = minetest.get_node(pos).name +	local b, a = string.find(name, ":microcontroller")  	if a == nil then return nil end  	a = a + 1 -	Lvirtual = {a=false, b=false, c=false, d=false} +	local Lvirtual = {a=false, b=false, c=false, d=false}  	if name:sub(a  , a  ) == "1" then Lvirtual.d = true end  	if name:sub(a+1, a+1) == "1" then Lvirtual.c = true end  	if name:sub(a+2, a+2) == "1" then Lvirtual.b = true end | 
