Essential rules and methods you must follow when refactoring code.
ãšãŒãžã§ã³ãã¹ãã«: æçããã³ãŒãã3å±€ã¢ãŒããã¯ãã£ã«ãªãã¡ã¯ã¿ãªã³ã°ãã
åå: "Premature optimization is the root of all evil" (æ©ãããæé©åã¯è«žæªã®æ ¹æº)
以äžã®ãã¹ãŠãæºããå Žå:
åå: "Make it work, make it right, make it fast"
| ææš | ãããå€ | ã¢ã¯ã·ã§ã³ |
|---|---|---|
| ãã¡ã€ã«è¡æ° | > 500è¡ | åå²ãæ€èš |
| 颿°è¡æ° | > 100è¡ | åå²ãæ€èš |
| 颿°å ã®è²¬å | 3ã€ä»¥äž | åé¢ãæ€èš |
| éè€ã³ãŒã | 3ç®æä»¥äž | æœè±¡åãæ€èš |
âââââââââââââââââââââââââââââââââââââââââââ
â Layer 3: Application Layer â
â - main(), CLI parsing, signal handling â
â - 責å: ã©ã€ããµã€ã¯ã«ç®¡ç â
â - ãµã€ãº: ~100è¡ â
âââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââ
â Layer 2: Pipeline/Business Logic â
â - ã¯ãŒã¯ãããŒçµ±åãããŒã¿ãã㌠â
â - 責å: è€æ°ã®HALãçµã¿åãããåŠç â
â - ãµã€ãº: ~200-300è¡/ãã¡ã€ã« â
âââââââââââââââââââââââââââââââââââââââââââ
â
âââââââââââââââââââââââââââââââââââââââââââ
â Layer 1: Hardware Abstraction (HAL) â
â - ããŒããŠã§ã¢API ã®èãã©ãã㌠â
â - 責å: åäžããŒããŠã§ã¢ã®æäœ â
â - ãµã€ãº: ~200-300è¡/ãã¡ã€ã« â
âââââââââââââââââââââââââââââââââââââââââââ
DO (æšå¥š):
DON'T (çŠæ¢):
ãµã³ãã« (ä»åã®å®è£ ):
// vio_lowlevel.h - VIO HAL
int vio_create(vio_context_t *ctx, int camera_index, ...);
int vio_start(vio_context_t *ctx);
int vio_get_frame(vio_context_t *ctx, hbn_vnode_image_t *frame, int timeout_ms);
void vio_destroy(vio_context_t *ctx);
DO (æšå¥š):
DON'T (çŠæ¢):
ãµã³ãã« (ä»åã®å®è£ ):
// camera_pipeline.h - VIO + Encoderçµ±å
typedef struct {
vio_context_t vio; // HALå±€ãå©çš
encoder_context_t encoder; // HALå±€ãå©çš
SharedFrameBuffer *shm_h264;
volatile bool *running_flag;
} camera_pipeline_t;
int pipeline_run(camera_pipeline_t *pipeline, volatile bool *running_flag);
DO (æšå¥š):
DON'T (çŠæ¢):
ãµã³ãã« (ä»åã®å®è£ ):
// camera_daemon_main.c
int main(int argc, char *argv[]) {
// 1. Parse arguments
// 2. Signal handling
// 3. Create pipeline (Pipelineå±€ãå©çš)
// 4. Start pipeline
// 5. Run pipeline
// 6. Cleanup
}
| å±€ | ãã¿ãŒã³ | äŸ |
|---|---|---|
| HAL | {hardware}_lowlevel.c/h |
vio_lowlevel.c, encoder_lowlevel.c |
| Pipeline | {domain}_pipeline.c/h |
camera_pipeline.c |
| Application | {app}_main.c |
camera_daemon_main.c |
| å±€ | ãã¿ãŒã³ | äŸ |
|---|---|---|
| HAL | {hardware}_{verb}() |
vio_create(), encoder_encode_frame() |
| Pipeline | pipeline_{verb}() |
pipeline_run(), pipeline_create() |
èŠä»¶:
å®è£
: logger.c/h
äœ¿ãæ¹:
#include "logger.h"
// åæå (main颿°ã§1å)
log_init(LOG_LEVEL_INFO, stdout, 0);
// åã¢ãžã¥ãŒã«ã§äœ¿çš
LOG_INFO("VIO", "Pipeline created successfully");
LOG_ERROR("Encoder", "hb_mm_mc_configure failed: %d", ret);
æšå¥š:
printf/fprintf ã®ä»£ããã«LOG_*ãã¯ãã䜿ãçŠæ¢:
printfã§ãšã©ãŒãåºåããªã (LOG_ERRORã䜿ã)æ¢åã³ãŒãã®çè§£
å¢çã®ç¹å®
1ã€ã®ããŒããŠã§ã¢ã«éäž
æå°éã®APIãèšèš
æ¢åã³ãŒãããæœåº
ãã¹ã
ã¯ãŒã¯ãããŒãç¹å®
HALå±€ãçµã¿åããã
ãã¹ã
main()ãã·ã³ãã«ã«
ãã¹ã
| é ç® | å¶é | å¯ŸåŠ |
|---|---|---|
| H.264 Bitrate | <= 700 kbps | ããã©ã«ã600kbpsæšå¥š |
| Camera Index | 0 or 1 | Camera 0âMIPI Host 0, Camera 1âMIPI Host 2 |
| bus_select | åžžã«0 | äž¡ã«ã¡ã©ã§0ãäœ¿çš |
VIO (Low-level):
hbn_camera_create() - ã«ã¡ã©åæåhbn_vnode_open() - VIN/ISP/VSEããŒãäœæhbn_vflow_bind_vnode() - ãã€ãã©ã€ã³æ¥ç¶hbn_vnode_getframe() - ãã¬ãŒã ååŸEncoder (Low-level):
hb_mm_mc_initialize() - ãšã³ã³ãŒããŒåæåhb_mm_mc_configure() - ãšã³ã³ãŒããŒèšå®hb_mm_mc_start() - ãšã³ã³ãŒããŒèµ·åhb_mm_mc_queue_input_buffer() - NV12å
¥åhb_mm_mc_dequeue_output_buffer() - H.264åºåå¿ é ã©ã€ãã©ãª:
LDLIBS := -lrt -lpthread -lcam -lvpf -lhbmem -lmultimedia
ããããŒã€ã³ã¯ã«ãŒã:
#include "hb_camera_interface.h"
#include "hb_camera_data_config.h"
#include "hbn_api.h"
#include "hb_media_codec.h"
#include "hb_mem_mgr.h"
ãªãã¡ã¯ã¿ãªã³ã°ãæåãããã®å€æåºæº:
User: "camera_daemon_drobotics.c (886è¡) ããªãã¡ã¯ã¿ãªã³ã°ããã"
Agent:
1. ãŸãå€æåºæºã確èªããŸã
- èŠä»¶ã¯åºãŸã£ãŠããŸããïŒ
- åäœæ€èšŒã¯æžãã§ããŸããïŒ
- ä¿å®ã»æ¡åŒµã®äºå®ã¯ãããŸããïŒ
2. (æ¡ä»¶ãæºããå Žå) Phase 1: åæ
- ãã¡ã€ã«ãèªã¿ã責åãåæ
- HALå±€åè£ãç¹å®
3. Phase 2-4: å®è£
- HALå±€ãæœåº
- Pipelineå±€ãäœæ
- Applicationå±€ãç°¡çŽ å
4. æ€èšŒ
- ããã©ãŒãã³ã¹ãã¹ã
- åäœç¢ºèª
ãšãŒãžã§ã³ãã¯ä»¥äžã®ç¶æ³ã§èªåçã«ãªãã¡ã¯ã¿ãªã³ã°ãææ¡ããŸã:
ææ¡åœ¢åŒ:
"ãã®ãã¡ã€ã«ã¯{è¡æ°}è¡ã§ã{責å1}ãš{責å2}ãæ··åšããŠããŸãã
3å±€ã¢ãŒããã¯ãã£ã«ãªãã¡ã¯ã¿ãªã³ã°ããããšã§:
- åãã¡ã€ã«ã{äºæ³è¡æ°}è¡çšåºŠã«åãŸã
- ãã¹ã¿ããªãã£ãåäžãã
- ä¿å®æ§ãåäžãã
ãªãã¡ã¯ã¿ãªã³ã°ã宿œããŸããïŒ"
NGäŸ:
// ãã£ã50è¡ã®åçŽãªã¹ã¯ãªããã3å±€ã«åå²
// â é床ãªè€éåãã¡ã³ããã³ã¹ã³ã¹ããäžããã ã
æ£è§£: å°ããã·ã³ãã«ãªã³ãŒãã¯ãã®ãŸãŸæ®ã
NGäŸ:
// 1ç®æã§ãã䜿ããªãåŠçããããã颿°å
AbstractFactoryBuilder* builder = createAbstractFactoryBuilder();
// â YAGNIéå
æ£è§£: 3ç®æä»¥äžã§éè€ããŠããæœè±¡åãæ€èš
NGäŸ:
// getter/setterã ãã®ãã¡ã€ã«
// utils.c ã«äœã§ãè©°ã蟌ã
// â 責åãäžæç¢º
æ£è§£: æç¢ºãªè²¬åãæã€åäœã§åå²
camera_poc_lowlevel.c - 639è¡â ãªãã¡ã¯ã¿ãªã³ã°æ±ºå®
vio_lowlevel.c/h - 334è¡ (HAL)encoder_lowlevel.c/h - 203è¡ (HAL)camera_pipeline.c/h - 217è¡ (Pipeline)camera_daemon_main.c - 177è¡ (Application)logger.c/h - 106è¡ (Infrastructure)åèš: 1037è¡ (PoC 639è¡ãã400è¡å¢)
ãã¬ãŒããªã:
çµæ:
ãªãã¡ã¯ã¿ãªã³ã°ã®éèš:
"Make it work, make it right, make it fast"
ãŸãåãããæ¬¡ã«æ£ãããããæåŸã«éãããã
ãªãã¡ã¯ã¿ãªã³ã°ãã¹ãã¿ã€ãã³ã°:
èŠä»¶ãåºãŸããåäœã確èªã§ããé·æä¿å®ãå¿ èŠã«ãªã£ããšãã ãããŸã§ã¯ãæ±ããŠãçŽ æ©ãåãã