✅ 목표 (Goal)

✅ void* 사용 예: packet 보내기 함수

packet이 3 종류라서 아래와 같이 만들어 하는데

typedef struct _sensor_packet_t {
	// code here...
} sensor_packet_t;

typedef struct server_packet_t {
	// code here...
} server_packet_t;

typedef struct client_packet_t {
	// code here...
} client_packet_t 

int paket_tx(sensor_packet_t packet);
int paket_tx(server_packet_t packet);
int paket_tx(client_packet_t packet);

위와 같이 함수를 3개로 만드는 것보다, void*를 이용하여 하나로 만드는게 낫다.

다만 void*는 받는 쪽에서 형을 모르니 형 정보까지 같이 보내줘야 함

typedef enum _packet_type_t {
	SENSOR_PACKET_TYPE,
	SERVER_PACKET_TYPE,
	CLIENT_PACKET_TYPE,
} packet_type_t;

int paket_tx(void* packet, packet_type_t type);
// 3개의 함수가 1개로 통합되었다.

3개로 만드는게 좋은지, 1개로 만들고 타입을 보내주는게 좋은지는 선택의 문제이다.

✅ void* 사용 예: packet을 화면에 출력 및 송신

패킷이 제대로 송신되고 있는지, 송신후 화면에 tx 데이터를 출력하는 경우는 많다.

그러나, tx값이 binary라면 화면 출력시 이상한 문자가 출력되므로, 이를 ASCII로 바꿔주는 함수도 만들어야 한다.

enum typedef _display_mode_t {
	NONE, // 화면에 출력하지 않겠다.
	ASCII_MODE, // ASCII 모드로 출력하겠다.   02면 깨짐, 34면 34가 그대로 출력되어서 4가 출력됨
	BINAY_MODE, // 바이너리 모드로 출력하겠다. 02 면 0x30 0x32가 출력됨
};
int paket_tx(void* packet, packet_type_t type, display_mode_t mode);