TOPPERS「活用アイデア」・「アプリケーション開発」コンテスト
は、2011年から毎年実施されています。
https://www.toppers.jp/contest.html
「アプケーション開発」は、ソースコードの公開を前提としています。
「活用アイデア」でも、その後実現したソースコードなどもある。探しながら紹介。
なお、この記事は、TOPPERSプロジェクトの公式見解ではなく、
小川清 の 技術者個人の考えに基づいています。
目的(purpose)
TOPPERS開発アイデア・アプリケーション開発コンテスト受賞作品には、良質な算譜、技術的に崇高な志向、目的を達成するための意思などが感じられる。広く、source codeを表示して紹介し、次の応募作品を促す。
成果(outcome)
応募作品の算譜を眺めると、その技術者の得意分野や技法を感じることができる。応募作品のソースコードを使ってみようという気になる。自分も良い作品を作ろうという気になる。
アプリケーション開発コンテスト受賞作品紹介(2) アプリケーション開発部門金賞
##インテリジェント・チョロQコントローラ / TOPPERS/JSP 山浦幹((有)シンビー)
応募資料(application material)
Readme.txt
http://www.cam.hi-ho.ne.jp/yamaura/Icqc/Readme.txt
インテリジェント・チョロQコントローラソース
http://www.cam.hi-ho.ne.jp/yamaura/Icqc/Icqc-20111228.tar.gz
コンテスト応募資料
http://www.cam.hi-ho.ne.jp/yamaura/Icqc/IdeaAppContest2011.pdf
作成参考資料
http://www.cam.hi-ho.ne.jp/yamaura/Icqc/Icqc2011Dec.pdf
算譜(source code)
#include <t_services.h>
#include <s_services.h>
#include "kernel_id.h"
#include "sample1.h"
#include "cpu_init.h"
#include "led.h"
#include "LCDpanel.h"
#include "graphics.h"
#include "TouchPanel.h"
#include "drive.h"
/****************************************************************
* ループ回数
****************************************************************/
UW task_loop; // タスク内でのループ回数
UW tex_loop; // 例外処理ルーチン内でのループ回数
int sec=0; // 秒
short ledCnt; // リモコンパターン送信カウンタ
int doGetImage=0; // 画像処理RAM 転送スイッチ
// チョロQ現在位置
int cq_pos_x = -1;
int cq_pos_y = -1;
Console con1; // グラフィック画面1
Console con2; // コンソール
static void init(void);
int getPositionx(int *px,int *py); // チョロQ位置検出
void movex(int vect);
int getDirx(int vect,int *px,int *py);
int turnx(int vect);
/****************************************************************
* メインタスク
****************************************************************/
void main_task(VP_INT exinf)
{
int tx,ty;
init();
vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG));
syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (INT) exinf);
syscall(serial_ctl_por(TASK_PORTID,
(IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
/****************************************************************
* タスクの起動
****************************************************************/
sta_cyc(CYCHDR1);
ledCnt = 0; // Remote control stop
tx=ty=-1;
for(;;)
{
if(TOUCH_stat > 10)
{
dispStr(&con2,0,0," Intelligent ChQ Ctr");
TOUCH_xy();
dispNum(&con2, 7,1,TOUCH_X ,4,10);
dispNum(&con2,13,1,TOUCH_Y ,4,10);
CON_mark(&con2,MARK_SQR,tx,ty,0); // 消去
CON_mark(&con2,MARK_PLUS,TOUCH_X,TOUCH_Y,0xf800);// +を表示する
tx = TOUCH_X;
ty = TOUCH_Y;
TOUCH_stat = 0;
act_tsk(TASK_CQ);
syslog(LOG_NOTICE, "==========================");
syslog(LOG_NOTICE, "task sleep main.");
slp_tsk();
syslog(LOG_NOTICE, "task wup main.\r\n---");
}
// タッチ位置を検出したらチョロQの位置検出を行う
// チョロQ検出タスクに移行するか、、
}
syslog(LOG_NOTICE, "Sample program ends.");
kernel_exit();
}
/****************************************************************
* チョロQ制御タスク
****************************************************************/
void taskCq(VP_INT exinf)
{
int goalStep;
ena_tex(); // タスク例外処理の許可
syslog(LOG_NOTICE, "----taskCq----");
dispStr(&con2,8,2,"------");
goalStep = 0;
while(toGoal(&goalStep) != 0)
{
}
dispStr(&con2,8,2,"-Goal-");
syslog(LOG_NOTICE, "----Goal----");
wup_tsk(MAIN_TASK);
ext_tsk();
}
/****************************************************************
* 初期化
****************************************************************/
static void init(void)
{
int i;
define_int_plevel (IPR10, 15, 0); // CMT1
define_int_plevel (IPR10, 3, 8); // VDC3
CPU_BusInitialize();
PWMInitialize();
DMAInitialize();
LCDpanel_Initialize(); // LCDパネル初期化
TOUCH_Initialize();
initConsole(&con1,GRA1_HORIZONTAL_SIZE,
GRA1_VERTICAL_SIZE,(ushort *)GRA1_VRAM_BASE);
initConsole(&con2,GRA2_HORIZONTAL_SIZE,
GRA2_VERTICAL_SIZE,(ushort *)GRA2_VRAM_BASE);
makeGrCntTbl(); // グレースケール変換テーブル作成
Con_fill(&con1,0x0000);
Con_fill(&con2,0x0000);
CMT_1_Initialize();
dispStr(&con2,0,0," Intelligent ChQ Ctr");
mVIDEO_MODE.video_main_exe = 1;
mVIDEO_INT_CNT.int_f_en = 1; // 割込許可
// コマンド生成データを作っておく
for(i=0;i<16;i++)
ledPtnSet(RM_BAND,i,&ledPtnList[i]);
}
/****************************************************************
* 周期ハンドラ
* タッチ位置検出
****************************************************************/
void cyclic_handler(VP_INT exinf)
{
TOUCH_sta(); // タッチ位置検出
}
/****************************************************************
* 並行して実行されるタスク用のタスク例外処理ルーチン
****************************************************************/
void tex_routine(TEXPTN texptn, VP_INT exinf)
{
volatile UW i;
INT tskno = (INT) exinf;
syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ",
tskno, texptn);
for (i = 0; i < tex_loop; i++);
if (texptn & 0x8000) {
syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
ext_tsk();
}
}
/****************************************************************
* CPU例外ハンドラ
****************************************************************/
#ifdef CPUEXC1
void
cpuexc_handler(VP p_excinf)
{
ID tskid;
syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).",
p_excinf);
if (sns_ctx() != TRUE) {
syslog(LOG_WARNING,
"sns_ctx() is not TRUE in CPU exception handler.");
}
if (sns_dpn() != TRUE) {
syslog(LOG_WARNING,
"sns_dpn() is not TRUE in CPU exception handler.");
}
syslog(LOG_DEBUG,
"sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp());
syslog(LOG_DEBUG,
"vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d",
vxsns_loc(p_excinf), vxsns_ctx(p_excinf),
vxsns_dsp(p_excinf), vxsns_dpn(p_excinf));
if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) {
syscall(iget_tid(&tskid));
syscall(iras_tex(tskid, 0x8000));
}
else {
syslog(LOG_NOTICE, "Sample program ends with exception.");
kernel_exit();
}
}
#endif /* CPUEXC1 */
sample1.c以外のソースコードは順次追記予定。
#参考資料(reference)
TOPPERS活用アイデア・アプリケーション開発コンテストを振り返る
https://researchmap.jp/joxkbxlck-1778110/
「応募すると何が嬉しい」TOPPERS活用アイデア・ アプリケーション開発コンテスト
https://www.slideshare.net/kaizenjapan/ss-78528931
#文書履歴(document history)
ver. 0.10 初稿 20180621
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.