TWELITE で Lチカ

(連載です。この記事の続きはこちら)
「TWELITE で Lチカの続き(シリアルUART出力)」
https://qiita.com/nanbuwks/items/7194db5680b65c9cc2bd


通信を伴わないLチカについては、
http://sadaji.net/embedded/twe-lite/cppSDK/index.html
や
http://sadaji.net/embedded/twe-lite/appLed.html
や
http://dsas.blog.klab.org/archives/52201101.html
にある。

最初のものは MWX ライブラリを使う方法
2つ目、3つ目は C ライブラリを使う方法です。


# ライセンスに注意

これらはミニマムで良いのですが、同じように作ったソースコードを Qiita などに掲示するにはライセンス問題をクリアしなければなりません。

## MW-SLA-1

TWELITE SDKの添付物（ソースコード、ライブラリ、資料）のライセンスはメジャーライセンスではなく、独自ライセンスの「モノワイヤレスソフトウェア使用許諾契約書(MW-SLA-1)」となります。

- リバースエンジニアリングの禁止
- ソースコードおよび改変物を他社製のプロセッサ用にビルド・動作・開発目的の利用の禁止

このほか、MW-SLA-1には記載されていませんが、

> お客さまが改変したソースコードを公開する場合は、モノワイヤレス株式会社にご一報下さい。

https://sdk.twelite.info/overview/policy

とあります。

## 公開できるソースコードの開発

> お客さまが改変したソースコードを公開する場合は、モノワイヤレス株式会社にご一報下さい。

とありますので、TWELITE SDKに含まれているソースコードを改変し、GitHub などで公開しようとすると commit ごとに一報する必要があります。

一報ってナンダ？ commit 通知を投げるだけでいいのか?? 承認フローを取らないといけない???

考えるだけでめんどくさいので一報しなくてもいいやりかたを考えます。

1. SDK のソースコードを元に作成し、改変部分を公開可能なメジャーライセンスとした場合、改変部分だけを diff で抽出し、公開する
1. SDK のソースコードによらずスクラッチビルドする

上記の方法が考えられます。

1. の方法は元々のアプリのごく一部分だけを改変するような場合は有効です。
2. は1.に比べ手間がかかりますがソース全体を公開するのに向いています。

今回は、Lチカということでソース全体を公開したいので、2の方法で行います。

冒頭に書いた いくつかの事例は、これと同様に使えるのかどうかが不明だったりSDKソースコードよりの引用をmono-wiressに承諾を得て公開しています。

ですので今回は冒頭の先行事例を使わず、オリジナルに開発することとします。



# 空っぽでコンパイル

Master.c や Master.h が空っぽの状態でコンパイルしてみると、以下のようにエラーが出ました。


