/**************************************************************
 * MainHost.c — 主滑块程序（STC89C52）
 * 功能：温湿度 DHT11 / 风速风向 VMS-3003 / 定位 ATGM336H-5N
 *       计算本机叶面角·叶轴角 → 控制本地两台步进电机
 *       500ms 经 RS485 广播 {风速,风向,主机方位角,模式} 给从机
 **************************************************************/
#include "blade_control.h"
#include <string.h>

static float g_wind_speed = 0.0f, g_wind_dir = 0.0f;
static float g_master_angle = 0.0f;
static unsigned char g_mode = ST_INIT;
static unsigned char g_slave_cnt = 24;
static unsigned int  tick = 0;

extern void dht11_read(float *temp, float *humi);
extern float vms3003_read_speed(void);
extern float vms3003_read_dir(void);
extern void gps_poll(void);

void main(void)
{
    unsigned char i;
    timer_init();
    uart_init(9);                       /* 见 uart_init 说明 */
    lcd_show(0, "TrackGen Master");
    lcd_show(1, "INIT...");

    /* ---- 初始化：叶片顺风，叶面角 90°，叶轴角 0° ---- */
    set_face_target(90.0f);
    set_axis_target(0.0f);
    while (busy_face || busy_axis) pulse_service();
    g_mode = ST_RUN;

    while (1) {
        /* ---- 100ms 节拍 ---- */
        tick++;
        if (tick % 100 == 0) {
            g_wind_speed = vms3003_read_speed();
            g_wind_dir   = vms3003_read_dir();
            g_master_angle = calc_master_angle();   /* 由 GPS 坐标换算方位角 */
            gps_poll();
        }

        /* ---- 保护：风速 > 20 m/s → 顺桨 ---- */
        if (g_wind_speed > 20.0f && g_mode != ST_PROT) {
            g_mode = ST_PROT;
            set_face_target(-90.0f);      /* 顺桨 */
            set_axis_target(15.0f);
        }

        /* ---- 检修：风速 < 1 m/s 才允许 ---- */
        if (g_mode == ST_MAINT && g_wind_speed > 1.0f) {
            lcd_show(1, "WIND>1 NO MAINT");
            g_mode = ST_RUN;
        }

        /* ---- 舞蹈：风速 < 0.1 m/s ---- */
        if (g_mode == ST_DANCE && g_wind_speed > 0.1f) g_mode = ST_STOP;

        /* ---- 本机两轴控制 ---- */
        if (g_mode == ST_RUN) {
            float sf = calc_leaf_surface_angle(g_wind_dir, g_master_angle);
            float sa = calc_leaf_axis_angle(g_master_angle);
            set_face_target(sf);
            set_axis_target(sa);
            lcd_show(0, "RUN");
        } else if (g_mode == ST_STOP) {
            set_face_target(135.0f);      /* 最小迎风 */
            set_axis_target(0.0f);
            lcd_show(0, "STOP");
        }

        /* ---- 500ms 广播 ---- */
        if (tick % 500 == 0) {
            for (i = 1; i <= g_slave_cnt; i++) {
                /* 帧内只发公共量，从机自行按 ID 计算角度 */
                rs485_broadcast(g_wind_speed, g_wind_dir, g_master_angle, g_mode, i);
            }
        }

        pulse_service();
        key_scan();
    }
}
