Merge branch 'master' of https://github.com/nodemcu/nodemcu-firmware
This commit is contained in:
commit
055c55a73c
|
@ -472,7 +472,8 @@ static int mqtt_socket_client( lua_State* L )
|
||||||
stack++;
|
stack++;
|
||||||
}
|
}
|
||||||
if(username == NULL)
|
if(username == NULL)
|
||||||
return 1;
|
il = 0;
|
||||||
|
NODE_DBG("lengh username: %d\r\n", il);
|
||||||
mud->connect_info.username = (uint8_t *)c_zalloc(il + 1);
|
mud->connect_info.username = (uint8_t *)c_zalloc(il + 1);
|
||||||
if(!mud->connect_info.username){
|
if(!mud->connect_info.username){
|
||||||
return luaL_error(L, "not enough memory");
|
return luaL_error(L, "not enough memory");
|
||||||
|
@ -486,7 +487,9 @@ static int mqtt_socket_client( lua_State* L )
|
||||||
stack++;
|
stack++;
|
||||||
}
|
}
|
||||||
if(password == NULL)
|
if(password == NULL)
|
||||||
return 1;
|
il = 0;
|
||||||
|
NODE_DBG("lengh password: %d\r\n", il);
|
||||||
|
|
||||||
mud->connect_info.password = (uint8_t *)c_zalloc(il + 1);
|
mud->connect_info.password = (uint8_t *)c_zalloc(il + 1);
|
||||||
if(!mud->connect_info.password){
|
if(!mud->connect_info.password){
|
||||||
return luaL_error(L, "not enough memory");
|
return luaL_error(L, "not enough memory");
|
||||||
|
@ -659,7 +662,7 @@ static int mqtt_socket_lwt( lua_State* L )
|
||||||
lwtMsg = luaL_checklstring( L, stack, &il );
|
lwtMsg = luaL_checklstring( L, stack, &il );
|
||||||
if (lwtMsg == NULL)
|
if (lwtMsg == NULL)
|
||||||
{
|
{
|
||||||
return luaL_error( L, "need lwt topic");
|
return luaL_error( L, "need lwt message");
|
||||||
}
|
}
|
||||||
|
|
||||||
mud->connect_info.will_topic = (uint8_t*) c_zalloc( topicSize + 1 );
|
mud->connect_info.will_topic = (uint8_t*) c_zalloc( topicSize + 1 );
|
||||||
|
|
|
@ -47,7 +47,7 @@ struct __attribute((__packed__)) mqtt_connect_variable_header
|
||||||
{
|
{
|
||||||
uint8_t lengthMsb;
|
uint8_t lengthMsb;
|
||||||
uint8_t lengthLsb;
|
uint8_t lengthLsb;
|
||||||
uint8_t magic[6];
|
uint8_t magic[4];
|
||||||
uint8_t version;
|
uint8_t version;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
uint8_t keepaliveMsb;
|
uint8_t keepaliveMsb;
|
||||||
|
@ -293,9 +293,9 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
|
||||||
connection->message.length += sizeof(*variable_header);
|
connection->message.length += sizeof(*variable_header);
|
||||||
|
|
||||||
variable_header->lengthMsb = 0;
|
variable_header->lengthMsb = 0;
|
||||||
variable_header->lengthLsb = 6;
|
variable_header->lengthLsb = 4;
|
||||||
memcpy(variable_header->magic, "MQIsdp", 6);
|
memcpy(variable_header->magic, "MQTT", 4);
|
||||||
variable_header->version = 3;
|
variable_header->version = 4;
|
||||||
variable_header->flags = 0;
|
variable_header->flags = 0;
|
||||||
variable_header->keepaliveMsb = info->keepalive >> 8;
|
variable_header->keepaliveMsb = info->keepalive >> 8;
|
||||||
variable_header->keepaliveLsb = info->keepalive & 0xff;
|
variable_header->keepaliveLsb = info->keepalive & 0xff;
|
||||||
|
@ -322,7 +322,7 @@ mqtt_message_t* mqtt_msg_connect(mqtt_connection_t* connection, mqtt_connect_inf
|
||||||
variable_header->flags |= MQTT_CONNECT_FLAG_WILL;
|
variable_header->flags |= MQTT_CONNECT_FLAG_WILL;
|
||||||
if(info->will_retain)
|
if(info->will_retain)
|
||||||
variable_header->flags |= MQTT_CONNECT_FLAG_WILL_RETAIN;
|
variable_header->flags |= MQTT_CONNECT_FLAG_WILL_RETAIN;
|
||||||
variable_header->flags |= (info->will_qos & 3) << 4;
|
variable_header->flags |= (info->will_qos & 3) << 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(info->username != NULL && info->username[0] != '\0')
|
if(info->username != NULL && info->username[0] != '\0')
|
||||||
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
-- BMP085 query module
|
||||||
|
--
|
||||||
|
-- LICENCE: http://opensource.org/licenses/MIT
|
||||||
|
-- Vladimir Dronnikov <dronnikov@gmail.com>
|
||||||
|
-- Heavily based on work of Christee <Christee@nodemcu.com>
|
||||||
|
--
|
||||||
|
-- Example:
|
||||||
|
-- require("bmp085").read(sda, scl)
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
local M
|
||||||
|
do
|
||||||
|
-- cache
|
||||||
|
local i2c, tmr = i2c, tmr
|
||||||
|
-- helpers
|
||||||
|
local r8 = function(reg)
|
||||||
|
i2c.start(0)
|
||||||
|
i2c.address(0, 0x77, i2c.TRANSMITTER)
|
||||||
|
i2c.write(0, reg)
|
||||||
|
i2c.stop(0)
|
||||||
|
i2c.start(0)
|
||||||
|
i2c.address(0, 0x77, i2c.RECEIVER)
|
||||||
|
local r = i2c.read(0, 1)
|
||||||
|
i2c.stop(0)
|
||||||
|
return r:byte(1)
|
||||||
|
end
|
||||||
|
local w8 = function(reg, val)
|
||||||
|
i2c.start(0)
|
||||||
|
i2c.address(0, 0x77, i2c.TRANSMITTER)
|
||||||
|
i2c.write(0, reg)
|
||||||
|
i2c.write(0, val)
|
||||||
|
i2c.stop(0)
|
||||||
|
end
|
||||||
|
local r16u = function(reg)
|
||||||
|
return r8(reg) * 256 + r8(reg + 1)
|
||||||
|
end
|
||||||
|
local r16 = function(reg)
|
||||||
|
local r = r16u(reg)
|
||||||
|
if r > 32767 then r = r - 65536 end
|
||||||
|
return r
|
||||||
|
end
|
||||||
|
-- calibration data
|
||||||
|
local AC1, AC2, AC3, AC4, AC5, AC6, B1, B2, MB, MC, MD
|
||||||
|
-- read
|
||||||
|
local read = function(sda, scl, oss)
|
||||||
|
i2c.setup(0, sda, scl, i2c.SLOW)
|
||||||
|
-- cache calibration data
|
||||||
|
if not AC1 then
|
||||||
|
AC1 = r16(0xAA)
|
||||||
|
AC2 = r16(0xAC)
|
||||||
|
AC3 = r16(0xAE)
|
||||||
|
AC4 = r16u(0xB0)
|
||||||
|
AC5 = r16u(0xB2)
|
||||||
|
AC6 = r16u(0xB4)
|
||||||
|
B1 = r16(0xB6)
|
||||||
|
B2 = r16(0xB8)
|
||||||
|
MB = r16(0xBA)
|
||||||
|
MC = r16(0xBC)
|
||||||
|
MD = r16(0xBE)
|
||||||
|
end
|
||||||
|
-- get raw P
|
||||||
|
local p
|
||||||
|
-- NB: optimize for oss = 0
|
||||||
|
if not oss then oss = 0 end
|
||||||
|
if oss == 0 then
|
||||||
|
oss = 0
|
||||||
|
w8(0xF4, 0x34)
|
||||||
|
tmr.delay(5000)
|
||||||
|
p = r8(0xF6) * 256 + r8(0xF7)
|
||||||
|
else
|
||||||
|
w8(0xF4, 0x34 + 64 * oss)
|
||||||
|
tmr.delay(30000)
|
||||||
|
p = r8(0xF6) * 65536 + r8(0xF7) * 256 + r8(0xF8)
|
||||||
|
p = p / 2^(8 - oss)
|
||||||
|
end
|
||||||
|
-- get T
|
||||||
|
w8(0xF4, 0x2E)
|
||||||
|
tmr.delay(5000)
|
||||||
|
local t = r16(0xF6)
|
||||||
|
local X1 = (t - AC6) * AC5 / 32768
|
||||||
|
local X2 = MC * 2048 / (X1 + MD)
|
||||||
|
t = (X2 + X1 + 8) / 16
|
||||||
|
-- normalize P
|
||||||
|
local B5 = t * 16 - 8;
|
||||||
|
local B6 = B5 - 4000
|
||||||
|
local X1 = B2 * (B6 * B6 / 4096) / 2048
|
||||||
|
local X2 = AC2 * B6 / 2048
|
||||||
|
local X3 = X1 + X2
|
||||||
|
local B3 = ((AC1 * 4 + X3) * 2^oss + 2) / 4
|
||||||
|
X1 = AC3 * B6 / 8192
|
||||||
|
X2 = (B1 * (B6 * B6 / 4096)) / 65536
|
||||||
|
X3 = (X1 + X2 + 2) / 4
|
||||||
|
local B4 = AC4 * (X3 + 32768) / 32768
|
||||||
|
local B7 = (p - B3) * (50000 / 2^oss)
|
||||||
|
p = B7 / B4 * 2
|
||||||
|
X1 = (p / 256)^2
|
||||||
|
X1 = (X1 * 3038) / 65536
|
||||||
|
X2 = (-7357 * p) / 65536
|
||||||
|
p = p + (X1 + X2 + 3791) / 16
|
||||||
|
-- Celsius * 10, Hg mm * 10
|
||||||
|
return t, p * 3 / 40
|
||||||
|
end
|
||||||
|
-- expose
|
||||||
|
M = {
|
||||||
|
read = read,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
return M
|
|
@ -5,10 +5,11 @@
|
||||||
-- Vladimir Dronnikov <dronnikov@gmail.com>
|
-- Vladimir Dronnikov <dronnikov@gmail.com>
|
||||||
--
|
--
|
||||||
-- Example:
|
-- Example:
|
||||||
-- for k, v in pairs(require("ds18b20").read(4)) do print(k, v) end
|
-- require("ds18b20").read(4, function(r) for k, v in pairs(r) do print(k, v) end end)
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
local M
|
local M
|
||||||
do
|
do
|
||||||
|
local bit = bit
|
||||||
local format_addr = function(a)
|
local format_addr = function(a)
|
||||||
return ("%02x-%02x%02x%02x%02x%02x%02x"):format(
|
return ("%02x-%02x%02x%02x%02x%02x%02x"):format(
|
||||||
a:byte(1),
|
a:byte(1),
|
||||||
|
@ -16,7 +17,7 @@ do
|
||||||
a:byte(4), a:byte(3), a:byte(2)
|
a:byte(4), a:byte(3), a:byte(2)
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
local read = function(pin, delay)
|
local read = function(pin, cb, delay)
|
||||||
local ow = require("ow")
|
local ow = require("ow")
|
||||||
-- get list of relevant devices
|
-- get list of relevant devices
|
||||||
local d = { }
|
local d = { }
|
||||||
|
@ -37,25 +38,32 @@ do
|
||||||
ow.skip(pin)
|
ow.skip(pin)
|
||||||
ow.write(pin, 0x44, 1)
|
ow.write(pin, 0x44, 1)
|
||||||
-- wait a bit
|
-- wait a bit
|
||||||
tmr.delay(delay or 100000)
|
tmr.alarm(0, delay or 100, 0, function()
|
||||||
-- iterate over devices
|
-- iterate over devices
|
||||||
local r = { }
|
local r = { }
|
||||||
for i = 1, #d do
|
for i = 1, #d do
|
||||||
tmr.wdclr()
|
tmr.wdclr()
|
||||||
-- read rom command
|
-- read rom command
|
||||||
ow.reset(pin)
|
ow.reset(pin)
|
||||||
ow.select(pin, d[i])
|
ow.select(pin, d[i])
|
||||||
ow.write(pin, 0xBE, 1)
|
ow.write(pin, 0xBE, 1)
|
||||||
-- read data
|
-- read data
|
||||||
local x = ow.read_bytes(pin, 9)
|
local x = ow.read_bytes(pin, 9)
|
||||||
if ow.crc8(x) == 0 then
|
if ow.crc8(x) == 0 then
|
||||||
local t = (x:byte(1) + x:byte(2) * 256) * 625
|
local t = (x:byte(1) + x:byte(2) * 256)
|
||||||
-- NB: temperature in Celcius * 10^4
|
-- negatives?
|
||||||
r[format_addr(d[i])] = t
|
if bit.isset(t, 15) then t = 1 - bit.bxor(t, 0xffff) end
|
||||||
d[i] = nil
|
-- NB: temperature in Celsius * 10^4
|
||||||
|
t = t * 625
|
||||||
|
-- NB: due 850000 means bad pullup. ignore
|
||||||
|
if t ~= 850000 then
|
||||||
|
r[format_addr(d[i])] = t
|
||||||
|
end
|
||||||
|
d[i] = nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
cb(r)
|
||||||
return r
|
end)
|
||||||
end
|
end
|
||||||
-- expose
|
-- expose
|
||||||
M = {
|
M = {
|
||||||
|
|
Loading…
Reference in New Issue