```



Linking objs_BLUE/App_Twelite_hc_20200803-MCP3008_Master_BLUE_L1200_V1-8-3.elf ...
/home/nanbuwks/Downloads/TWELITE/MWSDK/ChipLib/SW4063V1416/../../Tools/ba-elf-ba2-r36379/bin/ba-elf-gcc -Wl,--gc-sections -Wl,-u_AppColdStart -Wl,-u_AppWarmStart -TApp_Stack_Size.ld -march=ba2 -mcpu=jn51xx -mredzone-size=4 -mbranch-cost=3 -fomit-frame-pointer -Os -flto  -nostartfiles -L/home/nanbuwks/Downloads/TWELITE/MWSDK/ChipLib/SW4063V1416/Chip/JN5164/Build -L/home/nanbuwks/Downloads/TWELITE/MWSDK/ChipLib/SW4063V1416/Chip/JN5164/Library -L/home/nanbuwks/Downloads/TWELITE/MWSDK/ChipLib/SW4063V1416/Components/Library -L/home/nanbuwks/Downloads/TWELITE/MWSDK/ChipLib/SW4063V1416/Stack/MAC/Build -TAppBuildMac.ld -o objs_BLUE/App_Twelite_hc_20200803-MCP3008_Master_BLUE_L1200_V1-8-3.elf \
         objs_BLUE/Master.o objs_BLUE/common.o objs_BLUE/flash.o objs_BLUE/modbus_ascii.o objs_BLUE/input_string.o objs_BLUE/sensor_driver.o objs_BLUE/adc.o objs_BLUE/duplicate_checker.o objs_BLUE/SMBus.o  /home/nanbuwks/Downloads/TWELITE/MWSDK/MyProjects/App_Twelite_hc_20200803-MCP3008/../../TWENET/L1200/lib/libTWENET_BLUE.a /home/nanbuwks/Downloads/TWELITE/MWSDK/MyProjects/App_Twelite_hc_20200803-MCP3008/../../TWENET/L1200/lib/libTWENEText_BLUE.a /home/nanbuwks/Downloads/TWELITE/MWSDK/MyProjects/App_Twelite_hc_20200803-MCP3008/../../TWENET/L1200/lib/libTWENETutils_BLUE.a \
         -Wl,--start-group -lAppApi_JN516x -lMAC_JN516x -lTimerServer_JN516x -lTOF_JN516x -lXcv_JN516x -lAes_JN516x -lHardwareApi_JN516x -lMicroSpecific_JN516x -lBoot_JN516x -lPDM_EEPROM_JN516x_NO_RTOS  /home/nanbuwks/Downloads/TWELITE/MWSDK/MyProjects/App_Twelite_hc_20200803-MCP3008/../../TWENET/L1200/lib/libTWENET_BLUE.a /home/nanbuwks/Downloads/TWELITE/MWSDK/MyProjects/App_Twelite_hc_20200803-MCP3008/../../TWENET/L1200/lib/libTWENEText_BLUE.a /home/nanbuwks/Downloads/TWELITE/MWSDK/MyProjects/App_Twelite_hc_20200803-MCP3008/../../TWENET/L1200/lib/libTWENETutils_BLUE.a -Wl,--end-group \
         -Wl,-Map,objs_BLUE/App_Twelite_hc_20200803-MCP3008_Master_BLUE.map
/tmp/ccTrKWIx.ltrans0.ltrans.o: In function `u8HwEventHandler.1784':
ccTrKWIx.ltrans0.o:(.text+0x16a): undefined reference to `cbToCoNet_u8HwInt'
ccTrKWIx.ltrans0.o:(.text+0x16a): relocation truncated to fit: R_BA_10_PCREL against undefined symbol `cbToCoNet_u8HwInt'
/tmp/ccTrKWIx.ltrans6.ltrans.o: In function `AppWarmStart':
ccTrKWIx.ltrans6.o:(.text+0xe5): undefined reference to `cbAppWarmStart'
ccTrKWIx.ltrans6.o:(.text+0xe5): relocation truncated to fit: R_BA_18_PCREL against undefined symbol `cbAppWarmStart'
ccTrKWIx.ltrans6.o:(.text+0x114): undefined reference to `cbAppWarmStart'
ccTrKWIx.ltrans6.o:(.text+0x114): relocation truncated to fit: R_BA_18_PCREL against undefined symbol `cbAppWarmStart'
/tmp/ccTrKWIx.ltrans9.ltrans.o: In function `ToCoNet_vMain':
ccTrKWIx.ltrans9.o:(.text+0x64a): undefined reference to `cbToCoNet_vHwEvent'
ccTrKWIx.ltrans9.o:(.text+0x64a): relocation truncated to fit: R_BA_18_PCREL against undefined symbol `cbToCoNet_vHwEvent'
ccTrKWIx.ltrans9.o:(.text+0x73d): undefined reference to `cbToCoNet_vRxEvent'
ccTrKWIx.ltrans9.o:(.text+0x73d): relocation truncated to fit: R_BA_18_PCREL against undefined symbol `cbToCoNet_vRxEvent'
/tmp/ccTrKWIx.ltrans9.ltrans.o: In function `vAppApiDefMcpsRequest':
ccTrKWIx.ltrans9.o:(.text+0x7ca): undefined reference to `cbToCoNet_vMain'
ccTrKWIx.ltrans9.o:(.text+0x7ca): relocation truncated to fit: R_BA_18_PCREL against undefined symbol `cbToCoNet_vMain'
/tmp/ccTrKWIx.ltrans12.ltrans.o: In function `AppColdStart':
ccTrKWIx.ltrans12.o:(.text+0x38): undefined reference to `cbAppColdStart'
ccTrKWIx.ltrans12.o:(.text+0x38): relocation truncated to fit: R_BA_18_PCREL against undefined symbol `cbAppColdStart'
ccTrKWIx.ltrans12.o:(.text+0x498): undefined reference to `cbAppColdStart'
ccTrKWIx.ltrans12.o:(.text+0x498): relocation truncated to fit: R_BA_18_PCREL against undefined symbol `cbAppColdStart'
collect2: error: ld returned 1 exit status
../../../../MkFiles/rules.mk:100: recipe for target 'objs_BLUE/App_Twelite_hc_20200803-MCP3008_Master_BLUE_L1200_V1-8-3.elf' failed
make: *** [objs_BLUE/App_Twelite_hc_20200803-MCP3008_Master_BLUE_L1200_V1-8-3.elf] Error 1
The terminal process terminated with exit code: 2

