2015年3月24日 星期二

Lua 認識與語法學習



http://www.lua.org/


Lua是一種輕量語言,它的官方版本只包括一個精簡的核心和最基本的庫。這使得Lua體積小、啟動速度快。它用標準C語言編寫並以原始碼形式開放,編譯後僅僅一百餘K,可以很方便的嵌入別的程式裡。和許多「大而全」的語言不一樣,網路通訊、圖形介面等都沒有預設提供。但是Lua可以很容易地被擴充功能:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內建的功能一樣。事實上,現在已經有很多成熟的擴充功能模組可供選用。
Lua是一種多重編程範式的程式設計語言:它只提供了很小的一個特性集合來滿足不同編程範式的需要,而不是為某種特定的編程範式提供繁雜的特性支援。例如,Lua並不提供繼承這個特性,但是你可以用元表來模擬它。諸如命名空間這些概念都沒有在語言基本特性中實作,但是我們可以用表結構(Lua唯一提供的複雜資料結構)輕易模擬。Lua可以在執行時隨時構造出一個函式,並把它看作一個物件(正是所謂的first class function),這個特性可以很好的滿足函數語言程式設計的需要。這是提供了這些基本的元特性,我們可以任意的對語言進行自需的改造。
Lua原生支援的資料類型非常之少,它只提供了數字(預設是雙精度浮點數,可配置)、布爾量、字串、表、子程式協程(coroutine)以及用戶自訂資料這幾種。但是其處理表和字串的效率非常之高,加上元表的支援,開發者可以高效的模擬出需要的複雜資料類型(比如集合、陣列等)。
Lua是一個動態弱型別語言,支援增量式垃圾收集策略。有內建的,與作業系統無關的協作式多執行緒(coroutine)支援。
有8種基本類型:nil、布爾值(boolean)、數字型(number)、字串型(string)、用戶自訂類型(userdata)、函式(function)、執行緒(thread)和表(table)


關於Lua語法,可看這本書.



相關參考資料:

Lua - 維基百科,自由的百科全書 - Wikipedia

[PDF] Programming in Lua - CentOS中文站

Lua 5.1 参考手册 - 云风工作室

edartuz/lua-serial · GitHub

http://gamedevgeek.com/tutorials/getting-started-with-lua/

IOT SmartConfig基本介紹及原理



SmartConfig (用於無線wifi Config)

所謂的smartconfig就是手機APP端發送包含WIFI 用戶名WIFI密碼的UDP 廣播包(broadcast)或者組播包(multicast),智能終端的WIFI芯片可以接收到該UDP包,只要知道UDP的組織形式,就可以通過接收到的UDP包解密出WIFI 用戶名及密碼.

一般IOT Device的Wifi Config, 有2種:
1. TI's SmartConfig(一鍵配置)
2. AP Mode (Google Chromecast就是採用這種方式)

以下僅針對SmartConfig做介紹......
截錄網路文章,........
"
Esp8266 wifi芯片為例,smartconfig 採用UDP廣播模式(UDP接收IP地址是255.255.255.255),
Esp8266先scan 下所有AP ,得到AP的相關信息,如工作的channel ,然後配置wifi芯片工作在剛才scan到的channel上去接收UDP包,如果沒有接收到,繼續配置ESP8266工作在另外的channel上,如此循環,直到收到UDP包為止,為什麼要提前進行SCAN 下WIFI AP呢?就是為了提高配置效率。假設當前網絡中只有兩個AP,一個AP工作在CHANEL1,另外個ap工作在channel13,我們現在需要配智能硬件連接到AP2 ,就是channel13上,如果不提前scan就需要從1--13掃描浪費時間。就是需要從channel1-chane2 ---...channnel13一直掃描了,如果掃描了AP,芯片馬上從AP CHANNNEL1 到channel13加快獲取到UDP包;
QCA4004 wifi芯片為例,kuaifi 連接也就是smartconfig 採用UDP組播模式( IP地址是組播即可,如239.0.0.254)
"

安信可智能連接技術:AI-LINK
樂鑫智能連接技術:ESP-TOUCH
微信智能連接技術:AIR-KISS




相關參考連結:

UEFI Serial I/O Protocol


UEFI Spec. Ver.2.4

