アウトプットっぽい何か。2


先日公開した Outport モジュールはダイナミック点灯な作りであって、
そのままスタティック点灯に利用するには不便でしたので
結構な手直しを行いました。


Outport.h, Outport.c を変更し、
サンプルプログラムの main.c も併せて変更しました。
OutportPrivate.h, NumLED.h, NumLED.c, BinLED.h, BinLED.c は前回と変更ありません。


メインループで再描画を行う関数が毎回実行されるものとして、
2進 LED または7セグ LED データの更新、ないし LED マッピングスワップが発生したときのみ
再描画を行うようにしました。


見易くまとめたつもりですが
自分でもパッと見て見辛いと感じてます。
単調な記述が多いのが原因かも知れませんが技量が足りません。
外から呼び出し易いことを念頭に組んだ代わりに、
やや内部に詰め込み過ぎな感が…。


尚、サンプルコードで実行してない関数で
Outport_OutRPortSoundBit() 関数というのがありますが
これは何かと言いますと、
サウンド再生は CPU からサウンドデータが R PORT bit3 を経由して
AMP へ送られる際の通過時、LED 点灯が発生し(サウンドデータ送信中)、
サウンド再生が終了するとともに LED が消灯(サウンドデータ送信終了)するという動作を再現するためのものです。
消灯と言っても、サウンド再生する以前に bit3 LED が点灯してる状態であった場合
(モニタで、メモリアドレス 0x08 を指してる状態等)、
サウンド終了と共に消すわけにはいかないので、そこをフォローする為の関数でもあります。


アウトプットは一先ずこれで終了です。


main.c

/*---------------------------------------------------------------------------------
	
	Outport + NumLED + BinLED  module test
	
	version 0.02
	Oct 08, 2009
	
	(C)2009 REGEKATSU
	
---------------------------------------------------------------------------------*/
#include <nds.h>
#include <stdio.h>

#include "Outport.h"


char *mode_name[] = { "DEFAULT", "SWAP   " };


//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------
	
	u8 num_val = 0x00;
	u8 bin_val = 0x00;
	
	int mode;
	
	consoleDemoInit();
	
	mode = Outport_InitOutport();
	
	while(1) {
		
		swiWaitForVBlank();
		
		Outport_ExecOutport();
		
		printf("\x1b[8;0HMAPPING MODE %d:%s", mode, mode_name[mode]);
		
		scanKeys();
		
		if(keysDown() & KEY_UP){
			
			if(bin_val < 0x7F){
				bin_val++;
			}else{
				bin_val = 0x00;
			}
			Outport_ShowRPort(bin_val);
			
		}else if(keysDown() & KEY_DOWN){
			
			if(bin_val > 0x00){
				bin_val--;
			}else{
				bin_val = 0x7F;
			}
			Outport_ShowRPort(bin_val);
			
		}else if(keysDown() & KEY_RIGHT){
			
			if(num_val < 0x0F){
				num_val++;
			}else{
				num_val = 0x00;
			}
			Outport_ShowOPort(num_val);
			
		}else if(keysDown() & KEY_LEFT){
			
			if(num_val > 0x00){
				num_val--;
			}else{
				num_val = 0x0F;
			}
			Outport_ShowOPort(num_val);
			
		}
		
		if(keysDown() & KEY_SELECT){
			mode = Outport_SwapMapping();
		}
		
	}
	
}

//---------------------------------------------------------------------------------


Outport.h

/*---------------------------------------------------------------------------------
	
	Outport module header
	
	version 0.02
	Oct 08, 2009
	
	(C)2009 REGEKATSU
	
---------------------------------------------------------------------------------*/

#ifndef _OUTPORT_H_
#define _OUTPORT_H_


#include <nds/ndstypes.h>


#ifdef __cplusplus
extern "C" {
#endif


int Outport_InitOutport(void);
int Outport_ExecOutport(void);
int Outport_ClearOutport(void);

int Outport_SwapMapping(void);
int Outport_ClearMapping(void);

void Outport_ShowOPort(u8 num_val);
void Outport_HideOPort(void);
void Outport_ClearOPort(void);

void Outport_ShowRPort(u8 bin_val);
void Outport_HideRPort(void);
void Outport_ClearRPort(void);

void Outport_OutRPortSoundBit(bool is_play_sound);


#ifdef __cplusplus
}
#endif

