/************************(abc924-18326.c)********
* 3.3V動作PIC + OLED + MEM + SD card *
************************************************/
#include "myProject.h"
#include "my_conf.h"
/***** グローバル変数 ***************************/
//--- タイマー用変数
uint8_t TFlg; // タイマーフラグ
//---- EUSART用変数
char RBuf[EU_BFSIZE]; // シリアル受信バッファー
uint8_t SFlg; // シリアル受信フラグ
//---- 汎用データ処理用関数
char Msg[MBF_SIZE]; // コメント等送信用文字列
BYTE Buf[DBF_SIZE]; // データ(S/M)用バッファー
char Dlm[] = ","; // 文字列区切りデリミタ
uint16_t Bofs = 0;
uint16_t Bsiz = 512;
uint32_t Rofs = 0;
uint32_t Wofs = 0;
uint32_t Sofs = 0;
/************************************************
* タイマ0 Callback関数 (1秒周期割り込み) *
************************************************/
void TMR0_Process(void){
TFlg = 1; // タイマーフラグセット
}
/************************************************
* バッファー操作関数 (main.cで記述) *
************************************************/
/*===== バッファーのダンプリスト表示 ==========*
* ofs: バッファーの表示開始オフセット *
* sz: 表示データ数 *
*----------------------------------------------*/
void dmp_Buf(uint16_t ofs, uint16_t sz){
uint8_t x,y;
uint16_t i,j;
char bhx[3];
char by;
char as[18];
ofs &= 0x1F0; // 16バイト単位
if(ofs+sz>512) sz = 512 - ofs;
for(i = 0; i < sz; i++){
by = Buf[ofs+i];
my_xtoa(bhx,by,2);
EU_Write(bhx); EU_Write(" ");
if(i<32){ // OLED表示
x = 12 * (uint8_t)(i % 8);
y = LIST_LINE + 10 * (uint8_t)(i / 8);
if(i % 2){
gOLED_strX(x,y,bhx,LIST_COLOR,1);
}else{
gOLED_strX(x,y,bhx,LIST_COLOR2,1);
}
}
if(isprint(by)) as[i%16]=by;
else as[i%16]='.';
if((i % 16)==15){
EU_Write(" ");
as[16]= 0;
EU_Puts(as);
}
}
}
void mn_cmd_BD(uint16_t ofs, uint16_t sz){
ofs &= 0x1F0; // 16バイト単位
if(ofs+sz>512) sz = 512 - ofs;
EU_uW_uW(ofs," - ",ofs+sz-1);
gOLED_strX(0,DATA_LINE,Msg,MSG_COLOR,1);
dmp_Buf(ofs,sz);
}
//==== S/Wコマンド =================================
/* メモリ/バッファーへデータを書き込む *
* S(et)コマンド S[ofs],hx0[,hx1,・・]] *
* (バッファーへデータを書き込む) *
* W(rite)コマンド W[aaa],hx0[,hx1,・・]] *
* (EEPROMへデータを書き込む) *
* ofs: バッファーオフセット(10進数) *
* aaa: メモリアドレス (0x無し16進数) *
* hx0[,hx1,・・]:書込データ (0x無し16進数) *
*------------------------------------------------------*/
uint16_t Mn_cmd_SW(char *str){
char *pt; // 文字列操作用ポインタ
uint8_t cmd_W = 0; // Sコマンドか?
uint32_t res = 0; // Hex文字数値変換結果
uint16_t cnt = 0; // 実際に書き込んだバイト数
uint8_t dt; // 書き込むバイトデータ
uint8_t y; // リスト表示行位置
QT_Clr_All();
gOLED_strX(0,0,str,CMD_COLOR,1);
if(str[0] == 'W') cmd_W = 1; // 現在コマンド
if(strlen(str)==1){ // コマンドのみなら
return 0; // データは書き込まない
}
if(str[1]!=','){ // 第2文字がコンマか?
pt = strtok(str+1,Dlm); // コマンドの次文字から
if(pt != NULL){ // 第1パラメータ有り?
if(cmd_W) Wofs = my_xtol(pt);
else Bofs = (uint16_t)atoi(pt);
}
pt = strtok(NULL,Dlm); // 次文字列取込
}else{ // 第1パラメータ無し
pt = strtok(str+1,Dlm); // 文字列取込
}
do{
if(pt != NULL){ // データがあるか?
res = my_xtol(pt);
dt = (uint8_t)res;
Bofs &= 0x1FF; // Bofsは512以内
if(cmd_W){
SPI_Mem_Write(Wofs,dt); // データをメモリに書込
EU_xL_xB(Wofs++," < ",dt,0);
}else{
Buf[Bofs] = dt; // データをBufに書込
EU_uW_xB(Bofs++," < ",dt,0);
}
if(cnt < 5){ // MsgはEU_関数でセット済み
y = (uint8_t)(LIST_LINE+cnt*9);
gOLED_strX(0,y,Msg,LIST_COLOR,1);
}
cnt++;
pt = strtok(NULL,Dlm); // 次文字へ
}
}while(pt != NULL); // データがあるだけ繰り返す
return cnt; // 書き込んだ文字数を返す
}
/*==== B(uffer)コマンド B[L/S/R/W][ofs][,sz] ==
* バッファー操作コマンド *
* *
* B(のみ): バッファーデータをダンプ表示 *
* BL: SD -> Buf (バッファは先頭から・・) *
* BS: Buf -> SD (バッファは先頭から・・) *
* BR: Mem -> Buf (バッファは先頭から・・) *
* BW: Buf -> Mem (バッファは先頭から・・) *
* *
* ofs: SD/Mem = 読書き開始オフセット(16進数) *
* 'B'のみ = バッファーオフセット(10進数) *
* (ofsは16bit単位[最下位は常に0に切捨]) *
* sz: 読み書きデータ数 *
*--------------------------------------------------*/
void Bf_cmd_B(char *str){
char *pt;
char cmd2;
uint32_t ofs;
uint16_t sz;
QT_Clr_All();
gOLED_strX(0,0,str,CMD_COLOR,1);
if(strlen(str)==1){
mn_cmd_BD(Bofs, Bsiz);
}else{
cmd2 = str[1];
if(strchr("DLSRW",cmd2)){
pt = str+2;
}else{
pt = str + 1;
cmd2 = 'D';
}
if(*pt != ','){ // 第1パラメータ有り
pt = strtok(pt,Dlm); // 文字列データ新規取得
if(pt != NULL){ // 文字列があれば?
if(cmd2 == 'D'){
Bofs = (uint16_t)atoi(pt);
if(Bofs>512) Bofs = 512;
}else{
ofs = my_xtol(pt); // 第1パラメータget
switch(cmd2){
case 'R': Rofs = ofs; break;
case 'W': Wofs = ofs; break;
}
}
pt = strtok(NULL,Dlm); // 次文字列データ再取得
}else{
switch(cmd2){
case 'R': Rofs += Bsiz; break;
// case 'W': Wofs += Bsiz; break;
}
}
}else{
pt = strtok(pt+1,Dlm);
}
if(pt != NULL){ // 文字列があれば?
EU_it_str("Size"," = ", pt);
Bsiz = (uint16_t)atoi(pt); // 第2パラメータget
if((Bsiz>512)||(Bsiz==0)) Bsiz = 512;
}
switch(cmd2){
case 'D': mn_cmd_BD(Bofs, Bsiz); break;
case 'L': Load_SD2Bf(Sofs); break;
case 'S': Save_Bf2SD(Sofs); break;
case 'R': Rd_Rom2Bf(Rofs,Bsiz); break;
case 'W': Wr_Bf2Rom(Wofs,Bsiz); break;
}
}
}
//==== A(scii)コマンド A[ofs,]str =======
/* バッファーへASCII文字列を書込む *
* (ascii文字以外を書き込むにはSコマンドを使用) *
* (オフセット無し場合はコンマを付けないこと!) *
* ofs: Bufの書込オフセット *
* str: 書き込む文字列 *
*---------------------------------------------------*/
void Bf_cmd_A(char *str){
char *pts; // 文字列ポインタ
UINT sz ; // 書込文字数
QT_Clr_All();
gOLED_strX(0,0,str,CMD_COLOR,1);
if(strlen(str)==1) return; // 'A'のみなら
if(strchr(str,',')){ // コンマがあれば?ofs有り
pts = strtok(str+1,Dlm); // コマンドの次文字から
if(pts != NULL){ // オフセットデータがある
Bofs = (UINT)atol(pts); // オフセット値取得
}
pts = strtok(NULL,Dlm); // 書込文字列指定
}else{
pts = str + 1; // 書込文字列指定
}
if(pts != NULL){ // 文字列データ有り
sz = strlen(pts);
if(Bofs+sz>512) sz = 512 - Bofs;
my_strRep(Buf,512,Bofs,(BYTE *)pts,sz);
Bofs += sz;
}
}
/********************************************
* Main application
********************************************/
void main(void) {
char cmd; // 受信コマンド文字
char msg[] = "--- abc924 ---";
SYSTEM_Initialize();
// タイマ0 Callback関数定義
TMR0_SetInterruptHandler(TMR0_Process);
INTERRUPT_GlobalInterruptEnable();
INTERRUPT_PeripheralInterruptEnable();
SSPEN_ON();
SSD1331_Init();
SPI_Mem_Read(0); // メモリーを空読み
LED_SetHigh(); // LED点灯
EU_Puts(msg);
QT_Clr_All(); // OLED画面をクリア
gOLED_strX(0,0,msg,255,1);
while (1) {
// 1秒周期の処理
if(TFlg == 1){ // フラグオンの場合
LED_Toggle();
TFlg = 0; // フラグリセット
}
// コマンド処理
if(SFlg){ // 受信ありの場合
cmd = RBuf[0];
switch(cmd){
case 'C': QT_Clr_All(); break; // 画面の全クリア
case 'B': Bf_cmd_B(RBuf); break; // バッファー処理
case 'A': Bf_cmd_A(RBuf); break; // バッファーへ書込(文字列)
case 'S': Mn_cmd_SW(RBuf); break; // バッファーへ書込(16進数)
case 'W': Mn_cmd_SW(RBuf); break; // メモリへ書込
#ifdef USE_FLASH
case 'E': sM_cmd_E(RBuf); break; // フラッシュメモリ消去
#endif
#if defined(USE_OLED_TEST)
case 'Q': QT_cmd_Q(RBuf); break; // OLED表示テスト
#endif
#if defined(USE_SDCARD)
case 'F': SD_cmd_F(RBuf); break; // ファイル名セット
#if defined(USE_INFO)
case 'I': SD_cmd_I(); break; // ファイル情報
#endif
#if defined(USE_DIR)
case 'D': SD_cmd_D(RBuf); break; // ディレクトリ
#endif
#if defined(USE_BMP)
case 'V': SD_cmd_V(RBuf); break; // 画像読込・表示
#endif
#if defined(USE_SD_TEST)
case 'T': SD_cmd_T(RBuf); break; // SDカードテスト
#endif
#endif
#if defined(USE_KANJI) && defined(USE_KAN_TEST)
case 'K': sK_cmd_K(RBuf); break; // 漢字表示(アドレス)
case 'J': sK_cmd_J(RBuf); break; // 漢字表示(JISコード)
#endif
default: EU_Puts("???"); break; // 無効なコマンド
}
SFlg = 0;
}
}
}
/****** End of File *****/
|