GUID
#define EFI_SERIAL_IO_PROTOCOL_GUID \
 {0xBB25CF6F,0xF1D4,0x11D2,0x9A,0x0C,0x00,0x90,\
 0x27,0x3F,0xC1,0xFD}

Revision Number
#define EFI_SERIAL_IO_PROTOCOL_REVISION 0x00010000

Protocol Interface Structure
typedef struct {
 UINT32 Revision;
 EFI_SERIAL_RESET Reset;
 EFI_SERIAL_SET_ATTRIBUTES SetAttributes;
 EFI_SERIAL_SET_CONTROL_BITS SetControl;
 EFI_SERIAL_GET_CONTROL_BITS GetControl;
 EFI_SERIAL_WRITE Write;
 EFI_SERIAL_READ Read;
 SERIAL_IO_MODE *Mode;
} EFI_SERIAL_IO_PROTOCOL;

Parameters
Revision The revision to which the EFI_SERIAL_IO_PROTOCOL
adheres. All future revisions must be backwards compatible. If a
future version is not back wards compatible, it is not the same
GUID.
Reset Resets the hardware device.
SetAttributes Sets communication parameters for a serial device. These
include the baud rate, receive FIFO depth, transmit/receive time
out, parity, data bits, and stop bit attributes.
SetControl Sets the control bits on a serial device. These include Request to
Send and Data Terminal Ready.
GetControl Reads the status of the control bits on a serial device. These
include Clear to Send, Data Set Ready, Ring Indicator, and
Carrier Detect.
Write Sends a buffer of characters to a serial device.
Read Receives a buffer of characters from a serial device.
Mode Pointer to SERIAL_IO_MODE data. Type SERIAL_IO_MODE
is defined in “Related Definitions” below.


Related Definitions

//*******************************************************
// SERIAL_IO_MODE
//*******************************************************
typedef struct {
UINT32 ControlMask;
 // current Attributes
 UINT32 Timeout;
 UINT64 BaudRate;
 UINT32 ReceiveFifoDepth;
 UINT32 DataBits;
 UINT32 Parity;
 UINT32 StopBits;
} SERIAL_IO_MODE;


//*******************************************************
// CONTROL BITS
//*******************************************************
// Read Only
#define EFI_SERIAL_CLEAR_TO_SEND 0x0010
#define EFI_SERIAL_DATA_SET_READY 0x0020
#define EFI_SERIAL_RING_INDICATE 0x0040
#define EFI_SERIAL_CARRIER_DETECT 0x0080
#define EFI_SERIAL_INPUT_BUFFER_EMPTY 0x0100   // See if the Receive FIFO is empty.
#define EFI_SERIAL_OUTPUT_BUFFER_EMPTY 0x0200 // See if the Transmit FIFO is empty

// Write Only
#define EFI_SERIAL_REQUEST_TO_SEND 0x0002
#define EFI_SERIAL_DATA_TERMINAL_READY 0x0001

// Read Write
#define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE 0x1000
#define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE 0x2000
#define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE 0x4000


串列埠的原理與應用


1.可透過GetControl function查看EFI_SERIAL_INPUT_BUFFER_EMPTY決定目前有無資料被接收,若有資料,則利用Read function讀進來

ReceiveFifoDepth The requested depth of the FIFO on the receive side of the serial
interface. A ReceiveFifoDepth value of 0 will use the
device’s default FIFO depth

Timeout The requested time out for a single character in microseconds.
This timeout applies to both the transmit and receive side of the
interface. A Timeout value of 0 will use the device’s default
time out value.

設定組態
  EFI_PARITY_TYPE         Parity=NoParity;
  EFI_STOP_BITS_TYPE      StopBits=OneStopBit;
  UINTN                   BaudRate=9600;
  UINTN                   DataBits=8;

 Status = SerialIo->SetAttributes (
                              SerialIo,
                              (UINT64) BaudRate, //9600
                              0, //use default
                              0, //use default
                              Parity, // N 
                              (UINT8) DataBits, //8
                              StopBits //1
                             );

檢查有無資料進來
  UINT32 SerialControl;

  Status = SerialIo->GetControl (
                 SerialIo,
                 &SerialControl);
  if (!EFI_ERROR (Status)) {
    if ((SerialControl & EFI_SERIAL_INPUT_BUFFER_EMPTY) != 0) {
      Status = EFI_NOT_READY;
    } else {
      Status = EFI_SUCCESS;
    }
  }