#endif	//_OUTPORT_H_


Outport.c

/*---------------------------------------------------------------------------------
	
	Outport module routine
	
	version 0.02
	Oct 08, 2009
	
	(C)2009 REGEKATSU
	
---------------------------------------------------------------------------------*/

#include "OutportPrivate.h"


//Outport OPort -> NumberLED
// AO - Ar -> Op
// CAL RSTO - Reset Op

//Outport RPort -> BinaryLED
// CAL SETR
// CAL RSTR
// CAL DSPR


typedef enum{
	MAPPING_DEF,
	MAPPING_SWAP
}MAPPING_MODE;


typedef struct{
	u8 oport_val;
	u8 rport_val;
	MAPPING_MODE mapping_mode;
	bool draw_req;
}OutportStatus;


static OutportStatus st_outport;


void (*pDrawLED[2])(u8 val);


bool outport_GetDrawRequest(void);
void outport_SetDrawRequest(bool);

u8 outport_GetOPortValue(void);
void outport_SetOPortValue(u8 num_val);
void outport_SetOPort(u8 num_val);
void outport_DrawOPort(void);

u8 outport_GetRPortValue(void);
void outport_SetRPortValue(u8 bin_val);
void outport_SetRPort(u8 bin_val);
void outport_DrawRPort(void);

MAPPING_MODE outport_GetMappingMode(void);
void outport_SetMappingMode(MAPPING_MODE mapping_mode);
void outport_SetMapping(MAPPING_MODE mapping_mode);


//---------------------------------------------------------------------------------
// Outport Draw Request Getter / Setter
//---------------------------------------------------------------------------------
bool outport_GetDrawRequest(void){
//---------------------------------------------------------------------------------
	return st_outport.draw_req;
}

//---------------------------------------------------------------------------------
void outport_SetDrawRequest(bool draw_req){
//---------------------------------------------------------------------------------
	st_outport.draw_req = draw_req;
}



//---------------------------------------------------------------------------------
// Outport OPort Getter / Setter / Setter + DrawReq / Draw
//---------------------------------------------------------------------------------
u8 outport_GetOPortValue(void){
//---------------------------------------------------------------------------------
	return st_outport.oport_val;
}

//---------------------------------------------------------------------------------
void outport_SetOPortValue(u8 num_val){
//---------------------------------------------------------------------------------
	
	const static u8 seg_pattern[] = {
		//7 Seg LED hexa number pattern
		0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 
		0x7F, 0x67, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 
		0x00
	};
	
	//配列外の値を送り込まれた時の対処(暫定)
	if(num_val > 0x10)
		num_val = 0x00;
	
	st_outport.oport_val = seg_pattern[num_val];
	
}

//---------------------------------------------------------------------------------
void outport_SetOPort(u8 num_val){
//---------------------------------------------------------------------------------
	
	u8 seg_old, seg_val;
	
	seg_old = outport_GetOPortValue();
	outport_SetOPortValue(num_val);
	seg_val = outport_GetOPortValue();
	
	if(seg_old != seg_val)
		outport_SetDrawRequest(true);
	
}

//---------------------------------------------------------------------------------
void outport_DrawOPort(void){
//---------------------------------------------------------------------------------
	(*pDrawLED[st_outport.mapping_mode])(outport_GetOPortValue());
}



//---------------------------------------------------------------------------------
// Outport RPort Getter / Setter / Setter + DrawReq / Draw
//---------------------------------------------------------------------------------
u8 outport_GetRPortValue(void){
//---------------------------------------------------------------------------------
	return st_outport.rport_val;
}

//---------------------------------------------------------------------------------
void outport_SetRPortValue(u8 bin_val){
//---------------------------------------------------------------------------------
	st_outport.rport_val = bin_val & 0x7F;
}

//---------------------------------------------------------------------------------
void outport_SetRPort(u8 bin_val){
//---------------------------------------------------------------------------------
	
	u8 bin_old;
	
	bin_old = outport_GetRPortValue();
	outport_SetRPortValue(bin_val);
	
	if(bin_old != bin_val)
		outport_SetDrawRequest(true);
	
}

//---------------------------------------------------------------------------------
void outport_DrawRPort(void){
//---------------------------------------------------------------------------------
	(*pDrawLED[st_outport.mapping_mode ^ 0x01])(outport_GetRPortValue());
}



