static void Main()
    {
        BandiCropModule BCM = new BandiCropModule();

        //ConnectEyesen ce = new ConnectEyesen();
        //DevInfo dev = new DevInfo();

        // TEST CONNECTION
        //ce.ConnectToServer("192.168.1.222", 7777);
        //Console.WriteLine(ce.RecieveMassage());

        // RUN TEST
        //BCM.run_module_test();

        // LOAD CROP DATA
        MWStructArray crops_db = BCM.load_crop_db();

        // TEST DONG OBJECT TO APPLY CONTROLS
        DongConfig nare_testbed = new DongConfig(1);

        nare_testbed.name            = "NARE_TESTBED";
        nare_testbed.fan_total       = 5;
        nare_testbed.ch_exhaust_fans = new int[4] {
            1, 2, 3, 4
        };
        nare_testbed.ch_ceiling_vents_L1 = new int[1] {
            1
        };
        nare_testbed.ch_side_vents_L1 = new int[1] {
            2
        };
        nare_testbed.ch_heater = new int[1] {
            3
        };


        // SPECIFY DONG STATE AND CROP
        string    crop_name  = "TOMATO";
        DongState dong_state = new DongState();

        dong_state.temp_in    = 4;
        dong_state.temp_out   = -3;
        dong_state.hum_in     = 50;
        dong_state.hum_out    = 40;
        dong_state.hum_bed    = 30;
        dong_state.co2_supply = true;
        dong_state.rain       = true;

        // CHECK CROP STATUS
        MWStructArray env_status = BCM.crop_env_checker(crops_db, crop_name, dong_state);

        // CHECK FOR REQUIRED CONTROL ACTIONS
        MWStructArray control_actions = BCM.crop_env_controller(crops_db, crop_name, dong_state);

        // APPLY CONTROL TO NARE_TESTBED
        BCM.autoswitch_control(control_actions, nare_testbed);

        Console.WriteLine("\nPress any key to exit.");
        Console.ReadKey();
    }
    public void run_module_test()
    {
        BandiCropAnalyzer.CropAnalyzer crop_analyzer = new BandiCropAnalyzer.CropAnalyzer();

        // TEST CROP AND SENSOR FEED
        string    crop_name  = "STRAWBERRY";
        DongState dong_state = new DongState();

        dong_state.temp_in    = 4;
        dong_state.temp_out   = -3;
        dong_state.hum_in     = 50;
        dong_state.hum_out    = 40;
        dong_state.hum_bed    = 30;
        dong_state.co2_supply = true;
        dong_state.rain       = true;

        // TEST DONG OBJECT TO APPLY CONTROLS
        DongConfig dong = new DongConfig(1)
        {
            name      = "NARE_DONG",
            fan_total = 5,
        };

        MWStructArray crops_db = load_crop_db();

        // DO CROP ENVIRONMENT CHECK ONLY
        MWStructArray env_status = crop_env_checker(crops_db, crop_name, dong_state);

        // PARSE CHECK RESULTS FOR DISPLAY
        int    print_level = 2; // 0->1->2 : INCREASING VERBOSITY
        string result_out  = parse_results(env_status, print_level);

        // PERFORM STATUS CHECK + CONTROL ACTION
        MWStructArray control_actions = crop_env_controller(crops_db, crop_name, dong_state);

        // APPLY CONTROL TO DONG1
        autoswitch_control(control_actions, dong);

        Console.WriteLine("\nMODULE TEST COMPLETE. PRESS ANY KEY TO CONTINUE...");
        Console.ReadKey();
    }
    // SWITCH BETWEEN AUTOMATIC AND GROWTH CONTROLLER
    public void autoswitch_control(MWStructArray control_actions, DongConfig dong)
    {
        // CHECK IF CONTROL ACTIONS RETURNED. STOP AUTOMATIC CONTROL, ACTIVATE TOUCH PANEL CONTROL
        if (control_actions.NumberOfFields == 0)
        {
            Console.WriteLine(">> NO CONTROL ACTIONS RECEIVED.");

            // IF CONTROL ACTIONS EMPTY, REACTIVATE AUTOMATIC CONTROL
            //------------> activate automatic control here
            Console.WriteLine(">> REVERTING TO AUTOMATIC CONTROL...");
        }
        else
        {
            // IF CONTROL ACTIONS RECEIVED, SWITCH TO GROWTH CONTROL
            // ------------> deactivate automatic control here
            Console.WriteLine(">> SWITCHING TO GROWTH CONTROL...");

            // EXECUTE CONTROL ACTIONS THROUGH EYESEN INTERFACE
            execute_control(control_actions, dong);
        }
    }
    // INTERFACETO HARDWARE-LEVEL COMMANDS
    public void execute_control(MWStructArray control_action, DongConfig dong)
    {
        Console.WriteLine("\n======================= SENDING CONTROL SIGNALS =======================");
        Form1 eyesen = new Form1();

        // PARSE DONG INFORMATION
        Console.WriteLine("\nACTIVATING CONTROLS FOR DONG #{0} ...", dong.GetType().GetProperty("id").GetValue(dong, null));
        Console.WriteLine("NAME : " + dong.GetType().GetProperty("name").GetValue(dong, null));

        int nFields = control_action.NumberOfFields;

        string[] field_names = control_action.FieldNames;
        for (int ix = 0; ix < nFields; ix++)
        {
            string control_target = field_names[ix];
            string command        = control_action.GetField(control_target).ToString();
            // string command = "on"; //  switch -> stop, open, close / (2) fan -> on, off / (3) on, off)
            Console.WriteLine(control_target + " : " + command);

            // GET IO POINTS FROM DONG OBJECT
            string iotype     = "fan"; // EYESEN ACTUATORS: switch, fan, relay 입력 가능
            int    dongNumber = dong.id;

            // HEATER
            if (control_target == "heater")
            {
                int[] channels = dong.ch_heaters;
                for (int i = 0; i < channels.Length; i++)
                {
                    eyesen.EquipControl(iotype, dongNumber, channels[i], command);
                }
            }
            ;

            // VENTS
            if (control_target == "vent")
            {
                for (int i = 0; i < channels.Length; i++)
                {
                    eyesen.EquipControl(iotype, dongNumber, channels[i], command);
                }
            }
            ;

            // VENTS
            if (control_target == "fan")
            {
                for (int i = 0; i < channels.Length; i++)
                {
                    eyesen.EquipControl(iotype, dongNumber, channels[i], command);
                }
            }
            ;

            // VENTS
            if (control_target == "irrigation")
            {
                for (int i = 0; i < channels.Length; i++)
                {
                    eyesen.EquipControl(iotype, dongNumber, channels[i], command);
                }
            }
            ;
        }
    }