|
Опрос клавиатуры на С, Как написать компактный и "красивый" код? |
|
|
|
 |
Ответов
|
Jun 23 2018, 06:38
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Make_Pic @ Jun 23 2018, 08:17)  Опрос клавиатуры на С -> Как написать компактный и "красивый" код? Дайте pls примеры опроса матрицы клавиш на С (C++ не надо). В своих проектах разделяю опрос клавиатуры (неважно какая, матричная или обычная) на два разных этапа: 1) опрос существующего состояния кнопок с заданной периодичностью, обычно раз в 50мс, чтобы потом не "воевать" с дребезгом. 2) анализ (сравнение) текущего и предыдущего состояния клавиатуры, тем самым выделяя события отпускания и нажатия далее в зависимости от проекта реализовывал систему подписки на различные события, если в двух словах, то речь про колбэки и их продвинутые аналоги. Модули, которым нужно ждать события от клавиатуры, "подписываются" на нужные события и кнопки, "обращаясь" к модулю клавиатуры. События всего два - отпускание и нажатие. Этого обычно вполне достаточно. Долгое удержание или т. п. реализуется уже в самом модуле. Такая схема дает возможность напрочь отвязаться от способа реализации клавиатуры: будь то "примитивные" кнопки на пинах и внешние проводные или беспроводное клавиатуры (например, пульты оператора). Т.е. я жестко разделяю опрос клавиатуры от тех модулей/блоков, которые ждут от нее реакцию. Примеры приводить не буду, т. к. вы "запретили" тут использовать C++. Однако, на голом С все описанное выше тоже реализуется, но уже несколько "топорно" и далеко не так "компактно и красиво". К счастью (кому-то к сожалению) давно не использую подобный инструментарий и поэтому примеров на нем, увы, не сохранилось (( Добавлю, что использую RTOS, т. к. под ней это реализуется значительно проще: не нужно "колдовать" с таймерами и самодельными генераторами/приемниками событий. зы. В проектах с одной/двумя кнопками все реализую значительно проще, но аналогично - периодический опрос и сравнение двух состояний: предыдущего и текущего.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Jun 23 2018, 13:40
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Make_Pic @ Jun 23 2018, 10:20)  Я не запрещал, но понимаю, что на плюсах удобнее - приведите свой пример pls! Ох уж эти местные плюсисты. Вот все могут, только показать ничего нормальное не могут. Спрашивается на кой было в руки брать плюсы если не способен даже модульную архитектуру создать чтобы ничего не "выдирать" из кода. Но я хочу показать еще один универсальный способ создания софта. Вот модель сканирования клавиатуры в Simulink -
А вот код на C который сгенерился по этой модели CODE /* * File: KeyboardScanModule.c * * Code generated for Simulink model 'KeyboardScanModule'. * * Model version : 1.5 * Simulink Coder version : 8.14 (R2018a) 06-Feb-2018 * C/C++ source code generated on : Sat Jun 23 17:02:12 2018 * * Target selection: ert.tlc * Embedded hardware selection: ARM Compatible->ARM Cortex * Code generation objectives: * 1. Execution efficiency * 2. Traceability * Validation result: Not run */
#include "KeyboardScanModule.h"
/* Block signals and states (default storage) */ DW rtDW;
/* External outputs (root outports fed by signals with default storage) */ ExtY rtY;
/* Real-time model */ RT_MODEL rtM_; RT_MODEL *const rtM = &rtM_; static void rate_scheduler(void);
/* * This function updates active task flag for each subrate. * The function is called at model base rate, hence the * generated code self-manages all its subrates. */ static void rate_scheduler(void) { /* Compute which subrates run during the next base time step. Subrates * are an integer multiple of the base rate counter. Therefore, the subtask * counter is reset when it reaches its limit (zero means run). */ (rtM->Timing.TaskCounters.TID[1])++; if ((rtM->Timing.TaskCounters.TID[1]) > 2) {/* Sample time: [3.0s, 0.0s] */ rtM->Timing.TaskCounters.TID[1] = 0; } }
/* Model step function */ void KeyboardScanModule_step(void) { int32_T uyIdx; int32_T currentOffset; int32_T nSampsAtBot; int32_T rtb_Add[9]; boolean_T rtb_RelationalOperator[9]; boolean_T rtb_TmpSignalConversionAtDelayI[9]; boolean_T rtb_Delay[9]; int32_T rtb_Switch[9]; uint8_T rtb_FixPtSum1; boolean_T rtb_Buffer2[3]; boolean_T rtb_Buffer1[3]; boolean_T rtb_Buffer[3]; int32_T i; int32_T rtb_Add_d; if (rtM->Timing.TaskCounters.TID[1] == 0) { for (i = 0; i < 9; i++) { /* Sum: '<S1>/Add' incorporates: * Constant: '<S1>/Constant3' * Delay: '<S1>/Delay1' */ rtb_Add_d = rtDW.Delay1_DSTATE[i] + 1;
/* RelationalOperator: '<S1>/Relational Operator' incorporates: * Constant: '<S1>/Constant2' */ rtb_RelationalOperator[i] = (10 > rtb_Add_d);
/* Delay: '<S1>/Delay' */ rtb_Delay[i] = rtDW.Delay_DSTATE[i];
/* Sum: '<S1>/Add' */ rtb_Add[i] = rtb_Add_d; } }
/* Buffer: '<S1>/Buffer2' incorporates: * Constant: '<S1>/Constant' * MultiPortSwitch: '<S1>/Multiport Switch' */ rtb_Add_d = 6; uyIdx = rtDW.Buffer2_inBufPtrIdx; if (6 - rtDW.Buffer2_inBufPtrIdx <= 1) { for (i = 0; i < 6 - rtDW.Buffer2_inBufPtrIdx; i++) { rtDW.Buffer2_CircBuf[rtDW.Buffer2_inBufPtrIdx + i] = false; }
uyIdx = 0; rtb_Add_d = rtDW.Buffer2_inBufPtrIdx; }
for (i = 0; i < rtb_Add_d - 5; i++) { rtDW.Buffer2_CircBuf[uyIdx + i] = false; }
rtDW.Buffer2_inBufPtrIdx++; if (rtDW.Buffer2_inBufPtrIdx >= 6) { rtDW.Buffer2_inBufPtrIdx -= 6; }
rtDW.Buffer2_bufferLength++; if (rtDW.Buffer2_bufferLength > 6) { rtDW.Buffer2_outBufPtrIdx = (rtDW.Buffer2_outBufPtrIdx + rtDW.Buffer2_bufferLength) - 6; if (rtDW.Buffer2_outBufPtrIdx > 6) { rtDW.Buffer2_outBufPtrIdx -= 6; }
rtDW.Buffer2_bufferLength = 6; }
if (rtM->Timing.TaskCounters.TID[1] == 0) { rtDW.Buffer2_bufferLength -= 3; if (rtDW.Buffer2_bufferLength < 0) { rtDW.Buffer2_outBufPtrIdx += rtDW.Buffer2_bufferLength; if (rtDW.Buffer2_outBufPtrIdx < 0) { rtDW.Buffer2_outBufPtrIdx += 6; }
rtDW.Buffer2_bufferLength = 0; }
uyIdx = 0; currentOffset = rtDW.Buffer2_outBufPtrIdx; if (rtDW.Buffer2_outBufPtrIdx < 0) { currentOffset = rtDW.Buffer2_outBufPtrIdx + 6; }
nSampsAtBot = 6 - currentOffset; rtb_Add_d = 3; if (6 - currentOffset <= 3) { for (i = 0; i < 6 - currentOffset; i++) { rtb_Buffer2[i] = rtDW.Buffer2_CircBuf[currentOffset + i]; }
uyIdx = 6 - currentOffset; currentOffset = 0; rtb_Add_d = 3 - nSampsAtBot; }
for (i = 0; i < rtb_Add_d; i++) { rtb_Buffer2[uyIdx + i] = rtDW.Buffer2_CircBuf[currentOffset + i]; }
rtDW.Buffer2_outBufPtrIdx = currentOffset + rtb_Add_d; }
/* End of Buffer: '<S1>/Buffer2' */
/* Buffer: '<S1>/Buffer1' incorporates: * Constant: '<S1>/Constant' * MultiPortSwitch: '<S1>/Multiport Switch2' */ rtb_Add_d = 6; uyIdx = rtDW.Buffer1_inBufPtrIdx; if (6 - rtDW.Buffer1_inBufPtrIdx <= 1) { for (i = 0; i < 6 - rtDW.Buffer1_inBufPtrIdx; i++) { rtDW.Buffer1_CircBuf[rtDW.Buffer1_inBufPtrIdx + i] = false; }
uyIdx = 0; rtb_Add_d = rtDW.Buffer1_inBufPtrIdx; }
for (i = 0; i < rtb_Add_d - 5; i++) { rtDW.Buffer1_CircBuf[uyIdx + i] = false; }
rtDW.Buffer1_inBufPtrIdx++; if (rtDW.Buffer1_inBufPtrIdx >= 6) { rtDW.Buffer1_inBufPtrIdx -= 6; }
rtDW.Buffer1_bufferLength++; if (rtDW.Buffer1_bufferLength > 6) { rtDW.Buffer1_outBufPtrIdx = (rtDW.Buffer1_outBufPtrIdx + rtDW.Buffer1_bufferLength) - 6; if (rtDW.Buffer1_outBufPtrIdx > 6) { rtDW.Buffer1_outBufPtrIdx -= 6; }
rtDW.Buffer1_bufferLength = 6; }
if (rtM->Timing.TaskCounters.TID[1] == 0) { rtDW.Buffer1_bufferLength -= 3; if (rtDW.Buffer1_bufferLength < 0) { rtDW.Buffer1_outBufPtrIdx += rtDW.Buffer1_bufferLength; if (rtDW.Buffer1_outBufPtrIdx < 0) { rtDW.Buffer1_outBufPtrIdx += 6; }
rtDW.Buffer1_bufferLength = 0; }
uyIdx = 0; currentOffset = rtDW.Buffer1_outBufPtrIdx; if (rtDW.Buffer1_outBufPtrIdx < 0) { currentOffset = rtDW.Buffer1_outBufPtrIdx + 6; }
nSampsAtBot = 6 - currentOffset; rtb_Add_d = 3; if (6 - currentOffset <= 3) { for (i = 0; i < 6 - currentOffset; i++) { rtb_Buffer1[i] = rtDW.Buffer1_CircBuf[currentOffset + i]; }
uyIdx = 6 - currentOffset; currentOffset = 0; rtb_Add_d = 3 - nSampsAtBot; }
for (i = 0; i < rtb_Add_d; i++) { rtb_Buffer1[uyIdx + i] = rtDW.Buffer1_CircBuf[currentOffset + i]; }
rtDW.Buffer1_outBufPtrIdx = currentOffset + rtb_Add_d; }
/* End of Buffer: '<S1>/Buffer1' */
/* Buffer: '<S1>/Buffer' incorporates: * Constant: '<S1>/Constant' * MultiPortSwitch: '<S1>/Multiport Switch3' */ rtb_Add_d = 6; uyIdx = rtDW.Buffer_inBufPtrIdx; if (6 - rtDW.Buffer_inBufPtrIdx <= 1) { for (i = 0; i < 6 - rtDW.Buffer_inBufPtrIdx; i++) { rtDW.Buffer_CircBuf[rtDW.Buffer_inBufPtrIdx + i] = false; }
uyIdx = 0; rtb_Add_d = rtDW.Buffer_inBufPtrIdx; }
for (i = 0; i < rtb_Add_d - 5; i++) { rtDW.Buffer_CircBuf[uyIdx + i] = false; }
rtDW.Buffer_inBufPtrIdx++; if (rtDW.Buffer_inBufPtrIdx >= 6) { rtDW.Buffer_inBufPtrIdx -= 6; }
rtDW.Buffer_bufferLength++; if (rtDW.Buffer_bufferLength > 6) { rtDW.Buffer_outBufPtrIdx = (rtDW.Buffer_outBufPtrIdx + rtDW.Buffer_bufferLength) - 6; if (rtDW.Buffer_outBufPtrIdx > 6) { rtDW.Buffer_outBufPtrIdx -= 6; }
rtDW.Buffer_bufferLength = 6; }
if (rtM->Timing.TaskCounters.TID[1] == 0) { rtDW.Buffer_bufferLength -= 3; if (rtDW.Buffer_bufferLength < 0) { rtDW.Buffer_outBufPtrIdx += rtDW.Buffer_bufferLength; if (rtDW.Buffer_outBufPtrIdx < 0) { rtDW.Buffer_outBufPtrIdx += 6; }
rtDW.Buffer_bufferLength = 0; }
uyIdx = 0; currentOffset = rtDW.Buffer_outBufPtrIdx; if (rtDW.Buffer_outBufPtrIdx < 0) { currentOffset = rtDW.Buffer_outBufPtrIdx + 6; }
nSampsAtBot = 6 - currentOffset; rtb_Add_d = 3; if (6 - currentOffset <= 3) { for (i = 0; i < 6 - currentOffset; i++) { rtb_Buffer[i] = rtDW.Buffer_CircBuf[currentOffset + i]; }
uyIdx = 6 - currentOffset; currentOffset = 0; rtb_Add_d = 3 - nSampsAtBot; }
for (i = 0; i < rtb_Add_d; i++) { rtb_Buffer[uyIdx + i] = rtDW.Buffer_CircBuf[currentOffset + i]; }
rtDW.Buffer_outBufPtrIdx = currentOffset + rtb_Add_d;
/* SignalConversion: '<S1>/TmpSignal ConversionAtDelayInport1' */ rtb_TmpSignalConversionAtDelayI[0] = rtb_Buffer2[0]; rtb_TmpSignalConversionAtDelayI[3] = rtb_Buffer1[0]; rtb_TmpSignalConversionAtDelayI[6] = rtb_Buffer[0]; rtb_TmpSignalConversionAtDelayI[1] = rtb_Buffer2[1]; rtb_TmpSignalConversionAtDelayI[4] = rtb_Buffer1[1]; rtb_TmpSignalConversionAtDelayI[7] = rtb_Buffer[1]; rtb_TmpSignalConversionAtDelayI[2] = rtb_Buffer2[2]; rtb_TmpSignalConversionAtDelayI[5] = rtb_Buffer1[2]; rtb_TmpSignalConversionAtDelayI[8] = rtb_Buffer[2]; for (i = 0; i < 9; i++) { /* Outport: '<Root>/PressFlags' incorporates: * Logic: '<S1>/Logical Operator2' */ rtY.PressFlags[i] = (rtb_RelationalOperator[i] && rtb_Delay[i]);
/* Outport: '<Root>/ReleasFlags' incorporates: * Logic: '<S1>/Logical Operator3' * Logic: '<S1>/Logical Operator4' */ rtY.ReleasFlags[i] = (rtb_RelationalOperator[i] && (!rtb_Delay[i]));
/* Switch: '<S1>/Switch' incorporates: * Constant: '<S1>/Constant4' * Logic: '<S1>/Logical Operator' */ if ((boolean_T)(rtb_Delay[i] ^ rtb_TmpSignalConversionAtDelayI[i])) { rtb_Switch[i] = rtb_Add[i]; } else { rtb_Switch[i] = 0; }
/* End of Switch: '<S1>/Switch' */ }
for (i = 0; i < 9; i++) { /* Update for Delay: '<S1>/Delay1' */ rtDW.Delay1_DSTATE[i] = rtb_Switch[i];
/* Update for Delay: '<S1>/Delay' */ rtDW.Delay_DSTATE[i] = rtb_TmpSignalConversionAtDelayI[i]; } }
/* End of Buffer: '<S1>/Buffer' */
/* Sum: '<S4>/FixPt Sum1' incorporates: * Constant: '<S4>/FixPt Constant' * UnitDelay: '<S3>/Output' */ rtb_FixPtSum1 = (uint8_T)(rtDW.Output_DSTATE + 1U);
/* Switch: '<S5>/FixPt Switch' */ if (rtb_FixPtSum1 > 2) { /* Update for UnitDelay: '<S3>/Output' incorporates: * Constant: '<S5>/Constant' */ rtDW.Output_DSTATE = 0U; } else { /* Update for UnitDelay: '<S3>/Output' */ rtDW.Output_DSTATE = rtb_FixPtSum1; }
/* End of Switch: '<S5>/FixPt Switch' */ rate_scheduler(); }
/* Model initialize function */ void KeyboardScanModule_initialize(void) { { int32_T i;
/* InitializeConditions for Delay: '<S1>/Delay1' */ for (i = 0; i < 9; i++) { rtDW.Delay1_DSTATE[i] = 1; }
/* End of InitializeConditions for Delay: '<S1>/Delay1' */
/* InitializeConditions for Buffer: '<S1>/Buffer2' */ rtDW.Buffer2_inBufPtrIdx = 3; rtDW.Buffer2_bufferLength = 3;
/* InitializeConditions for Buffer: '<S1>/Buffer1' */ rtDW.Buffer1_inBufPtrIdx = 3; rtDW.Buffer1_bufferLength = 3;
/* InitializeConditions for Buffer: '<S1>/Buffer' */ rtDW.Buffer_inBufPtrIdx = 3; rtDW.Buffer_bufferLength = 3; } }
/* * File trailer for generated code. * * [EOF] */
Тут важно то, что в алгоритме сколько кнопок столько и счетчиков для антидребезга. B такая генерация спасает от рутины громоздить огромное количество счетчиков и создания длинный битовых масок. Предупреждение. Файл имеет зависимости. Типы и функция main объявлены в других файлах.
|
|
|
|
Сообщений в этой теме
Make_Pic Опрос клавиатуры на С Jun 23 2018, 05:17  Forger Цитата(Make_Pic @ Jun 23 2018, 10:20) Я н... Jun 23 2018, 08:05    AlexandrY Цитата(Forger @ Jun 23 2018, 16:54) Отлич... Jun 23 2018, 14:09     Forger Цитата(AlexandrY @ Jun 23 2018, 17:09) Во... Jun 23 2018, 14:13      AlexandrY Цитата(Forger @ Jun 23 2018, 17:13) Друго... Jun 23 2018, 14:22       Forger Цитата(AlexandrY @ Jun 23 2018, 17:22) Та... Jun 23 2018, 14:29        AlexandrY Цитата(Forger @ Jun 23 2018, 17:29) Какие... Jun 23 2018, 14:43         Forger Цитата(AlexandrY @ Jun 23 2018, 17:43) Че... Jun 23 2018, 14:54   x893 Цитата(AlexandrY @ Jun 23 2018, 16:40) ..... Jun 23 2018, 15:01    Сергей Борщ QUOTE (x893 @ Jun 23 2018, 18:01) Но это ... Jun 23 2018, 16:01     AlexandrY Цитата(Сергей Борщ @ Jun 23 2018, 19:01) ... Jun 23 2018, 17:25 x893 Цитата(Forger @ Jun 23 2018, 09:38) ...
д... Jun 23 2018, 08:03 iliusmaster Обычно, чтобы ничего постояно не опрашивать, все с... Jun 23 2018, 17:17 Forger Цитата(iliusmaster @ Jun 23 2018, 20:17) ... Jun 23 2018, 18:03 k155la3 Цитата(iliusmaster @ Jun 23 2018, 20:17) ... Jun 24 2018, 08:23 ArtemKAD Ну развели... Проблема дребезга полностью освещена... Jun 23 2018, 19:56 Forger Цитата(ArtemKAD @ Jun 23 2018, 22:56) Ну ... Jun 23 2018, 20:43 Сергей Борщ QUOTE (ArtemKAD @ Jun 23 2018, 22:56) For... Jun 23 2018, 21:07  Forger Цитата(Сергей Борщ @ Jun 24 2018, 00:07) ... Jun 23 2018, 21:17  ArtemKAD Цитата(Сергей Борщ @ Jun 24 2018, 00:07) ... Jun 23 2018, 23:20   Forger Цитата(ArtemKAD @ Jun 24 2018, 02:20) Я б... Jun 24 2018, 06:52 ArtemKAD Импульсную подтяжку еще и на кнопку - знаете вы то... Jun 24 2018, 07:23 Forger Цитата(ArtemKAD @ Jun 24 2018, 10:23) Имп... Jun 24 2018, 08:10  ArtemKAD Цитата(Forger @ Jun 24 2018, 11:10) Извра... Jun 25 2018, 22:31   AlexandrY Цитата(ArtemKAD @ Jun 26 2018, 01:31) Кон... Jun 26 2018, 05:17    Forger Цитата(AlexandrY @ Jun 26 2018, 08:17) Чт... Jun 26 2018, 05:25    iliusmaster Цитата(AlexandrY @ Jun 26 2018, 08:17) Чт... Jun 26 2018, 05:30     =L.A.= Цитата(iliusmaster @ Jun 26 2018, 08:30) ... Jun 26 2018, 05:44      haker_fox QUOTE (=L.A.= @ Jun 26 2018, 13:44) Писан... Jun 26 2018, 06:32       Forger Имхо, физика процесса тут не очень однозначная: ра... Jun 26 2018, 06:52     AlexandrY Цитата(iliusmaster @ Jun 26 2018, 08:30) ... Jun 26 2018, 07:42      Forger Цитата(AlexandrY @ Jun 26 2018, 10:42) По... Jun 26 2018, 07:49      iliusmaster Цитата(AlexandrY @ Jun 26 2018, 10:42) А ... Jun 28 2018, 15:55       AlexandrY Цитата(iliusmaster @ Jun 28 2018, 18:55) ... Jun 28 2018, 19:40        Herz Цитата(AlexandrY @ Jun 28 2018, 22:40) Ну... Jun 28 2018, 19:49         AlexandrY Цитата(Herz @ Jun 28 2018, 22:49) Коллега... Jun 28 2018, 20:27          Forger Вот еще немного любопытной информации про электрич... Jun 28 2018, 20:28           AlexandrY Цитата(Forger @ Jun 28 2018, 23:28) Вот е... Jun 29 2018, 04:36            Forger Цитата(AlexandrY @ Jun 29 2018, 07:36) У ... Jun 29 2018, 05:08             AlexandrY Цитата(Forger @ Jun 29 2018, 08:08) И не ... Jun 29 2018, 05:39              Forger Цитата(AlexandrY @ Jun 29 2018, 08:39) Ищ... Jun 29 2018, 05:50               AlexandrY Цитата(Forger @ Jun 29 2018, 08:50) По-хо... Jun 29 2018, 06:40                Forger Цитата(AlexandrY @ Jun 29 2018, 09:40) От... Jun 29 2018, 06:51                 AlexandrY Цитата(Forger @ Jun 29 2018, 09:51) Пруфы... Jun 29 2018, 06:56                  Forger Цитата(AlexandrY)Также вам предлагаю помолчать отн... Jun 29 2018, 07:05          rx3apf Цитата(AlexandrY @ Jun 28 2018, 23:27) То... Jun 28 2018, 20:41           AlexandrY Цитата(rx3apf @ Jun 28 2018, 23:41) Все б... Jun 28 2018, 20:43          Herz Цитата(AlexandrY @ Jun 28 2018, 23:27) С ... Jun 28 2018, 23:13        rx3apf Цитата(AlexandrY @ Jun 28 2018, 22:40) (д... Jun 28 2018, 20:11    ArtemKAD Цитата(AlexandrY @ Jun 26 2018, 08:17) Чт... Jun 28 2018, 14:42 Herz Цитата(ArtemKAD @ Jun 24 2018, 10:23) Имп... Jun 24 2018, 09:50  Forger Цитата(Herz @ Jun 24 2018, 12:50) Греть р... Jun 24 2018, 10:03   Herz Цитата(Forger @ Jun 24 2018, 13:03) Напри... Jun 25 2018, 10:02    Forger Цитата(Herz @ Jun 25 2018, 13:02) А зачем... Jun 25 2018, 12:13     AlexandrY Цитата(Forger @ Jun 25 2018, 15:13) Вы ве... Jun 25 2018, 12:24      Forger Цитата(AlexandrY @ Jun 25 2018, 15:24) А ... Jun 25 2018, 12:32 iliusmaster У музыкантов нужно точно отслеживать длительность ... Jun 24 2018, 09:30 Forger Цитата(iliusmaster @ Jun 24 2018, 12:30) ... Jun 24 2018, 09:38 k155la3 Цитата(iliusmaster @ Jun 24 2018, 12:30) ... Jun 24 2018, 09:57 iliusmaster Ну раз музыканты это специфика, то вот еще один пр... Jun 24 2018, 11:11 Forger Цитата(iliusmaster @ Jun 24 2018, 14:11) ... Jun 24 2018, 11:21 k155la3 Цитата(iliusmaster @ Jun 24 2018, 14:11) ... Jun 24 2018, 13:07  Make_Pic Цитата(k155la3 @ Jun 24 2018, 17:07) Мой ... Jun 25 2018, 02:06   AlexandrY Цитата(Make_Pic @ Jun 25 2018, 05:06) Тем... Jun 25 2018, 08:49   k155la3 Цитата(Make_Pic @ Jun 25 2018, 05:06) Тем... Jun 25 2018, 09:09    AlexandrY Цитата(k155la3 @ Jun 25 2018, 12:09) Вот ... Jun 25 2018, 10:35   arhiv6 Цитата(Make_Pic @ Jun 25 2018, 09:06) Тем... Jun 27 2018, 05:34 k155la3 Цитата(Make_Pic @ Jun 23 2018, 08:17) . .... Jun 26 2018, 08:41 Jenya7 В последних проектах юзаем ADP5589. Изначально я б... Jun 26 2018, 14:35 Forger Цитата(Jenya7 @ Jun 26 2018, 17:35) В пос... Jun 26 2018, 15:24  haker_fox QUOTE (Forger @ Jun 26 2018, 23:24) Имхо,... Jun 27 2018, 02:32   Forger Цитата(haker_fox @ Jun 27 2018, 05:32) Ну... Jun 27 2018, 04:35  k155la3 Цитата(Forger @ Jun 26 2018, 18:24) Код в... Jun 27 2018, 06:36 AlexandrY Цитата(Jenya7 @ Jun 26 2018, 17:35) В пос... Jun 27 2018, 05:08 haker_fox QUOTE (Forger @ Jun 27 2018, 12:35) Спорн... Jun 27 2018, 07:22 rx3apf Напряжение, очевидно, нужно чтобы пробить пленку. ... Jun 28 2018, 15:59 Forger Цитата(iliusmaster)
Цитата(rx3apf)
Вот: https://el... Jun 28 2018, 16:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|