//---------------------------------------------------------------------------------
// Outport Mapping Getter / Setter / Setter + DrawReq
//---------------------------------------------------------------------------------
MAPPING_MODE outport_GetMappingMode(void){
//---------------------------------------------------------------------------------
	return st_outport.mapping_mode;
}

//---------------------------------------------------------------------------------
void outport_SetMappingMode(MAPPING_MODE mapping_mode){
//---------------------------------------------------------------------------------
	st_outport.mapping_mode = mapping_mode;
}

//---------------------------------------------------------------------------------
void outport_SetMapping(MAPPING_MODE mapping_mode){
//---------------------------------------------------------------------------------
	
	MAPPING_MODE mapping_old;
	
	mapping_old = outport_GetMappingMode();
	outport_SetMappingMode(mapping_mode);
	
	if(mapping_old != mapping_mode)
		outport_SetDrawRequest(true);
	
}



//---------------------------------------------------------------------------------
// Outport Main Exec
//---------------------------------------------------------------------------------
int Outport_InitOutport(void){
//---------------------------------------------------------------------------------
	pDrawLED[0] = NumLED_DrawSegLED;
	pDrawLED[1] = BinLED_DrawBinLED;
	
	return Outport_ClearOutport();
}

//---------------------------------------------------------------------------------
int Outport_ExecOutport(void){
//---------------------------------------------------------------------------------
	if(outport_GetDrawRequest()){
		outport_DrawOPort();
		outport_DrawRPort();
	}
	
	outport_SetDrawRequest(false);
	
	return (int)outport_GetMappingMode();
}

//---------------------------------------------------------------------------------
int Outport_ClearOutport(void){
//---------------------------------------------------------------------------------
	Outport_ClearOPort();
	Outport_ClearRPort();
	Outport_ClearMapping();
	
	return Outport_ExecOutport();
}



//---------------------------------------------------------------------------------
// Outport Mapping setting
//---------------------------------------------------------------------------------
int Outport_SwapMapping(void){
//---------------------------------------------------------------------------------
	if(outport_GetMappingMode())
		outport_SetMapping(MAPPING_DEF);
	else
		outport_SetMapping(MAPPING_SWAP);
	
	return (int)outport_GetMappingMode();
}

//---------------------------------------------------------------------------------
int Outport_ClearMapping(void){
//---------------------------------------------------------------------------------
	outport_SetMapping(MAPPING_DEF);
	
	return (int)outport_GetMappingMode();
}



//---------------------------------------------------------------------------------
// Outport to Number LED
//---------------------------------------------------------------------------------
void Outport_ShowOPort(u8 num_val){
//---------------------------------------------------------------------------------
	outport_SetOPort(num_val);
}

//---------------------------------------------------------------------------------
void Outport_HideOPort(void){
//---------------------------------------------------------------------------------
	outport_SetOPort(0x10);
}

//---------------------------------------------------------------------------------
void Outport_ClearOPort(void){
//---------------------------------------------------------------------------------
	outport_SetOPort(0x0F);
}



//---------------------------------------------------------------------------------
// Outport to Binary LED
//---------------------------------------------------------------------------------
void Outport_ShowRPort(u8 bin_val){
//---------------------------------------------------------------------------------
	outport_SetRPort(bin_val);
}

//---------------------------------------------------------------------------------
void Outport_HideRPort(void){
//---------------------------------------------------------------------------------
	outport_SetRPort(0x00);
}

//---------------------------------------------------------------------------------
void Outport_ClearRPort(void){
//---------------------------------------------------------------------------------
	outport_SetRPort(0x00);
}



//---------------------------------------------------------------------------------
// Outport to RPort Sound port Bit
//---------------------------------------------------------------------------------
void Outport_OutRPortSoundBit(bool is_play_sound){
//---------------------------------------------------------------------------------
	const static u8 RPORT_BIT3 = 0x08;
	
	static u8 bin_bak = 0x00;
	
	if(is_play_sound){
		bin_bak = outport_GetRPortValue();
		outport_SetRPort(bin_bak | RPORT_BIT3);
	}else{
		outport_SetRPort(bin_bak);
	}
}

//---------------------------------------------------------------------------------