Просмотр исходного кода

Merge branch 'master' of dtelenkov:Home/codewars

dtelenkov 20 часов назад
Родитель
Сommit
0860707b1a

+ 909 - 0
c/test/bt6711.c

@@ -0,0 +1,909 @@
+
+
+
+void ups_model_response(char *data)
+{
+    uint8_t j = 0;
+    char value[20];
+    uint8_t len = 0;
+    DBG printf("ups_akb_info_response: %s\r\n", data);
+    if (data[0] != '(') {
+        return;
+    }
+    DBG printf("ups_akb_info_parser_start\r\n");
+    UPS.Present = UPS_CONNECTED;
+    UPS.Flag_Present = true;
+    UPS.cnt_err_ups = 0;
+
+    data++;
+
+    DBG printf("UPS ups_akb_info_parser_start: %s\r\n", data);
+
+    memset(value, 0, 20);
+    if (UPS.model[0] == 0) {
+        for (uint8_t i = 0; i < VOLTRONIC_MODEL_LENGTH; i ++) {
+            if (data[i] != '#') {
+                value[j] = data[i];
+                j ++;
+            }
+        }
+        if(strncmp(value, "WPHV", 4) == 0 || strncmp(value, "G2", 2) == 0 || value[0] == 0) {
+#if HARDWARE_BT6711_V1
+            if(UPS.serial[0] == 0) {
+                return;
+            }
+            if(strncmp(value, "WPHVR2K0L", 9) == 0) {
+                strcpy(UPS.model, "RTMP-II v1rih");
+                flag_WPHVR2K0L = true;
+            } else if(strncmp(UPS.serial, "83122103100051", 14) == 0) {
+                strcpy(UPS.model, "RTMP-II v0hi v1");
+                //flag_WPHVR2K0L = true;
+            }
+            else
+#endif
+#if HARDWARE_BT6709_MTS || HARDWARE_BT6710
+            if(UPS.serial[0] == 0) {
+                return;
+            }
+            if(strncmp(value, "WPHVR3K0", 8) == 0) {
+                strcpy(UPS.model, "RTMP-II v3r");
+            } else if(strncmp(value, "WPHVR2K0", 8) == 0) {
+                strcpy(UPS.model, "RTMP-II v2r");
+            } else if(strncmp(value, "WPHVR1K0", 8) == 0) {
+                strcpy(UPS.model, "RTMP-II r");
+            } else
+#endif
+            {
+                strcpy(UPS.model, "RTMP-II");
+            }
+        } else {
+#ifdef HARDWARE_BT6709
+            if(UPS.serial[0] == 0) {
+                return;
+            }
+            if(strncmp(UPS.serial, "83122104100", 11) == 0) {
+                char str[15];
+                strncpy(str, &UPS.serial[11], 3);
+                int32_t tmp = atoi(str);
+                if (tmp >= 281 && tmp <= 770) {
+                    strcpy(UPS.model, "RTMP-II hi");
+                } else {
+                    len = strlen(value);
+                    strncpy(UPS.model, value, len);
+                }
+            } else
+#endif
+#if HARDWARE_BT6709_MTS || HARDWARE_BT6710
+            if(strncmp(value, "RTMP-II v", 9) == 0 || strncmp(value, "RTMP-IIv", 8) == 0) {
+                strcpy(UPS.model, "RTMP-II r");
+            } else
+#endif
+            {
+                len = strlen(value);
+                strncpy(UPS.model, value, len);
+                printf("%s","\r\n~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
+                printf("UPS.model: %s\r\n", UPS.model);
+                printf("%s", "\r\n~~~~~~~~~~~~~~~~~~~~~~~~\r\n");
+            }
+        }
+ #if HARDWARE_BT6711_V1       
+        if(UPS.serial[0] == 0) {
+            memset(UPS.model, 0, sizeof(UPS.model));
+            return;
+        }
+        if(strncmp(UPS.serial, "83122103100051", 14) == 0) {
+            strcpy(UPS.model, "RTMP-II v0hi v1");
+            //flag_WPHVR2K0L = true;
+        } else if (strncmp(UPS.serial, "83122204100", 11) == 0) {
+            char str[15];
+            strncpy(str, &UPS.serial[11], 3);
+            int32_t tmp = atoi(str);
+            if (tmp >= 139 && tmp <= 938) {
+                strcpy(UPS.model, "RTMP-II v0hi v1");
+            } 
+        }
+#endif
+        SNMP_SetObjDescr();
+        data += (VOLTRONIC_MODEL_LENGTH + 1);
+        memset(value, 0, sizeof(value));
+        j = 0;
+        for (uint8_t i = 0; i < VOLTRONIC_OUTPUT_RATED_LENGTH; i ++) {
+            if (data[i] != '#') {
+                value[j] = data[i];
+                j ++;
+            }
+        }
+        float temp_value = atof(value);
+        if (sSettings.UPS_Setting.ups_power != temp_value) {
+            sSettings.UPS_Setting.ups_power = temp_value;
+            SETTINGS_Save();
+        }
+    } else {
+        return;
+    }
+}
+
+// -------------------------------------------------------------------------- //
+
+{
+            {
+                len = strlen(value);
+                strncpy(UPS.model, value, len);
+            }
+        }
+
+// -------------------------------------------------------------------------- //
+
+
+ups_akb_info_response: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+
+
+
+
+
+
+S raw data len: 5
+ups_akb_info_response: (NAK
+ups_akb_info_parser_start
+MegaTecCMD: QID
+UPS raw data: (83122212505755
+UPS raw data: (83122212505755
+UPS raw data len: 16
+ups_serialresponse: (83122212505755
+ups_serial_parser_start
+UPS ups_serial_parser_start: 83122212505755
+UPS parameter: 83122212505755
+MegaTecCMD: QWS
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data len: 66
+MegaTecCMD: QPI
+UPS raw data: (PI01
+UPS raw data: (PI01
+UPS raw data len: 6
+ups_protocol_id_response: (PI01
+UPS ups_protocol_id_parser_start: PI01
+MegaTecCMD: QTPR
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data len: 25
+MegaTecCMD: Q1
+UPS raw data: (224.3 224.9 219.4 000 50.0 0.00 26.8 01000000
+UPS raw data: (224.3 224.9 219.4 000 50.0 0.00 26.8 01000000
+UPS raw data len: 47
+ups_status_response: (224.3 224.9 219.4 000 50.0 0.00 26.8 01000000
+ups_status_parser_start
+UPS ups_status_parser_startr: 224.3 224.9 219.4 000 50.0 0.00 26.8 01000000
+UPS parameter: 224.3
+UPS parameter: 224.9
+UPS parameter: 219.4
+UPS parameter: 000
+UPS parameter: 50.0
+UPS parameter: 0.00
+UPS parameter: 26.8
+UPS parameter: 01000000
+MegaTecCMD: QBV
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data len: 23
+ups_akb_info_response: (000.0 03 05 000 00001
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: 000.0 03 05 000 00001
+UPS parameter: 000.0
+UPS parameter: 03
+UPS parameter: 05
+UPS parameter: 000
+UPS parameter: 00001
+MegaTecCMD: QMD
+stm32_temperature 24.1
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data len: 48
+ups_akb_info_response: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+MegaTecCMD: QMOD
+UPS raw data: (L
+UPS raw data: (L
+UPS raw data len: 3
+ups_serialresponse: (L
+ups_serial_parser_start
+UPS ups_mode_parser_start: L
+MegaTecCMD: QVFW
+UPS raw data: (VERFW:03420.0801
+UPS raw data: (VERFW:03420.0801
+UPS raw data len: 18
+ups_akb_info_response: (VERFW:03420.0801
+ups_akb_info_parser_start
+UPS parameter: VERFW
+UPS ups_akb_info_parser_start: 03420.0801
+UPS parameter: 03420.0801
+MegaTecCMD: QVFW2
+UPS raw data: (NAK
+UPS raw data: (NAK
+UPS raw data len: 5
+ups_akb_info_response: (NAK
+ups_akb_info_parser_start
+MegaTecCMD: QID
+UPS raw data: (83122212505755
+UPS raw data: (83122212505755
+UPS raw data len: 16
+ups_serialresponse: (83122212505755
+ups_serial_parser_start
+UPS ups_serial_parser_start: 83122212505755
+UPS parameter: 83122212505755
+MegaTecCMD: QWS
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data len: 66
+MegaTecCMD: QPI
+UPS raw data: (PI01
+UPS raw data: (PI01
+UPS raw data len: 6
+ups_protocol_id_response: (PI01
+UPS ups_protocol_id_parser_start: PI01
+MegaTecCMD: QTPR
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data len: 25
+MegaTecCMD: Q1
+stm32_temperature 25.4
+UPS raw data: (224.9 225.2 219.5 001 50.0 0.00 26.7 01000000
+UPS raw data: (224.9 225.2 219.5 001 50.0 0.00 26.7 01000000
+UPS raw data len: 47
+ups_status_response: (224.9 225.2 219.5 001 50.0 0.00 26.7 01000000
+ups_status_parser_start
+UPS ups_status_parser_startr: 224.9 225.2 219.5 001 50.0 0.00 26.7 01000000
+UPS parameter: 224.9
+UPS parameter: 225.2
+UPS parameter: 219.5
+UPS parameter: 001
+UPS parameter: 50.0
+UPS parameter: 0.00
+UPS parameter: 26.7
+UPS parameter: 01000000
+MegaTecCMD: QBV
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data len: 23
+ups_akb_info_response: (000.0 03 05 000 00001
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: 000.0 03 05 000 00001
+UPS parameter: 000.0
+UPS parameter: 03
+UPS parameter: 05
+UPS parameter: 000
+UPS parameter: 00001
+MegaTecCMD: QMD
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data len: 48
+ups_akb_info_response: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0 (RTMP-II v0hi v1)
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+MegaTecCMD: QMOD
+UPS raw data: (L
+UPS raw data: (L
+UPS raw data len: 3
+ups_serialresponse: (L
+ups_serial_parser_start
+UPS ups_mode_parser_start: L
+MegaTecCMD: QVFW
+UPS raw data: (VERFW:03420.0801
+UPS raw data: (VERFW:03420.0801
+UPS raw data len: 18
+ups_akb_info_response: (VERFW:03420.0801
+ups_akb_info_parser_start
+UPS parameter: VERFW
+UPS ups_akb_info_parser_start: 03420.0801
+UPS parameter: 03420.0801
+MegaTecCMD: QVFW2
+UPS raw data: (NAK
+UPS raw data: (NAK
+UPS raw data len: 5
+ups_akb_info_response: (NAK
+ups_akb_info_parser_start
+MegaTecCMD: QID
+UPS raw data: (83122212505755
+UPS raw data: (83122212505755
+UPS raw data len: 16
+ups_serialresponse: (83122212505755
+ups_serial_parser_start
+UPS ups_serial_parser_start: 83122212505755
+UPS parameter: 83122212505755
+MegaTecCMD: QWS
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data len: 66
+MegaTecCMD: QPI
+UPS raw data: (PI01
+UPS raw data: (PI01
+UPS raw data len: 6
+ups_protocol_id_response: (PI01
+UPS ups_protocol_id_parser_start: PI01
+stm32_temperature 28.3
+MegaTecCMD: QTPR
+UPS raw data: (026.7 030.7 030.2 ---.-
+UPS raw data: (026.7 030.7 030.2 ---.-
+UPS raw data len: 25
+MegaTecCMD: Q1
+UPS raw data: (224.2 224.8 219.7 000 50.0 0.00 26.8 01000000
+UPS raw data: (224.2 224.8 219.7 000 50.0 0.00 26.8 01000000
+UPS raw data len: 47
+ups_status_response: (224.2 224.8 219.7 000 50.0 0.00 26.8 01000000
+ups_status_parser_start
+UPS ups_status_parser_startr: 224.2 224.8 219.7 000 50.0 0.00 26.8 01000000
+UPS parameter: 224.2
+UPS parameter: 224.8
+UPS parameter: 219.7
+UPS parameter: 000
+UPS parameter: 50.0
+UPS parameter: 0.00
+UPS parameter: 26.8
+UPS parameter: 01000000
+MegaTecCMD: QBV
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data len: 23
+ups_akb_info_response: (000.0 03 05 000 00001
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: 000.0 03 05 000 00001
+UPS parameter: 000.0
+UPS parameter: 03
+UPS parameter: 05
+UPS parameter: 000
+UPS parameter: 00001
+MegaTecCMD: QMD
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data len: 48
+ups_akb_info_response: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+MegaTecCMD: QMOD
+UPS raw data: (L
+UPS raw data: (L
+UPS raw data len: 3
+ups_serialresponse: (L
+ups_serial_parser_start
+UPS ups_mode_parser_start: L
+MegaTecCMD: QVFW
+UPS raw data: (VERFW:03420.0801
+UPS raw data: (VERFW:03420.0801
+UPS raw data len: 18
+ups_akb_info_response: (VERFW:03420.0801
+ups_akb_info_parser_start
+UPS parameter: VERFW
+UPS ups_akb_info_parser_start: 03420.0801
+UPS parameter: 03420.0801
+MegaTecCMD: QVFW2
+UPS raw data: (NAK
+UPS raw data: (NAK
+UPS raw data len: 5
+ups_akb_info_response: (NAK
+ups_akb_info_parser_start
+MegaTecCMD: QID
+UPS raw data: (83122212505755
+stm32_temperature 24.7
+UPS raw data: (83122212505755
+UPS raw data len: 16
+ups_serialresponse: (83122212505755
+ups_serial_parser_start
+UPS ups_serial_parser_start: 83122212505755
+UPS parameter: 83122212505755
+MegaTecCMD: QWS
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data len: 66
+MegaTecCMD: QPI
+UPS raw data: (PI01
+UPS raw data: (PI01
+UPS raw data len: 6
+ups_protocol_id_response: (PI01
+UPS ups_protocol_id_parser_start: PI01
+MegaTecCMD: QTPR
+UPS raw data: (026.7 030.7 030.2 ---.-
+UPS raw data: (026.7 030.7 030.2 ---.-
+UPS raw data len: 25
+MegaTecCMD: Q1
+UPS raw data: (225.3 225.7 219.8 000 50.0 0.00 26.8 01000000
+UPS raw data: (225.3 225.7 219.8 000 50.0 0.00 26.8 01000000
+UPS raw data len: 47
+ups_status_response: (225.3 225.7 219.8 000 50.0 0.00 26.8 01000000
+ups_status_parser_start
+UPS ups_status_parser_startr: 225.3 225.7 219.8 000 50.0 0.00 26.8 01000000
+UPS parameter: 225.3
+UPS parameter: 225.7
+UPS parameter: 219.8
+UPS parameter: 000
+UPS parameter: 50.0
+UPS parameter: 0.00
+UPS parameter: 26.8
+UPS parameter: 01000000
+MegaTecCMD: QBV
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data len: 23
+ups_akb_info_response: (000.0 03 05 000 00001
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: 000.0 03 05 000 00001
+UPS parameter: 000.0
+UPS parameter: 03
+UPS parameter: 05
+UPS parameter: 000
+UPS parameter: 00001
+MegaTecCMD: QMD
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data len: 48
+ups_akb_info_response: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+MegaTecCMD: stm32_tempeQMOD
+rature 30.9
+UPS raw data: (L
+UPS raw data: (L
+UPS raw data len: 3
+ups_serialresponse: (L
+ups_serial_parser_start
+UPS ups_mode_parser_start: L
+MegaTecCMD: QVFW
+UPS raw data: (VERFW:03420.0801
+UPS raw data: (VERFW:03420.0801
+UPS raw data len: 18
+ups_akb_info_response: (VERFW:03420.0801
+ups_akb_info_parser_start
+UPS parameter: VERFW
+UPS ups_akb_info_parser_start: 03420.0801
+UPS parameter: 03420.0801
+MegaTecCMD: QVFW2
+UPS raw data: (NAK
+UPS raw data: (NAK
+UPS raw data len: 5
+ups_akb_info_response: (NAK
+ups_akb_info_parser_start
+MegaTecCMD: QID
+UPS raw data: (83122212505755
+UPS raw data: (83122212505755
+UPS raw data len: 16
+ups_serialresponse: (83122212505755
+ups_serial_parser_start
+UPS ups_serial_parser_start: 83122212505755
+UPS parameter: 83122212505755
+MegaTecCMD: QWS
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data len: 66
+MegaTecCMD: QPI
+UPS raw data: (PI01
+UPS raw data: (PI01
+UPS raw data len: 6
+ups_protocol_id_response: (PI01
+UPS ups_protocol_id_parser_start: PI01
+MegaTecCMD: QTPR
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data len: 25
+MegaTecCMD: Q1
+stm32_temperature 25.7
+UPS raw data: (225.2 225.3 219.3 000 50.0 0.00 26.8 01000000
+UPS raw data: (225.2 225.3 219.3 000 50.0 0.00 26.8 01000000
+UPS raw data len: 47
+ups_status_response: (225.2 225.3 219.3 000 50.0 0.00 26.8 01000000
+ups_status_parser_start
+UPS ups_status_parser_startr: 225.2 225.3 219.3 000 50.0 0.00 26.8 01000000
+UPS parameter: 225.2
+UPS parameter: 225.3
+UPS parameter: 219.3
+UPS parameter: 000
+UPS parameter: 50.0
+UPS parameter: 0.00
+UPS parameter: 26.8
+UPS parameter: 01000000
+MegaTecCMD: QBV
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data len: 23
+ups_akb_info_response: (000.0 03 05 000 00001
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: 000.0 03 05 000 00001
+UPS parameter: 000.0
+UPS parameter: 03
+UPS parameter: 05
+UPS parameter: 000
+UPS parameter: 00001
+MegaTecCMD: QMD
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data len: 48
+ups_akb_info_response: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+MegaTecCMD: QMOD
+UPS raw data: (L
+UPS raw data: (L
+UPS raw data len: 3
+ups_serialresponse: (L
+ups_serial_parser_start
+UPS ups_mode_parser_start: L
+MegaTecCMD: QVFW
+UPS raw data: (VERFW:03420.0801
+UPS raw data: (VERFW:03420.0801
+UPS raw data len: 18
+ups_akb_info_response: (VERFW:03420.0801
+ups_akb_info_parser_start
+UPS parameter: VERFW
+UPS ups_akb_info_parser_start: 03420.0801
+UPS parameter: 03420.0801
+MegaTecCMD: QVFW2
+UPS raw data: (NAK
+UPS raw data: (NAK
+UPS raw data len: 5
+ups_akb_info_response: (NAK
+ups_akb_info_parser_start
+MegaTecCMD: QID
+UPS raw data: (83122212505755
+UPS raw data: (83122212505755
+UPS raw data len: 16
+ups_serialresponse: (83122212505755
+ups_serial_parser_start
+UPS ups_serial_parser_start: 83122212505755
+UPS parameter: 83122212505755
+MegaTecCMD: QWS
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data len: 66
+MegaTecCMD: QPI
+UPS raw data: (PI01
+UPS raw data: (PI01
+UPS raw data len: 6
+ups_protocol_id_response: (PI01
+UPS ups_protocol_id_parser_start: PI01
+stm32_temperature 26.0
+MegaTecCMD: QTPR
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data len: 25
+MegaTecCMD: Q1
+UPS raw data: (225.1 225.2 220.1 000 50.0 0.00 26.8 01000000
+UPS raw data: (225.1 225.2 220.1 000 50.0 0.00 26.8 01000000
+UPS raw data len: 47
+ups_status_response: (225.1 225.2 220.1 000 50.0 0.00 26.8 01000000
+ups_status_parser_start
+UPS ups_status_parser_startr: 225.1 225.2 220.1 000 50.0 0.00 26.8 01000000
+UPS parameter: 225.1
+UPS parameter: 225.2
+UPS parameter: 220.1
+UPS parameter: 000
+UPS parameter: 50.0
+UPS parameter: 0.00
+UPS parameter: 26.8
+UPS parameter: 01000000
+MegaTecCMD: QBV
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data len: 23
+ups_akb_info_response: (000.0 03 05 000 00001
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: 000.0 03 05 000 00001
+UPS parameter: 000.0
+UPS parameter: 03
+UPS parameter: 05
+UPS parameter: 000
+UPS parameter: 00001
+MegaTecCMD: QMD
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data len: 48
+ups_akb_info_response: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+MegaTecCMD: QMOD
+UPS raw data: (L
+UPS raw data: (L
+UPS raw data len: 3
+ups_serialresponse: (L
+ups_serial_parser_start
+UPS ups_mode_parser_start: L
+MegaTecCMD: QVFW
+UPS raw data: (VERFW:03420.0801
+UPS raw data: (VERFW:03420.0801
+UPS raw data len: 18
+ups_akb_info_response: (VERFW:03420.0801
+ups_akb_info_parser_start
+UPS parameter: VERFW
+UPS ups_akb_info_parser_start: 03420.0801
+UPS parameter: 03420.0801
+MegaTecCMD: QVFW2
+UPS raw data: (NAK
+UPS raw data: (NAK
+UPS raw data len: 5
+ups_akb_info_response: (NAK
+ups_akb_info_parser_start
+MegaTecCMD: QID
+UPS raw data: (83122212505755
+stm32_temperature 25.7
+UPS raw data: (83122212505755
+UPS raw data len: 16
+ups_serialresponse: (83122212505755
+ups_serial_parser_start
+UPS ups_serial_parser_start: 83122212505755
+UPS parameter: 83122212505755
+MegaTecCMD: QWS
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data len: 66
+MegaTecCMD: QPI
+UPS raw data: (PI01
+UPS raw data: (PI01
+UPS raw data len: 6
+ups_protocol_id_response: (PI01
+UPS ups_protocol_id_parser_start: PI01
+MegaTecCMD: QTPR
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data len: 25
+MegaTecCMD: Q1
+UPS raw data: (225.2 225.2 219.4 001 50.0 0.00 26.8 01000000
+UPS raw data: (225.2 225.2 219.4 001 50.0 0.00 26.8 01000000
+UPS raw data len: 47
+ups_status_response: (225.2 225.2 219.4 001 50.0 0.00 26.8 01000000
+ups_status_parser_start
+UPS ups_status_parser_startr: 225.2 225.2 219.4 001 50.0 0.00 26.8 01000000
+UPS parameter: 225.2
+UPS parameter: 225.2
+UPS parameter: 219.4
+UPS parameter: 001
+UPS parameter: 50.0
+UPS parameter: 0.00
+UPS parameter: 26.8
+UPS parameter: 01000000
+MegaTecCMD: QBV
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data len: 23
+ups_akb_info_response: (000.0 03 05 000 00001
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: 000.0 03 05 000 00001
+UPS parameter: 000.0
+UPS parameter: 03
+UPS parameter: 05
+UPS parameter: 000
+UPS parameter: 00001
+MegaTecCMD: QMD
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data len: 48
+ups_akb_info_response: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+MegaTecCMD: QMOD
+UPS raw data: (L
+stm32_temperature 30.2
+UPS raw data: (L
+UPS raw data len: 3
+ups_serialresponse: (L
+ups_serial_parser_start
+UPS ups_mode_parser_start: L
+MegaTecCMD: QVFW
+UPS raw data: (VERFW:03420.0801
+UPS raw data: (VERFW:03420.0801
+UPS raw data len: 18
+ups_akb_info_response: (VERFW:03420.0801
+ups_akb_info_parser_start
+UPS parameter: VERFW
+UPS ups_akb_info_parser_start: 03420.0801
+UPS parameter: 03420.0801
+MegaTecCMD: QVFW2
+UPS raw data: (NAK
+UPS raw data: (NAK
+UPS raw data len: 5
+ups_akb_info_response: (NAK
+ups_akb_info_parser_start
+MegaTecCMD: QID
+UPS raw data: (83122212505755
+UPS raw data: (83122212505755
+UPS raw data len: 16
+ups_serialresponse: (83122212505755
+ups_serial_parser_start
+UPS ups_serial_parser_start: 83122212505755
+UPS parameter: 83122212505755
+MegaTecCMD: QWS
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data len: 66
+MegaTecCMD: QPI
+UPS raw data: (PI01
+UPS raw data: (PI01
+UPS raw data len: 6
+ups_protocol_id_response: (PI01
+UPS ups_protocol_id_parser_start: PI01
+MegaTecCMD: QTPR
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data len: 25
+MegaTecCMD: Q1
+UPS raw data: (224.3 224.6 219.3 000 50.0 0.00 26.8 01000000
+stm32_temperature 24.7
+UPS raw data: (224.3 224.6 219.3 000 50.0 0.00 26.8 01000000
+UPS raw data len: 47
+ups_status_response: (224.3 224.6 219.3 000 50.0 0.00 26.8 01000000
+ups_status_parser_start
+UPS ups_status_parser_startr: 224.3 224.6 219.3 000 50.0 0.00 26.8 01000000
+UPS parameter: 224.3
+UPS parameter: 224.6
+UPS parameter: 219.3
+UPS parameter: 000
+UPS parameter: 50.0
+UPS parameter: 0.00
+UPS parameter: 26.8
+UPS parameter: 01000000
+MegaTecCMD: QBV
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data len: 23
+ups_akb_info_response: (000.0 03 05 000 00001
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: 000.0 03 05 000 00001
+UPS parameter: 000.0
+UPS parameter: 03
+UPS parameter: 05
+UPS parameter: 000
+UPS parameter: 00001
+MegaTecCMD: QMD
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data len: 48
+ups_akb_info_response: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+MegaTecCMD: QMOD
+UPS raw data: (L
+UPS raw data: (L
+UPS raw data len: 3
+ups_serialresponse: (L
+ups_serial_parser_start
+UPS ups_mode_parser_start: L
+MegaTecCMD: QVFW
+UPS raw data: (VERFW:03420.0801
+UPS raw data: (VERFW:03420.0801
+UPS raw data len: 18
+ups_akb_info_response: (VERFW:03420.0801
+ups_akb_info_parser_start
+UPS parameter: VERFW
+UPS ups_akb_info_parser_start: 03420.0801
+UPS parameter: 03420.0801
+MegaTecCMD: QVFW2
+UPS raw data: (NAK
+UPS raw data: (NAK
+UPS raw data len: 5
+ups_akb_info_response: (NAK
+ups_akb_info_parser_start
+MegaTecCMD: QID
+UPS raw data: (83122212505755
+UPS raw data: (83122212505755
+UPS raw data len: 16
+ups_serialresponse: (83122212505755
+ups_serial_parser_start
+UPS ups_serial_parser_start: 83122212505755
+UPS parameter: 83122212505755
+MegaTecCMD: QWS
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data len: 66
+MegaTecCMD: QPI
+UPS raw data: (PI01
+UPS raw data: (PI01
+UPS raw data len: 6
+ups_protocol_id_response: (PI01
+UPS ups_protocol_id_parser_start: PI01
+stm32_temperature 30.6
+MegaTecCMD: QTPR
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data len: 25
+MegaTecCMD: Q1
+UPS raw data: (225.0 224.9 219.5 000 50.0 0.00 26.8 01000000
+UPS raw data: (225.0 224.9 219.5 000 50.0 0.00 26.8 01000000
+UPS raw data len: 47
+ups_status_response: (225.0 224.9 219.5 000 50.0 0.00 26.8 01000000
+ups_status_parser_start
+UPS ups_status_parser_startr: 225.0 224.9 219.5 000 50.0 0.00 26.8 01000000
+UPS parameter: 225.0
+UPS parameter: 224.9
+UPS parameter: 219.5
+UPS parameter: 000
+UPS parameter: 50.0
+UPS parameter: 0.00
+UPS parameter: 26.8
+UPS parameter: 01000000
+MegaTecCMD: QBV
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data len: 23
+ups_akb_info_response: (000.0 03 05 000 00001
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: 000.0 03 05 000 00001
+UPS parameter: 000.0
+UPS parameter: 03
+UPS parameter: 05
+UPS parameter: 000
+UPS parameter: 00001
+MegaTecCMD: QMD
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+UPS raw data len: 48
+ups_akb_info_response: (RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: RTMP-II v0hi v1 ###1000 90 1/1 220 220 03 12.0
+MegaTecCMD: QMOD
+UPS raw data: (L
+UPS raw data: (L
+UPS raw data len: 3
+ups_serialresponse: (L
+ups_serial_parser_start
+UPS ups_mode_parser_start: L
+MegaTecCMD: QVFW
+UPS raw data: (VERFW:03420.0801
+UPS raw data: (VERFW:03420.0801
+UPS raw data len: 18
+ups_akb_info_response: (VERFW:03420.0801
+ups_akb_info_parser_start
+UPS parameter: VERFW
+UPS ups_akb_info_parser_start: 03420.0801
+UPS parameter: 03420.0801
+MegaTecCMD: QVFW2
+UPS raw data: (NAK
+UPS raw data: (NAK
+UPS raw data len: 5
+ups_akb_info_response: (NAK
+ups_akb_info_parser_start
+MegaTecCMD: QID
+UPS raw data: (83122212505755
+UPS raw data: (83122212505755
+UPS raw data len: 16
+ups_serialresponse: (83122212505755
+ups_serial_parser_start
+UPS ups_serial_parser_start: 83122212505755
+UPS parameter: 83122212505755
+MegaTecCMD: QWS
+stm32_temperature 25.7
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data: (1000000000000000000000000000000000000000000000000000000000000000
+UPS raw data len: 66
+MegaTecCMD: QPI
+UPS raw data: (PI01
+UPS raw data: (PI01
+UPS raw data len: 6
+ups_protocol_id_response: (PI01
+UPS ups_protocol_id_parser_start: PI01
+MegaTecCMD: QTPR
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data: (026.8 030.7 030.2 ---.-
+UPS raw data len: 25
+MegaTecCMD: Q1
+UPS raw data: (224.9 224.8 219.2 000 50.0 0.00 26.8 01000000
+UPS raw data: (224.9 224.8 219.2 000 50.0 0.00 26.8 01000000
+UPS raw data len: 47
+ups_status_response: (224.9 224.8 219.2 000 50.0 0.00 26.8 01000000
+ups_status_parser_start
+UPS ups_status_parser_startr: 224.9 224.8 219.2 000 50.0 0.00 26.8 01000000
+UPS parameter: 224.9
+UPS parameter: 224.8
+UPS parameter: 219.2
+UPS parameter: 000
+UPS parameter: 50.0
+UPS parameter: 0.00
+UPS parameter: 26.8
+UPS parameter: 01000000
+MegaTecCMD: QBV
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data: (000.0 03 05 000 00001
+UPS raw data len: 23
+ups_akb_info_response: (000.0 03 05 000 00001
+ups_akb_info_parser_start
+UPS ups_akb_info_parser_start: 000.0 03 05 000 00001
+UPS parameter: 000.0
+UPS parameter: 03
+UPS parameter: 05
+UPS parameter: 000

+ 3 - 0
go/modbus/go.mod

@@ -0,0 +1,3 @@
+module modbus
+
+go 1.24.1

+ 9 - 0
go/modbus/internal/client.go

@@ -0,0 +1,9 @@
+package client
+
+import (
+	"fmt"
+)
+
+func Hello() {
+	fmt.Println("Hello from glient.go")
+}

+ 11 - 0
go/modbus/main.go

@@ -0,0 +1,11 @@
+package main
+
+import (
+	"fmt"
+	client "modbus/internal"
+)
+
+func main() {
+	fmt.Println("Hello from main!")
+	client.Hello()
+}

+ 14 - 0
go/modbus/test1.go

@@ -0,0 +1,14 @@
+/*
+package main
+
+import (
+	"github.com/simonvetter/modubs"
+)
+
+func main() {
+	var client *modubs.ModbusClient
+	var err error
+
+	client, err = modbus.NewClient(&modubs.ClientConfigureation{})
+}
+*/

+ 36 - 0
go/stepik/course_2/condition/cond.go

@@ -0,0 +1,36 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+)
+
+func main() {
+	// odd()
+	password()
+}
+
+func odd() {
+	var val int
+	fmt.Scan(&val)
+	if val%2 == 0 {
+		fmt.Println("YES")
+	} else {
+		fmt.Println("NO")
+	}
+}
+
+func password() {
+	var s1, s2 string
+	scanner := bufio.NewScanner(os.Stdin)
+	scanner.Scan()
+	s1 = scanner.Text()
+	scanner.Scan()
+	s2 = scanner.Text()
+	if s1 == s2 {
+		fmt.Println("Пароль принят")
+	} else {
+		fmt.Println("Пароль не принят")
+	}
+}

+ 36 - 0
go/stepik/course_2/condition/main.go

@@ -0,0 +1,36 @@
+package main
+
+import (
+	"fmt"
+)
+
+func main() {
+	month()
+	/*
+		var month int
+		fmt.Scan(&month)
+		switch month {
+		case 1, 3, 5, 7, 8, 10, 12:
+			fmt.Println(31)
+		case 4, 6, 9, 11:
+			fmt.Println(30)
+		case 2:
+			fmt.Println(29)
+		}
+	*/
+}
+
+func month() {
+	var month int
+	fmt.Scan(&month)
+	switch month {
+	case 12, 1, 2:
+		fmt.Print("Зима")
+	case 3, 4, 5:
+		fmt.Print("Весна")
+	case 6, 7, 8:
+		fmt.Print("Лето")
+	case 9, 10, 11:
+		fmt.Print("Осень")
+	}
+}

+ 45 - 0
go/stepik/course_2/cycle/cycle1.go

@@ -0,0 +1,45 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+	"strconv"
+)
+
+func main() {
+	// foo1()
+	// foo2()
+	foo3()
+}
+
+func foo1() {
+	scanner := bufio.NewScanner(os.Stdin)
+	scanner.Scan()
+	s := scanner.Text()
+	scanner.Scan()
+	cnt, _ := strconv.Atoi(scanner.Text())
+
+	for i := 0; i < cnt; i++ {
+		fmt.Println(s)
+	}
+}
+
+func foo2() {
+	var rating, amount int
+	s := 0
+
+	for i := 0; i < 4; i++ {
+		fmt.Scan(&amount)
+		fmt.Scan(&rating)
+		s += rating * amount
+	}
+
+	fmt.Println(s)
+}
+
+func foo3() {
+	for i := -25; i <= 25; i++ {
+		fmt.Println(i)
+	}
+}

+ 121 - 0
go/stepik/course_2/slice/slice.go

@@ -0,0 +1,121 @@
+package main
+
+import (
+	"fmt"
+)
+
+func main() {
+	// foo1()
+	// foo2()
+	// foo3()
+	// maximum()
+	// foo4()
+	foo5()
+}
+
+func foo1() {
+	var cnt, val int
+	var s []int
+	fmt.Scan(&cnt)
+
+	for i := 0; i < cnt; i++ {
+		fmt.Scan(&val)
+		s = append(s, val)
+	}
+
+	fmt.Println(s)
+}
+
+// Ввод слайса
+func foo2() {
+	var n int
+	fmt.Scan(&n)
+
+	buf := make([]int, n)
+
+	for i := 0; i < n; i++ {
+		fmt.Scan(&buf[i])
+	}
+
+	for i := 0; i < n; i++ {
+		if i%3 == 0 {
+			fmt.Print(buf[i], " ")
+		}
+	}
+
+	// fmt.Println(buf)
+}
+
+func foo3() {
+	var n int
+	fmt.Scan(&n)
+
+	buf := make([]int, n)
+
+	for i := 0; i < n; i++ {
+		fmt.Scan(&buf[i])
+	}
+
+	for i := 0; i < n; i++ {
+		if buf[i]%3 == 0 {
+			fmt.Print(buf[i], " ")
+		}
+	}
+}
+
+func maximum() {
+	var n int
+	fmt.Scan(&n)
+
+	numbers := make([]int, n)
+	for i := 0; i < n; i++ {
+		fmt.Scan(&numbers[i])
+	}
+
+	max := numbers[0]
+	maxIndex := 0
+
+	for i := 0; i < n; i++ {
+		if numbers[i] > max {
+			max = numbers[i]
+			maxIndex = i
+		}
+	}
+
+	fmt.Println(max)
+	fmt.Println(maxIndex)
+}
+
+func foo4() {
+	// [строки][столбцы]
+	a := [2][2]string{
+		{"a[0][0]", "a[0][1]"},
+		{"a[1][0]", "a[1][1]"},
+	}
+
+	fmt.Println(a)
+
+	// двумерный слайс чере make
+	s := make([][]int, 2)  // 2 строки
+	s[0] = make([]int, 2)  // 5 столбцов в первой строке
+	s[1] = make([]int, 10) // 10 столбцов во второй строке
+}
+
+func foo5() {
+	numbers := [][]int{
+		{1, 2, 3},
+		{4, 5, 6},
+		{7, 8, 9},
+	}
+
+	rows := 3
+	cols := 3
+
+	for i := 0; i < rows; i++ {
+		fmt.Printf("Строка %d: ", i+1)
+		for j := 0; j < cols; j++ {
+			fmt.Print(numbers[i][j], " ")
+		}
+		fmt.Println()
+	}
+}

+ 217 - 0
go/stepik/course_2/strings/strings.go

@@ -0,0 +1,217 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+	"strings"
+	"time"
+)
+
+func main() {
+	// foo1()
+	// foo2()
+	// foo3()
+	// foo4()
+	// foo5()
+	// foo6()
+	// foo7()
+	// foo8()
+	// foo9()
+	// foo10()
+	foo12()
+}
+
+func foo1() {
+	var val rune
+	fmt.Scanf("%c", &val)
+	// fmt.Println(string(val))
+	if val >= '0' && val <= '9' {
+		fmt.Println("YES")
+	} else {
+		fmt.Println("NO")
+	}
+}
+
+func foo2() {
+	var val rune
+	fmt.Scanf("%c", &val)
+
+	for letter := 'a'; letter <= val; letter++ {
+		fmt.Print(string(letter), " ")
+	}
+}
+
+func foo3() {
+	var val rune
+	fmt.Scanf("%c", &val)
+
+	for letter := val; letter <= 'z'; letter++ {
+		fmt.Print(string(letter), " ")
+	}
+}
+
+func foo4() {
+	var val rune
+	fmt.Scanf("%c", &val)
+
+	if val >= 'A' && val <= 'Z' {
+		fmt.Print(string(val + 32))
+	} else if val >= 'a' && val <= 'z' {
+		fmt.Print(string(val - 32))
+	}
+}
+
+func foo5() {
+	var name string
+	var price float64
+	var amount int
+
+	fmt.Scan(&name, &price, &amount)
+
+	fmt.Printf("Стоимость %s: %g * %d = %g руб.", name, price, amount, price*float64(amount))
+}
+
+func foo6() {
+	scanner := bufio.NewScanner(os.Stdin)
+	scanner.Scan()
+	str := scanner.Text()
+	fmt.Println(strings.Count(str, " ") + 1)
+}
+
+// -----------------------------------------------------
+
+func foo7() {
+	var str string
+	fmt.Scan(&str)
+	s := []rune(str)
+	for i := len(s) - 1; i >= 0; i-- {
+		fmt.Print(string(s[i]))
+	}
+}
+
+// Функция с использованием defer
+func reverseWithDefer(s string) {
+	for _, val := range s {
+		defer func(v rune) {
+			_ = string(v) // вместо вывода
+		}(val)
+	}
+}
+
+// Функция проход с конца
+func reverseWithAccumulation(s string) {
+	for i := len(s) - 1; i >= 0; i-- {
+		_ = string(s[i]) // вместо вывода
+	}
+}
+
+func testSpeed(s string) {
+	start := time.Now()
+	reverseWithDefer(s)
+	durationDefer := time.Since(start)
+	fmt.Println(durationDefer)
+}
+
+// -----------------------------------------------------
+
+func foo8() {
+	/*
+		var position int
+		scanner := bufio.NewScanner(os.Stdin)
+		scanner.Scan()
+		str := scanner.Text()
+		fmt.Scan(&position)
+
+		strRune := []rune(str)
+		for i := 0; i < len(strRune); i++ {
+			if i != position-1 {
+				fmt.Print(string(strRune[i]))
+			}
+		}
+	*/
+	var str string
+	var position int
+	fmt.Scan(&str, &position)
+
+	strRune := []rune(str)
+	for i := 0; i < len(strRune); i++ {
+		if i != position-1 {
+			fmt.Print(string(strRune[i]))
+		}
+	}
+}
+
+func foo9() {
+	/*
+		scanner := bufio.NewScanner(os.Stdin)
+		scanner.Scan()
+		str := scanner.Text()
+		strRune := []rune(str)
+		res := "-1"
+		for i := 0; i < len(strRune); i++ {
+			if strRune[i] == 'x' {
+				res = "x"
+				break
+			}
+			if strRune[i] == 'w' {
+				res = "w"
+				break
+			}
+		}
+		fmt.Println(res)
+	*/
+	var str string
+	fmt.Scan(&str)
+
+	for _, element := range str {
+		if string(element) == "x" || string(element) == "w" {
+			fmt.Println(string(element))
+			return
+		}
+	}
+	fmt.Print(-1)
+}
+
+// Функция палиндром
+func foo10() {
+	var s, rs string
+	fmt.Scan(&s)
+	for i := 0; i < len(s); i++ {
+		rs = string(s[i]) + rs
+	}
+	if rs == s {
+		fmt.Println("YES")
+	} else {
+		fmt.Println("NO")
+	}
+}
+
+// Еще один вариант палиндрома
+func foo11() {
+	scanner := bufio.NewScanner(os.Stdin)
+	scanner.Scan()
+	s := scanner.Text()
+
+	for i := 0; i < len(s)/2; i++ {
+		if s[i] != s[len(s)-1-i] {
+			break
+		}
+	}
+}
+
+// Поиск повторяющейся буквы
+func foo12() {
+	var s string
+	fmt.Scan(&s)
+
+	for i := 0; i < len(s); i++ {
+		simbol := s[i]
+		for j := i + 1; j < len(s); j++ {
+			if simbol == s[j] {
+				fmt.Println(string(simbol))
+				break
+			}
+		}
+	}
+}

+ 113 - 1
go/stepik/course_2/type/input_output.go

@@ -3,6 +3,7 @@ package main
 import (
 	"bufio"
 	"fmt"
+	"math"
 	"os"
 )
 
@@ -12,7 +13,21 @@ func main() {
 	// bestBook()
 	// repeat()
 	// splitter()
-	foo2()
+	// foo2()
+	// phone()
+	// cake()
+	// time()
+	// pre()
+	// fahrenheit()
+	// average()
+	// fraction()
+	// bit()
+	// triangle()
+	// distance()
+	// distance2()
+	// maxDigit()
+	// hundreds()
+	sumDigit()
 	// fmt.Println("#", 2)
 }
 
@@ -79,3 +94,100 @@ func foo2() {
 
 	fmt.Println(prod)
 }
+
+func phone() {
+	var v1, v2, v3, v4 int
+	fmt.Scan(&v1)
+	fmt.Scan(&v2)
+	fmt.Scan(&v3)
+	fmt.Scan(&v4)
+	fmt.Println((v1 + v2 + v3 + v4) * 3)
+}
+
+func cake() {
+	var rub, kop, count int
+	fmt.Scan(&rub)
+	fmt.Scan(&kop)
+	fmt.Scan(&count)
+
+	total := count * (rub*100 + kop)
+	fmt.Println(total/100, total%100)
+}
+
+func time() {
+	var input, hours, minutes int
+	fmt.Scan(&input)
+	hours = input / 60
+	minutes = input - 60*hours
+	fmt.Println(input, "мин - это", hours, "час", minutes, "минут.")
+}
+
+func pre() {
+	var val int
+	fmt.Scan(&val)
+	fmt.Println("Следующее за числом", val, "число:", val+1)
+	fmt.Println("Для числа", val, "предыдущее число:", val-1)
+}
+
+func fahrenheit() {
+	var input float64
+	fmt.Scan(&input)
+	fmt.Println((input - 32) * 5 / 9)
+}
+
+func average() {
+	var a, b int
+	fmt.Scan(&a, &b)
+	fmt.Println(float64(a+b) / 2)
+}
+
+func fraction() {
+	var val float64
+	fmt.Scan(&val)
+	fmt.Println(val - float64(int(val)))
+}
+
+func bit() {
+	var bit int
+	fmt.Scan(&bit)
+	fmt.Println(float64(bit) / math.Pow(2, 13))
+}
+
+func triangle() {
+	var a, b float64
+	fmt.Scan(&a, &b)
+	fmt.Println(a + b + math.Sqrt(a*a+b*b))
+}
+
+func distance() {
+	var x1, y1, x2, y2 int
+	fmt.Scan(&x1, &y1, &x2, &y2)
+	fmt.Println(math.Sqrt(float64((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))))
+}
+
+func distance2() {
+	var x1, y1, x2, y2 int
+	fmt.Scan(&x1, &y1, &x2, &y2)
+	fmt.Println(math.Abs(float64(x1-x2)) + math.Abs(float64(y1-y2)))
+}
+
+func maxDigit() {
+	var val float64
+	fmt.Scan(&val)
+	val = math.Abs(val)
+	fmt.Println(int(val)%10, int(val)%100/10, int(val)/100)
+	// fmt.Println(max(int(val)%10, int(val)%10, int(val)/100))
+}
+
+func hundreds() {
+	var val int
+	fmt.Scan(&val)
+	fmt.Println(val / 10 / 10 % 10)
+}
+
+// fmt.Println(int(val)%10, int(val)%100/10, int(val)/100)
+func sumDigit() {
+	var val int
+	fmt.Scan(&val)
+	fmt.Println(val%10 + val/10%10 + val/100%10)
+}

+ 56 - 0
go/stepik/course_3/base/embed_interface.go

@@ -0,0 +1,56 @@
+package main
+
+import (
+	"fmt"
+)
+
+// ------------------------
+
+type Payer interface {
+	Pay(int) error
+}
+
+type Ringer interface {
+	Ring(string) error
+}
+
+type NFCPhone interface {
+	Payer
+	Ringer
+}
+
+type Phone struct {
+	Money int
+}
+
+func (p *Phone) Pay(amount int) error {
+	if p.Money < amount {
+		return fmt.Errorf("Не хватает денег на телефоне")
+	}
+	p.Money -= amount
+	return nil
+}
+
+func (p *Phone) Ring(number string) error {
+	if number == "" {
+		return fmt.Errorf("Please, enter phone")
+	}
+	return nil
+}
+
+func PayForMetWithPhone(phone NFCPhone) {
+	err := phone.Pay(1)
+	if err != nil {
+		fmt.Printf("Ошибка при оплате %v\n\n", err)
+		return
+	}
+	fmt.Printf("Турникет открыт через %T\n\n", phone)
+}
+
+// ------------------------
+
+func main() {
+	myPhone := &Phone{Money: 9}
+	PayForMetWithPhone(myPhone)
+
+}

+ 61 - 0
go/stepik/course_3/base/empty_interface.go

@@ -0,0 +1,61 @@
+package main
+
+import (
+	"fmt"
+	"strconv"
+)
+
+func main() {
+	foo1()
+}
+
+type Payer interface {
+	Pay(int) error
+}
+
+type Stringer interface {
+	String() string
+}
+
+type Wallet struct {
+	Cash int
+}
+
+func (w *Wallet) Pay(amount int) error {
+	if w.Cash < amount {
+		return fmt.Errorf("Не хватает денег на кошельке")
+	}
+	w.Cash -= amount
+	return nil
+}
+
+func (w *Wallet) String() string {
+	return "Кошелек в котором " + strconv.Itoa(w.Cash) + " денег"
+}
+
+func Buy(in interface{}) {
+	var p Payer
+	var ok bool
+	if p, ok = in.(Payer); !ok {
+		fmt.Printf("%T не является платежным интерфейсом\n\n", in)
+		return
+	}
+
+	err := p.Pay(10)
+	if err != nil {
+		fmt.Printf("Ошибка при оплате %T: %v\n\n", p, err)
+		return
+	}
+	fmt.Printf("Спасибо за покупку через %T\n\n", p)
+}
+
+func foo1() {
+	myWallet := &Wallet{Cash: 100}
+	// fmt.Printf("Raw payment : %#v\n", myWallet)
+	// fmt.Printf("Способ оплаты: %s\n", myWallet)
+
+	Buy(myWallet)
+	Buy([]int{1, 2, 3})
+	Buy(3.14)
+
+}

+ 6 - 0
go/stepik/course_3/base/example/data_map.txt

@@ -0,0 +1,6 @@
+1
+2
+3
+3
+3
+4

+ 52 - 0
go/stepik/course_3/base/example/main.go

@@ -0,0 +1,52 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"io"
+	"os"
+)
+
+func uniq(input io.Reader, output io.Writer) error {
+	in := bufio.NewScanner(input)
+	var prev string
+	for in.Scan() {
+		txt := in.Text()
+
+		if txt == prev {
+			continue
+		}
+
+		if txt < prev {
+			return fmt.Errorf("file not sorted")
+		}
+
+		prev = txt
+		fmt.Fprintln(output, txt)
+	}
+	return nil
+}
+
+func main() {
+	err := uniq(os.Stdin, os.Stdout)
+	if err != nil {
+		panic(err.Error())
+	}
+
+	/*
+		// Вариант с map плох для больших объемов данных
+		in := bufio.NewScanner(os.Stdin)
+		alreadySeen := make(map[string]bool)
+		for in.Scan() {
+			txt := in.Text()
+
+			if _, found := alreadySeen[txt]; found {
+				continue
+			}
+
+			alreadySeen[txt] = true
+
+			fmt.Println(txt)
+		}
+	*/
+}

+ 49 - 0
go/stepik/course_3/base/example/main_test.go

@@ -0,0 +1,49 @@
+package main
+
+import (
+	"bufio"
+	"bytes"
+	"strings"
+	"testing"
+)
+
+var testOk = `1
+2
+3
+3
+4
+5`
+
+var testOkResult = `1
+2
+3
+4
+5
+`
+
+func TestOk(t *testing.T) {
+
+	in := bufio.NewReader(strings.NewReader(testOk))
+	out := new(bytes.Buffer)
+	err := uniq(in, out)
+	if err != nil {
+		t.Errorf("test for OK Failed - error")
+	}
+	if out.String() != testOkResult {
+		t.Errorf("test for OK Failed - results not match")
+	}
+}
+
+var testFail = `1
+2
+1`
+
+func TestForError(t *testing.T) {
+
+	in := bufio.NewReader(strings.NewReader(testFail))
+	out := new(bytes.Buffer)
+	err := uniq(in, out)
+	if err == nil {
+		t.Errorf("test for Error Failed - error")
+	}
+}

+ 53 - 0
go/stepik/course_3/base/func.go

@@ -0,0 +1,53 @@
+package main
+
+import "fmt"
+
+func main() {
+	// nums := []int{1, 2, 3, 4, 5}
+	// sum(1, 2, 3)
+	// sum(nums...)
+
+	foo1()
+}
+
+// не фиксированное количество параметров
+func sum(in ...int) (result int) {
+	fmt.Printf("in := %#v \n", in)
+	for _, val := range in {
+		result += val
+	}
+	return
+}
+
+func soNothing() {
+	fmt.Println("i'm regular function")
+}
+
+func foo1() {
+	func(in string) {
+		fmt.Println("anaon func out:", in)
+	}("nobody")
+
+	printer := func(in string) {
+		fmt.Println("printer outs:", in)
+	}
+	// printer("as variable")
+
+	// определяем тип функции
+	type strFuncType func(string)
+
+	worker := func(callback strFuncType) {
+		callback("as callback")
+	}
+	worker(printer)
+
+	// функция возвращает замыкание
+	prefixer := func(prefix string) strFuncType {
+		return func(in string) {
+			fmt.Printf("[%s] %s", prefix, in)
+		}
+	}
+	successLogger := prefixer("SUCCESS")
+	successLogger("expecred behaviour")
+
+}

+ 96 - 0
go/stepik/course_3/base/interface.go

@@ -0,0 +1,96 @@
+package main
+
+import "fmt"
+
+func main() {
+	foo1()
+}
+
+type Payer interface {
+	Pay(int) error
+}
+
+// -----------------------------------------------------------------------------
+
+type Wallet struct {
+	Cash int
+}
+
+func (w *Wallet) Pay(amount int) error {
+	if w.Cash < amount {
+		return fmt.Errorf("Не хватает денег в кошельке")
+	}
+	w.Cash -= amount
+	return nil
+}
+
+// -----------------------------------------------------------------------------
+
+type Card struct {
+	Balance    int
+	ValidUntil string
+	Cardholder string
+	CVV        string
+	Number     string
+}
+
+func (c *Card) Pay(amount int) error {
+	if c.Balance < amount {
+		return fmt.Errorf("Не хватает денег на карте")
+	}
+	c.Balance -= amount
+	return nil
+}
+
+// -----------------------------------------------------------------------------
+
+type ApplePay struct {
+	Money   int
+	AppleID string
+}
+
+func (a *ApplePay) Pay(amount int) error {
+	if a.Money < amount {
+		return fmt.Errorf("Не хватает денег на аккаунте")
+	}
+	a.Money -= amount
+	return nil
+}
+
+// -----------------------------------------------------------------------------
+
+// Здесь напрямую нельзя обриться к полю структуры, реализующей интерфейс.
+// Поэтому нужно делать преобразвание.
+func Buy(p Payer) {
+	switch p.(type) {
+	case *Wallet:
+		fmt.Println("Oplata наличными?")
+	case *Card:
+		plasticCard, ok := p.(*Card)
+		if !ok {
+			fmt.Println("Не удалось преобразовать к типу *Card")
+		}
+		fmt.Println("Вставляйте карту,", plasticCard.Cardholder)
+	default:
+		fmt.Println("Что-то новое!")
+	}
+
+	err := p.Pay(10)
+	if err != nil {
+		fmt.Println(err)
+	} else {
+		fmt.Printf("Спасибо за покупку через %T\n\n", p)
+	}
+}
+
+func foo1() {
+	// myWallet := &Wallet{Cash: 100}
+	// Buy(myWallet)
+
+	var myMoney Payer
+	myMoney = &Card{Balance: 100, Cardholder: "rvasily"}
+	Buy(myMoney)
+
+	myMoney = &ApplePay{Money: 9}
+	Buy(myMoney)
+}

+ 45 - 0
go/stepik/course_3/base/panic.go

@@ -0,0 +1,45 @@
+package main
+
+import "fmt"
+
+func main() {
+	// foo1()
+	// foo2()
+	foo3()
+}
+
+func getSomeVars() string {
+	fmt.Println("getSomeVars execution")
+	return "getSomeVars result"
+}
+
+func foo1() {
+	defer fmt.Println("After work")
+	defer fmt.Println(getSomeVars())
+	fmt.Println("Some useful work")
+}
+
+func foo2() {
+	defer fmt.Println("After work")
+	defer func() {
+		fmt.Println(getSomeVars())
+	}()
+	fmt.Println("Some useful work")
+}
+
+// Паника
+func deferTest() {
+	defer func() {
+		if err := recover(); err != nil {
+			fmt.Println("panic happend:", err)
+		}
+	}()
+	fmt.Println("Some useful work")
+	panic("something bad happend")
+	return
+}
+
+func foo3() {
+	deferTest()
+	return
+}

+ 58 - 0
go/stepik/course_3/base/struct.go

@@ -0,0 +1,58 @@
+package main
+
+import "fmt"
+
+type Person struct {
+	Id      int
+	Name    string
+	Address string
+}
+
+type Account struct {
+	Id      int
+	Name    string
+	Cleaner func(string) string
+	Owner   Person
+	Person
+}
+
+func main() {
+	// foo1()
+	foo2()
+}
+
+func foo1() {
+	// полное объявление структуры
+	var acc Account = Account{
+		Id:   1,
+		Name: "rvasily",
+		Person: Person{
+			Address: "Москва",
+		},
+	}
+	// fmt.Printf("%#v\n", acc)
+
+	// короткое объявление структуры
+	acc.Owner = Person{2, "Romanov Vasily", "Moscow"}
+	// fmt.Printf("%#v", acc)
+	fmt.Println(acc.Address)
+}
+
+// методы структур
+
+// не изменяет оригинальной структуры, для который вызван
+// нет смысла
+func (p Person) UpdateName(name string) {
+	p.Name = name
+}
+
+// изменяет оригинальную структура
+func (p *Person) SetName(name string) {
+	p.Name = name
+}
+
+func foo2() {
+	pers := Person{1, "Vasily", "Moscow"}
+	pers.SetName("Vasily Romanov")
+	fmt.Printf("updated person: %#v\n", pers)
+}

+ 84 - 0
go/stepik/course_3/base/task/foo1.go

@@ -0,0 +1,84 @@
+package main
+
+import (
+	"fmt"
+	"io"
+	"io/ioutil"
+	"log"
+	"os"
+	"path/filepath"
+	"sort"
+)
+
+func main() {
+	dirTree(os.Stdout, "..", true)
+}
+
+func dirTree(output io.Writer, currDir string, printFiles bool) error {
+	recursionPrintService("", output, currDir, printFiles)
+	return nil
+}
+
+func recursionPrintService(prependingString string, output io.Writer, currDir string, printFiles bool) {
+	fileObj, err := os.Open(currDir)
+	defer fileObj.Close()
+	if err != nil {
+		log.Fatalf("Could not open %s: %s", currDir, err.Error())
+	}
+	fileName := fileObj.Name()
+	files, err := ioutil.ReadDir(fileName)
+	if err != nil {
+		log.Fatalf("Could not read dir names in %s: %s", currDir, err.Error())
+	}
+	var filesMap map[string]os.FileInfo = map[string]os.FileInfo{}
+	var unSortedFilesNameArr []string = []string{}
+	for _, file := range files {
+		unSortedFilesNameArr = append(unSortedFilesNameArr, file.Name())
+		filesMap[file.Name()] = file
+	}
+	sort.Strings(unSortedFilesNameArr)
+	var sortedFilesArr []os.FileInfo = []os.FileInfo{}
+	for _, stringName := range unSortedFilesNameArr {
+		sortedFilesArr = append(sortedFilesArr, filesMap[stringName])
+	}
+	files = sortedFilesArr
+	var newFileList []os.FileInfo = []os.FileInfo{}
+	var length int
+	if !printFiles {
+		for _, file := range files {
+			if file.IsDir() {
+				newFileList = append(newFileList, file)
+			}
+		}
+		files = newFileList
+	}
+	length = len(files)
+	for i, file := range files {
+		if file.IsDir() {
+			var stringPrepender string
+			if length > i+1 {
+				fmt.Fprintf(output, prependingString+"├───"+"%s\n", file.Name())
+				stringPrepender = prependingString + "│\t"
+			} else {
+				fmt.Fprintf(output, prependingString+"└───"+"%s\n", file.Name())
+				stringPrepender = prependingString + "\t"
+			}
+			newDir := filepath.Join(currDir, file.Name())
+			recursionPrintService(stringPrepender, output, newDir, printFiles)
+		} else if printFiles {
+			if file.Size() > 0 {
+				if length > i+1 {
+					fmt.Fprintf(output, prependingString+"├───%s (%vb)\n", file.Name(), file.Size())
+				} else {
+					fmt.Fprintf(output, prependingString+"└───%s (%vb)\n", file.Name(), file.Size())
+				}
+			} else {
+				if length > i+1 {
+					fmt.Fprintf(output, prependingString+"├───%s (empty)\n", file.Name())
+				} else {
+					fmt.Fprintf(output, prependingString+"└───%s (empty)\n", file.Name())
+				}
+			}
+		}
+	}
+}

+ 68 - 0
go/stepik/course_3/base/task/main.go

@@ -0,0 +1,68 @@
+package main
+
+import (
+	"fmt"
+	"io"
+	"log"
+	"os"
+)
+
+func main() {
+	dirTree(os.Stdout, "..", true)
+}
+
+func dirTree(output io.Writer, currDir string, printFile bool) error {
+	recursionDirTree(currDir, false)
+	return nil
+}
+
+// todo Разобраться с log, err.Error
+func recursionDirTree(currDir string, printFiles bool) {
+	fileObj, err := os.Open(currDir)
+	defer fileObj.Close()
+	if err != nil {
+		log.Fatalf("Could not open %s: %s", currDir, err.Error())
+	}
+
+	files, err := os.ReadDir(fileObj.Name())
+	if err != nil {
+		log.Fatalf("Could not read dir names in %s: %s", currDir, err.Error())
+	}
+
+	// os.ReadDir возвращает отсортированный слайс DirEntry
+	var sortedFilesNameArr []string = []string{}
+	var filesMap map[string]os.DirEntry = map[string]os.DirEntry{}
+
+	for _, file := range files {
+		sortedFilesNameArr = append(sortedFilesNameArr, file.Name())
+		filesMap[file.Name()] = file
+	}
+
+	fmt.Println(files)
+
+	// Превращаем слайс всех объектов (файлов и папок) в слайс только папок
+	// если printFiles == false
+	var dirList []os.DirEntry = []os.DirEntry{}
+	if !printFiles {
+		for _, file := range files {
+			if file.IsDir() {
+				dirList = append(dirList, file)
+			}
+		}
+		files = dirList
+	}
+
+	var length int = len(files)
+	fmt.Println(length)
+
+	// for i, file := range files{}
+
+	// fmt.Println(files)
+
+	// fmt.Println(unSortedFilesNameArr)
+	// fmt.Println(sortedFilesArr)
+
+	// fmt.Printf("%T\n", files[0])
+	// fmt.Println(files)
+
+}

+ 0 - 0
go/stepik/course_3/base/task/test_dir


+ 231 - 0
go/stepik/course_3/base/var.go

@@ -0,0 +1,231 @@
+package main
+
+import "fmt"
+
+func main() {
+	// foo1()
+	// foo2()
+	// foo3()
+	// foo4()
+	// foo5()
+	// foo6()
+	// foo7()
+	foo8()
+}
+
+// строки
+// Строки в Go неизменяемы
+func foo1() {
+
+	// Строка как есть
+	var world string = `Мир\r\n`
+	fmt.Println(world)
+
+	// Одинарный кавычки для байт (uint8)
+	var rawBinary byte = '\x27'
+	fmt.Println(rawBinary)
+	fmt.Println(string(rawBinary))
+
+	// rune (uint32) для UTF-8 символов
+	var someRune rune = 'ℒ'
+	fmt.Println(someRune)
+	fmt.Println(string(someRune))
+
+	// получение подстроки, в байтах, не в символах!
+	var helloWorld string = "Hello world!"
+	hello := helloWorld[:5]
+	fmt.Println(hello)
+
+	// конвертация в слайс байт о обратно
+	byteString := []byte(helloWorld)
+	helloWorld = string(byteString)
+	fmt.Println(byteString)
+	fmt.Println(helloWorld)
+}
+
+// константры
+func foo2() {
+	const pi = 3.14
+
+	// блок констант
+	const (
+		hello = "Привет"
+		e     = 2.718
+	)
+
+	// iota - автоинкремент для констант
+	const (
+		zero  = iota
+		_     // пустая переменная, пропуск iota
+		three // = 3
+	)
+
+	const (
+		// нетипизироанная константа
+		year = 2017
+		// типизированная константа
+		yearTyped int = 2026
+	)
+}
+
+// указатели
+func foo3() {
+	// получение указателя на переменную типа int
+	// инициализированную значением по умолчанию
+	d := new(int)
+
+	fmt.Println(d)
+}
+
+// массивы
+func foo4() {
+	// определение размера при объявлении
+	a1 := [...]int{1, 2, 3}
+	fmt.Println(a1)
+}
+
+// слайсы
+func foo5() {
+	// создание
+	/*
+		var buf0 []int
+		buf1 := []int{}
+		buf2 := []int{42}
+		buf3 := make([]int, 0)     // len = 0, cap = 0
+		buf4 := make([]int, 5)     // len = 5, cap = 5
+		buf5 := make([]int, 5, 10) // len = 5, cap = 10
+	*/
+	// добавление элементов
+	var buf []int
+	buf = append(buf, 9, 10)
+
+	// добавление слайса в слайс
+	otherBuf := make([]int, 3)
+	buf = append(buf, otherBuf...)
+
+	// можно копировать в часть существующего слайса
+	ints := []int{1, 2, 3, 4}
+	copy(ints[1:3], []int{5, 6})
+	fmt.Println(ints)
+}
+
+// map
+func foo6() {
+	// инициализация при создании
+	var user map[string]string = map[string]string{
+		"name":     "Vasily",
+		"lastname": "Romanov",
+	}
+	fmt.Println(user)
+
+	// сразу с нужной емкостью
+	// profile := make(map[string]string, 10)
+
+	// проверка на существование ключа
+	mName, nNameExist := user["middleName"]
+	fmt.Println(mName, nNameExist)
+
+	// удаление ключа
+	delete(user, "lastName")
+}
+
+// условный оператор
+func foo7() {
+	mapVal := map[string]string{"name": "rvasily"}
+
+	// условие с блоком инициализации
+	if keyValue, keyExist := mapVal["name"]; keyExist {
+		fmt.Println("name =", keyValue)
+	}
+
+	// получаем только признак существование ключа
+	if _, keyExist := mapVal["name"]; keyExist {
+		fmt.Println("key 'name' exist")
+	}
+
+	// switch по 1 переменной
+	strVal := "name"
+	switch strVal {
+	case "name":
+		fallthrough // чтобы провалиться в следующее условие
+	case "test", "lastName":
+		// some work
+	default:
+		// some work
+	}
+
+	// switch как замена многим ifelse
+	var val1, val2 = 2, 2
+	switch {
+	case val1 > 1 || val2 < 11:
+		fmt.Println("first block")
+	case val2 > 10:
+		fmt.Println("second block")
+	}
+
+	// выход из цикла, находясь внутри switch 
+Loop:
+	for key, val := range mapVal {
+		fmt.Println("switch in loop", key, val)
+		switch {
+		case key == "lastName":
+			break
+			fmt.Println("dont print this")
+		case key == "firstName" && val == "Vasily":
+			fmt.Println("switch - break loop here")
+			break Loop
+		}
+	} // конце for
+}
+
+// циклы
+func foo8() {
+	// цикл без условия
+	isRun := true
+	for isRun {
+		fmt.Println("loop iteration with condition")
+		isRun = false
+	}
+
+	// операции по slice
+	sl := []int{1, 2, 3}
+	idx := 0
+
+	for idx , len(s1) {
+		fmt.Println("while-type loop, idx:", idx, "value:", sl[idx])
+		idx++
+	}
+
+	for i := 0; i < len(sl); i++ {
+		fmt.Println("c-style loop", i, sl[i])
+	}	
+
+	for idx := range sl {
+		fmt.Println("range slice by index", idx)
+	}
+
+	for idx, val := range sl {
+		fmt.Println("range slice by idx-value", idx, val)
+	}
+
+	// операции по map
+	profile := map[int]string{1: "Vasily", 2: "Romanov"}
+
+	for key := range profile {
+		fmt.Println("range map by key", key)
+	}
+
+	for key, val := range progile {
+		fmt.Println("range map by key-val", key, val)
+	}
+
+	for _, val := range profile {
+		fmt.Println("range map by bal", val)
+	}
+
+	// итерироване по строке
+	str := "Привет, Мир!"
+	for pos, char := range str {
+		fmt.Printf("%#U at pos %d\n" char, pos)
+	}
+}