mbed RPC Library porting guide for WIZwiki-W7500
Used library in this project
Modified Point
mbed rpc를 사용하기 위한 Interface는 RPC over Serial과 RPC over HTTP로 나눌 수 있다. 본 예제에서는 HTTP를 이용하여 RPC를 사용하며, mbed platform 에는 HTTPServer가 구동되고 있다. mbed rpc를 위한 Interface에 대한 자세한 정보는 Link를 참고 하기 바란다.
WIZnetInterface
HTTPServer Library에서 아래와 같은 코드를 사용하는데, WIZnetInterface에는 init()함수가 없음 —> WIZnetLibrary에 init() 함수 추가
HTTPServer/HTTPServer.cpp ( Line 50~56 )
INFO("Initializing network\n");
if (m_pEthernet->init() != 0) {
ERR("Failed to initialize the ethernet interface !");
delete m_pEthernet;
m_pEthernet = NULL;
return false;
}
mbed-rpc
공식 mbed-rpc Library에서 WIZwiki-W7500의 Pin들을 사용할 수 있도록 아래와 같이 코드를 추가 하였다.
mbed-rpc/parse_pins.cpp
#elif defined(TARGET_WIZwiki_W7500)
if (str[0] == 'P' && str[2] == '_') {
uint32_t port = str[1] - 'A';
uint32_t pin = str[3] - '0';
uint32_t pin2 = str[4] - '0';
if (pin2 <= 9) {
pin = pin * 10 + pin2;
}
return port_pin((PortName)port, pin);
#endif
WIZwiki-W7500의 Port와 Pin들은 아래와 같은 규칙으로 정의 되어 있으므로, parse_pins.cpp 에서는 PA_0와 같은 String Data를 받아 0x000과 같은 Int Data로 변환하는 동작을 수행한다.
PA_0 = 0x000,
PA_1 = 0x001,
PA_2 = 0x002,
...
PB_9 = 0x019,
PB_10 = 0x01A,
PB_11 = 0x01B,
...
PC_0 = 0x020,
PC_1 = 0x021,
PC_2 = 0x022,
...
typedef enum {
PortA = 0,
PortB = 1,
PortC = 2,
PortD = 3,
} PortName;
mbed rpc library에 WIZwiki-W7500을 위한 코드를 추가한 후, mbed official repository에 pull request를 보내서 코드 업데이트를 요청 하였다.
Run Simple Example
#include "mbed.h"
#include "EthernetInterface.h"
#include "HTTPServer.h"
#include "mbed_rpc.h"
RpcDigitalOut led1(LED1,"led1");
EthernetInterface eth;
HTTPServer svr;
int main() {
uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0x00, 0x00, 0x00};
led1.write(1);
RPC::add_rpc_class<RpcDigitalOut>();
printf("Setting up...\n");
eth.init(mac_addr);
int ethErr = eth.connect();
if(ethErr < 0)
{
printf("Error %d in setup.\n", ethErr);
return -1;
}
svr.addHandler<HTTPRpcRequestHandler>("/rpc");
svr.start(80, ð);
printf("Listening...\n");
Timer tm;
tm.start();
while(true)
{
svr.poll();
if(tm.read()>.5)
{
tm.start();
}
}
}
- 6 : 제어를 원하는 GPIO의 RPC Name 지정
- 19~20 : ethernet interface 초기화 및 DHCP 수행
- 27 : HTTPRpcRequestHandler 등록
- 30 : HTTP Server Start ( TCP Server로 80포트 리슨)