```

以下が undefined と出ました。

- cbToCoNet_u8HwInt
- cbAppWarmStart
- cbToCoNet_vHwEvent
- cbToCoNet_vRxEvent
- cbToCoNet_vMain
- cbAppColdStart

なので Master.c を以下のようにしました。

```

#include "ToCoNet.h"
#include "ToCoNet_mod_prototype.h"
void cbAppColdStart(bool_t bStart)
{
    //  any 
}
void cbAppWarmStart(bool_t bStart) { return; }
void cbToCoNet_vRxEvent(tsRxDataApp *psRx) { return; }
void cbToCoNet_vTxEvent(uint8 u8CbId, uint8 bStatus) { return; }
void cbToCoNet_vNwkEvent(teEvent eEvent, uint32 u32arg) { return; }
void cbToCoNet_vHwEvent(uint32 u32DeviceId, uint32 u32ItemBitmap) {	return; }
uint8 cbToCoNet_u8HwInt(uint32 u32DeviceId, uint32 u32ItemBitmap) {	return FALSE; }
void cbToCoNet_vMain(void) { return; }
```


include構文は以下を参照し記述しました。
「ソースコードの構造 - TWENET_JP」
https://sdk.twelite.info/tweliet-net-api-jie-shuo/ssukdono

コールバック関数は以下を参照し定義しました。
「コールバック関数 - TWENET_JP」
https://sdk.twelite.info/twelite-net-api-rifurensu/krubakku


# Lチカ

https://sdk.twelite.info/twelite-net-api-rifurensu/twelite-net-makuro/utils.h
を見て utils.h をinclude する。
これと共に <AppHardwareApi.h> も必要でした。

```

#include <AppHardwareApi.h>
#include "utils.h"
#include "ToCoNet.h"
#include "ToCoNet_mod_prototype.h"
#define LED 12

static void vProcessEvCore(tsEvent *pEv, teEvent eEvent, uint32 u32evarg)
{
    static int counter=0;
    if (eEvent == E_EVENT_TICK_TIMER) {      // 4ms timer
        counter++;
        if (  0 == counter % 40 ) vPortSetHi(LED);
        if ( 20 == counter % 40 ) vPortSetLo(LED);
    }
}


void cbAppColdStart(bool_t bStart)
{
    if (!bStart) {
    } else {
        vPortAsOutput(LED);
        ToCoNet_Event_Register_State_Machine(vProcessEvCore);
    }
}

void cbAppWarmStart(bool_t bStart) { return; }
void cbToCoNet_vRxEvent(tsRxDataApp *psRx) { return; }
void cbToCoNet_vTxEvent(uint8 u8CbId, uint8 bStatus) { return; }
void cbToCoNet_vNwkEvent(teEvent eEvent, uint32 u32arg) { return; }
void cbToCoNet_vHwEvent(uint32 u32DeviceId, uint32 u32ItemBitmap) {	return; }
uint8 cbToCoNet_u8HwInt(uint32 u32DeviceId, uint32 u32ItemBitmap) {	return FALSE; }
void cbToCoNet_vMain(void) { return; }


```

光りました

![IMG_20200820_175625207.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8b5f636e-4aab-5c8c-2847-5f43fb9c71dc.jpeg)