이번 포스팅에서는 각각의 구현은 다르지만 기능은 같은 객체들을 관리하는 Builder 패턴에 대해 알아보겠습니다. 간단하게 예를 들면 사용자측 코드 즉, main 함수에서는 객체를 만들 뿐 기능을 사용하기 위해 기능 함수를 직접 호출하지 않고 관리자를 통해서만 일 처리를 합니다. Key(버튼) 처리하는 예제로 Builder 패턴을 상세히 들여다 보겠습니다. Key를 입력받아 처리하는 식의 기능은 firmware에서는 참 많이 쓰입니다. Key 처리 기능은 하드웨어적으로 참 많이 바뀝니다. 예를 들어 단순 1:1 GPIO를 사용할 수도 있고 ADC를 사용할수도 있으며 혹은 1:N 매트릭스 GPIO를 사용할 수도 있습니다. 아니면 세가지 다 사용할 수도 있겠지요. 주의할 점은 어떠한 하드웨어 Ke..
지난 시간에 이어 계속해서 Adapter 패턴에 대해 알아보겠습니다. 지난 시간에는 Adapter가 필요한 콘크리트 코드에 대해 살펴봤고 이번 시간에는 실제적으로 콘크리트 코드가 interface 화 될 실제 driver interface를 살펴 보도록 하겠습니다. 궁극적으로 Adapter 패턴은 기존의 콘크리트 코드가 새로운 interface에 맞지 않아 중간에 Adapter를 끼워넣어 맞추는 역할을 하게 됩니다. 이번 시간에는 그중에 새로운 interface에 대해 살펴보겠습니다. typedef enum { DRIVER_ID_UART1, DRIVER_ID_UART2, DRIVER_ID_DISPLAY, DRIVER_MAX, }driver_id_t; typedef struct { driver_id_t i..
남이 작성한 코드를 내 코드에 적용해야 할 때가 아주 많습니다. 그러나 대부분 크기가 다른 볼트와 너트처럼 딱 맞아 떨어지지 않습니다. 이럴 땐 어떻게 해야 할까요? 중간에 양 쪽에 잘 맞는 나사를 하나 덧 대는 것으로 해결 할 수 있습니다. Adapter 패턴은 흔히 레거시 코드(Legacy Code)라고 불리는 예전에 작성된 코드들을 현재의 코드와 맞게 고치는 방법입니다. 다른 사람이 작성한 코드를 자신의 코드에 맞게 고쳐쓰는 방법으로도 좋습니다. 우리는 중간에 Adapter라는 Wrapper 함수를 만들어 Adapter패턴을 구현할 것입니다. 이번 예제에서는 display라는 콘크리트 코드를 driver라는 interface와 호환이 되도록 만들어 보겠습니다. 우선 display 콘크리트 코드부터 ..
오늘 포스팅할 내용은 소프트웨어 Timer입니다. 소프트웨어 Timer는 MCU의 페리페럴 중 하나인 하드웨어 타이머와 다르며 오히려 PC 소프트웨어의 Timer에 가깝습니다. 구현하고자하는 소프웨어 Timer는 설정한 주기가 되면 자동으로 등록한 Callback 함수를 실행시켜 줍니다. 소프트웨어 Timer이기 때문에 Tick을 증가시켜줄 MCU의 하드웨어 Timer가 하나 필요합니다. 먼저 자주 사용하는 주기를 파악 합니다. 최소단위를 10ms으로 정하고 10ms 주기의 하드웨어 Timer를 하나 만들어 인터럽트에서 소프트웨어 Timer의 Tick을 증가시켜 줍니다. 먼저 헤더파일로 전체 윤곽을 만듭니다. Timer 핸들러의 typedef도 선언되어 있습니다. #ifndef SRC_TIMER_H_ #..
자료구조를 다룰때 많이 사용되는 Iterator 패턴을 살펴보도록 하겠습니다. 보시다시피 8bit 자료형을 취급하는 iterator입니다. setup_iterator은 커스텀되어있는 자료형과 연결하는 함수입니다. 즉, 사용자가 만든 자료형과 인터페이스와 연결하는 부분입니다. /* iterator.h */typedef struct{ void (*init)(void); bool (*set_value)(uint8_t value); bool (*get_first_value)(uint8_t re_value); bool (*get_next_value)(uint8_t re_value); bool (*has_next)(void); uint8_t *(*get_current_buffer)(void);}iterator_t;..
이번장에서는 프로그램 전체적으로 한개의 자원을 사용하는 경우 적용할 수 있는 디자인 패턴 Singleton 패턴에 대해 알아보겠습니다. 예를 들면 GPS, G sensor, 온도센서와 같은 모듈은 보통 한개의 제품에 한개씩 들어있습니다. 각각의 모듈을 초기화하고 사용하는 C 언어 Class를 만든다면 다음과 같이 Singleton을 활용할 수 있습니다. #define null (void *)0 typedef struct { init_function_t init; open_function_t open; connect_function_t connection; //... (필요시 추가) }device_t; device_t *get_gps_instance() { static device_t *instance =..
Observer 패턴은 정말 많이 사용하는 디자인 패턴입니다. 자바 프레임워크에서도 쉽게 찾아 볼 수 있는데 흔히 Java C#에서 사용되는 Event Listener 들이 이 종류에 속합니다. 이번 장에서 만들 Observer pattern 예제에는 아래의 요소가 필요합니다. observer_t : 관찰자 구조체 calculate_temperature : 온도 측정 실행함수 display_degree_handler : 화면에 측정된 온도를 표시하는 함수 file_write_degree_handler : 파일에 측정된 온도를 기록하는 함수 우선 헤더를 보겠습니다. /* header.h */ typedef void (*observer_handler_t)(uint32_t degree, uint32_t par..
http://terms.naver.com/entry.nhn?docId=3532979 디자인 패턴중에 매우 사용도가 높고 매우 효율적인 State 패턴은 공부를 하다보면 좀 헷갈리는 디자인 패턴입니다. 대부분의 패턴은 if 문과 같이, 유지보수나 버그를 양산하기 쉬운 코드를 없애고 쉬운 확장을 목적으로 구조를 만듭니다. State 패턴은 각 상태가 바뀔 때 마다 늘어나는 if문을 없애는 패턴입니다. 즉, 상태들 끼리 서로의 상태를 바꿔가며 동작하기 때문에 유지보수도 쉽고 확장도 용이합니다. 그러나 상태변화에 대한 명확한 이해와 구조를 어떻게 할지에 대한 고민이 필요합니다. 다소 생소하고 복잡하게 보일지 모르지만 한번 구현해 보도록 하겠습니다. 예제는 단순한 Light를 On/Off하는 기능을 State 패..