Jump to content

Pašdarināts Ambilight paveids


Bruketajs
 Share

Recommended Posts

AndrisBB

Pašreizējais firmwares kods te, vēlāk jāuzliet uz Githuba https://paste.ofcode.org/5LX723nV4X7fYuCfZfSyxG

Spoiler

#include "stm32f4xx_hal.h"
#include "stdio.h"
#include "b64.h"

#define RX_BUFFER_SIZE 193

extern UART_HandleTypeDef huart3;
volatile uint8_t rx_completed;
volatile uint8_t rx_error;

int __io_putchar(int ch)
{
	HAL_UART_Transmit(&huart3, &ch, 1, HAL_MAX_DELAY);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  	/* Set transmission flag: transfer complete*/
  	rx_completed = 1;
}

void process_rx_data(uint8_t *buf)
{
	if(buf[0] != '=')
	{
		rx_error = 1;
		return;
	}

	buf[RX_BUFFER_SIZE] = '\0';
	uint8_t *decoded = b64_decode((buf + 1), RX_BUFFER_SIZE);

	for(int i = 0; i < RX_BUFFER_SIZE; i++)
	{
		printf("%d, ", decoded[i]);
	}
	printf("\n");

	free(decoded);
	HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
	return;
}

void ambilight_start()
{
	uint8_t dma_rx_buffer[2][RX_BUFFER_SIZE + 1];
	uint8_t rx_buffer_index = 0;

	rx_completed = 0;
	rx_error = 0;

	if(HAL_UART_Receive_DMA(&huart3, dma_rx_buffer[rx_buffer_index], RX_BUFFER_SIZE) != HAL_OK)
	{
		Error_Handler();
	}

	while(1)
	{
		if(rx_completed == 1)
		{
			rx_buffer_index = 1 - rx_buffer_index; 
			rx_completed = 0;
			
			if(HAL_UART_Receive_DMA(&huart3, dma_rx_buffer[rx_buffer_index], RX_BUFFER_SIZE) != HAL_OK)
			{
				Error_Handler();
			}
			
			process_rx_data(dma_rx_buffer[1 - rx_buffer_index]);
		}
		else if(rx_error == 1)
		{
			rx_error = 0;
			rx_completed = 0;
			
			HAL_UART_DMAStop(&huart3);
			if(HAL_UART_Receive_DMA(&huart3, dma_rx_buffer[rx_buffer_index], RX_BUFFER_SIZE) != HAL_OK)
			{
				Error_Handler();
			}
		}
	}
}

 

Labots - AndrisBB
Link to comment
Share on other sites

Bruketajs

Daile.

Es gan sajutos kā mazizglītots sisadmins, kas tikai spēj nokopēt un pielabot gatavu kodu... ;)

Link to comment
Share on other sites

Kodu gan nepētīju, bet neesmu sapratis, kāpēc vajag to base64…

Link to comment
Share on other sites

AndrisBB

Nākamais solis tagad ir encodēt rgb datus bitos, ko nosūtīt caur WS2812 ledu virteni. Tur ideja arī ir diezgan vienkārša, priekš katra leda seriāli jānosūta 24 biti (3 x 8).

926765789_125.jpg 

 

Viena bita ilgums ir 1.25us, tātad lai nosūtītu 1 ir jāsuta signāls 0.85us HIGH un 0.4us LOW, nullei pretēji. Reset kods ir 50us, kas ir 40biti ar nulles vērtību.

Lai to izdarītu vienkāršākais variants būtu slēdzelēt GPIO pinu un izmantot kautkādu delay vai taimeri, kā to dara lielākā daļa Arduino bibliotēkas (amatieru variants), bet tas tāds ķēpīgs variants, jo nomainot processorā ātrumu izmainītos delay ilgumi, kā arī processors būtu atkal aizņemts pat to laiku un nevarētu saņemt jaunos datus no PC.

Šeit labāk ir izmantot PWM signālu plus DMA. Vienkāršā variantā PWM signālam ir frequence un duty cycle, pemēram 50hz ar 50% duty cycle nozīmēs ka viena cikla ilgums būs 20ms un signāls 10ms būs HIGH, pēctam 10ms LOW. Uz STM mikrokontrolieriem ir iespējams duty cycle mainīt dinamiski, pec katra cikla HIGH signāla ilgums tiek izmainīts. Te var palasīties detatizētāk  http://www.st.com/content/ccc/resource/technical/document/application_note/7e/17/df/9e/5d/04/4b/72/DM00119042.pdf/files/DM00119042.pdf/jcr:content/translations/en.DM00119042.pdf

 

Tātad man vajag 800khz PWM signālu (1.25us viens bits) un masīvu ar duty cycle vērtībām ko izmainīt pēc katra cikla. Tad sākt PWM timeri un aizsūtīt bitus uz diožu virteni.

Kodu te kopēt negribas, bet ielikšu printscreenus no MX Cube. Timera frequence man būs tāda pati kā MCU - 180mz (prescaler 1), frequenci nosaka Timer Counter kas ir 56 cikli (sanāk 800khz)

DMA tiek kopēts no memory uz timeri

 

 

 

 

 

Screenshot from 2017-08-28 13-50-24.png

Screenshot from 2017-08-28 13-50-06.png

Screenshot from 2017-08-28 13-50-34.png


Pirms 9 minūtēm , binary teica:

 

Kodu gan nepētīju, bet neesmu sapratis, kāpēc vajag to base64…

 

Manuprāt uz doto mirkli tas ir labs risinājums, jo ja vajag manuāli caur terminālu testēšanai aizsūtīt datus, tad es to varu vienkārši nosūtīt teksta formā. Nekādu lielo verhead tas nepieliek, plus var noteikt kur ir paketes sākums, kur beigas, izmantojot speciālus simbolus, binary datu gadījumā tas nav iespējams, jo visas vērtības tiek izmantotas kā dati. 

Link to comment
Share on other sites

AndrisBB

Nu jau mazliet tuvāk Grand Finale :)

 

Ar Logic Analyzeru izskatās ka vaweforms ir OK, tagad tik jāsavieno ledus un jāizmēģina. Tākā man MCU ir 3.3v tad nāksies izmantot logic shifteri uz 5V un cerams ka man pietiks ampēru vai arī nenokūpēs baroklis.

Pašreizējais kods un screenšots no logic analyzera https://paste.ofcode.org/32GtiJV9VbMWThqGtkqUKPx

 

Screenshot from 2017-08-28 17-23-38.png

Link to comment
Share on other sites

Bruketajs
Pirms 42 minūtēm , AndrisBB teica:

Tākā man MCU ir 3.3v tad nāksies izmantot logic shifteri uz 5V

Tas ir atkarīgs no ledu modeļa, manuprāt tur bija plašas variācijas pieļaujamas, bet varu kļūdīties... 

 

Pirms 43 minūtēm , AndrisBB teica:

cerams ka man pietiks ampēru vai arī nenokūpēs baroklis.

Reālajā dzīvē nezkapēc amperāža ir mazāka, kā liktos. Man visu to pasākumu, ieskaitot Odroid C2, Arduino micro un ledu virteni pavelk 5V/5A 3Com switcha baroklis un nekāda sprieguma sešanās nebija novērota.


Bet nu kudos par veiksmīgu lēmumu pašam saprast un ieviest dzīvē pa savam, nekopējot jau gatavu.

Link to comment
Share on other sites

AndrisBB

Kautkas beigās sanāca, kārtīga ziemassvētku eglīte :D

Vajag labāku krāsu aprēķināšanas algoritmu, jo paņemot vidējo no histogramas viss sanāk pelēks vai vienkrāsains. Varbūt ar mazākiem un vairāk lediem būtu labāk.

 

Kopumā aizņēma apmēram studnu vakar un šodien kādas 3 stundas. Praktiskais pielietojums faktiski nekāds, bet toties sanāca paspēlēties ar DMA, ko gribēju jau sen.

 

 

 

Link to comment
Share on other sites

AndrisBB

Jā, diezgan daudz laika aizņem screenshoti un tad es izmantoju parastu crop funkciju, lai sagrieztu to bildi, iespējams pati naivākā metode kā to darīt :D. Paiet kads laiciņš kamēr kompis to apstrādā.

Bet kods uz mikrokontroliera ir OK. Pats MCU iet uz 180Mhz, kaukāds, salīdzinot ar standarta Arduino 12Mhz.

Vairāk droši vien arī neko nedarīšu, jo nebij jau mērķis uztaisīt kautko lietderīgu.

Link to comment
Share on other sites

Bruketajs
pirms 2 stundām , AndrisBB teica:

Vairāk droši vien arī neko nedarīšu, jo nebij jau mērķis uztaisīt kautko lietderīgu.

A vot plinti krūmos mest nav ok!

Kāda sistēma ir uz pc? 

Varbūt tomēr iziet pa vidu tam visam - izmantot Hyperion un savu kontrolleri tikai datu nodošanai lediem? 

 

Link to comment
Share on other sites

AndrisBB
1 stundu atpakaļ, Bruketajs teica:

A vot plinti krūmos mest nav ok!

Ir citas svarīgākas lietas pie kā strādāt.

Link to comment
Share on other sites

Inspektors Caps
1 stundu atpakaļ, Bruketajs teica:

A vot plinti krūmos mest nav ok!

Tas tā būtu tad, ja mērķis būtu bijis uztaisīt lietderīgu produktu. Ja mērķis bija apgūt tehniku, tad mērķis ir izpildīts un tālākais būtu nelietderīga bakstīšanās.

 

pirms 23 stundām , Bruketajs teica:

Es gan sajutos kā mazizglītots sisadmins, kas tikai spēj nokopēt un pielabot gatavu kodu... ;)

Ne par Tevi bet vispār... Tā arī ir Latvijas problēma, ka neviens neko vairāk par kopīpastu nedara un pat nemēģina apgūt un izprast lietas. Apmēram tāds: "Nopietnās lietas rada mistiski pārcilvēki kaut kur ārzemēs, tādēļ ko nu te mēs..." Principā tieši tā ir plints mešana krūmos, pie tam tā ir epidēmijas mērogā. Ir daži izņēmumi kā MikroTik, bet tie diemžēl ir tikai reti izņēmumi. Tagad iespējas ir milzīgas, var sākt ar dažu desmitu EUR budžetu, bet tipiskie latvieši ir par slinku, lai kustinātu smadzenes. Piemēram, NUCLEO-F767ZI plate. Tur par 22 EUR ir pilnvērtīgs flašeris/debugeris, USB OTG, pilnvērtīgs 10/100 Mbps Ethernet, 512KB RAM, 2MB flash un ARM Cortex-M7 216 MHz ar FPU un DSP instrukcijām, kas pēc skaitļošanas jaudas ir kā Pentium II 233 MHz. Custom savienojumu iespējas un kontaktu skaits milzīgs. Ar to var izstrādāt tādus brīnumus, ka maz neliekas, bet latvietis vidējais pat it kā "tehniskais", nedara neko.

Link to comment
Share on other sites

Pirms 13 minūtēm , Inspektors Caps teica:

Tas tā būtu tad, ja mērķis būtu bijis uztaisīt lietderīgu produktu.

gala produkts būtu lietderīgs

Link to comment
Share on other sites

Pirms 29 minūtēm , Inspektors Caps teica:

Tagad iespējas ir milzīgas, var sākt ar dažu desmitu EUR budžetu, bet tipiskie latvieši ir par slinku, lai kustinātu smadzenes

Kurā miljonāru sarakstā var tevi atrast? :biggrin:

Labots - jema
  • Patīk 2
Link to comment
Share on other sites

AndrisBB

Ko var cepties, tāds arī tas mērķis bija, padarboties ar DMA uz ST mikrokontroliera, jo pirmastam nebija sanākusi vajadzība. Tagad kad citā projektā tāda vajadzība uznāca, tad šis likās labs variants iesākumam ar ko paeksperimentēt, diožu virtene man krājumos jau bij sen. Nekādas īpašās intereses tanī Ambilight man nav un iedziļināties attēlu apstrādes algoritmos ar negribas, tapēc arī neturpināšu, jo kā jau Caps teica, varbūt ja tas nebūtu gluži izniekots laiks, tad īpašas jēgas arī nav.   

Tākā labākais veids kā kautko iemācīties ir mēģināt izskaidrot citiem, tad iepostēju te, kas zin varbūt kādam noderīgi, vai arī strādā pie kautkā līdzīgi un ir jautājumi.

Link to comment
Share on other sites

Inspektors Caps
pirms 19 stundām , jema teica:

Kurā miljonāru sarakstā var tevi atrast? :biggrin:

Laikā, kad katram otrajam kabatā ir telefons par 300 EUR, dators par vēl vairāk un gājiens uz kino diviem izmaksā vismaz 20 EUR, viena-divu kino gājienu naudas ieguldīšana savā attīstībā, ir miljonāru izprieca? Kādam tā būs profesija, kādam vērtīgs hobijs, bet cits ar to vienkārši iedvesmos citus, tai skaitā savus bērnus. Latvieši savu valsti it kā grib skaitīt pie attīstītām valstīm, bet mūsdienās nevar būt attīstīta valsts, ja tajā nav elektronikas (un attiecīgās programmatūras) inženieru un modernu ierīču ražošanas.

Link to comment
Share on other sites

Bruketajs
pirms 4 stundām , Inspektors Caps teica:

gājiens uz kino diviem izmaksā vismaz 20 EUR

Tāpēc es izvēlos skatīšanos mājās.

Un galvenais - paša uztaisīts sīkums sagādā lielāku  baudu un uz ilgāku laiku, kā nopirkts gadžets. 

  • Patīk 1
Link to comment
Share on other sites

  • 3 weeks later...

Atnāca ledi, mēģināju saslēgt.

Pirmā problēma - Sagriezu lenti un salodēju ar vadiņiem lai var smuki 90 grādos salocīt. Uzliku uz arduino kaut kādu programmu lai midzina diodes. Skuju - mirgo tikai līdz pirmajam savienojumam! Izzvanījos ar testeri - nē - īsā nav, viss salodēts! Pabakstot sāk strādāt. Strādā, pēc laika nestrādā..... Pārlodēju savienojums -nekā, tas pats! Ta iet, ta nē.....  Un man ir divi savienojumi - izdomāju ka ekrāna apakšā ledus nelikšu.....  :( 

https://hyperion-project.org/wiki/Installation-on-all-systems - pēc šis pamācības uzliku hyperion uz savējā KII pro ar libreelec

 

https://ai.rs/reviews/rgb-delight-raspberry-pi2-arduino-nano-ws2812b-using-hyperion-on-openelec/ - no šejienes skeču paņēmu.... nefiga nestrādā.... :( 

 

 

Link to comment
Share on other sites

Pamēģini 5V pievadīt katram posmam atsevišķi. Arī timinga ziņā tie ledi ir diezgan cimperlīgi, teorētiski tiem vadiņiem nekādai jūtamai ietekmei uz signālu nevajadzētu būt, bet kas to lai zin.

No tava apraksta vairāk izklausās pēc sūdīga salodējuma. 

Link to comment
Share on other sites

Vakar kaut kā beigās palaidu. 

@Bruketajs., tevis dotajā skečā ir kļūdas - nekompilējas. Ar šādu aizgāja:

Spoiler

#include "FastLED.h"
 
// How many leds in your strip?
#define NUM_LEDS 141
 
// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 6
#define CLOCK_PIN 13
 
#define COLOR_ORDER RGB
 
// Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data
uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;
 
// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 460800
 
// Define the array of leds
CRGB leds[NUM_LEDS];
 
void setup() {
      // Uncomment/edit one of the following lines for your leds arrangement.
      // FastLED.addLeds<TM1803, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<TM1804, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<TM1809, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
         FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
      // FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
      // FastLED.addLeds<UCS1903, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<UCS1903B, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<GW6205, DATA_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<GW6205_400, DATA_PIN, RGB>(leds, NUM_LEDS);
     
      // FastLED.addLeds<WS2801, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<SM16716, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<LPD8806, RGB>(leds, NUM_LEDS);
 
      // FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<SM16716, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
      // FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
     
        // initial RGB flash
        LEDS.showColor(CRGB(255, 0, 0));
        delay(500);
        LEDS.showColor(CRGB(0, 255, 0));
        delay(500);
        LEDS.showColor(CRGB(0, 0, 255));
        delay(500);
        LEDS.showColor(CRGB(0, 0, 0));
       
        Serial.begin(serialRate);
        Serial.print("Ada\n"); // Send "Magic Word" string to host
 
}
 
void loop() {
  // wait for first byte of Magic Word
  for(i = 0; i < sizeof prefix; ++i) {
    waitLoop: while (!Serial.available()) ;;
    // Check next byte in Magic Word
    if(prefix == Serial.read()) continue;
    // otherwise, start over
    i = 0;
    goto waitLoop;
  }
 
  // Hi, Lo, Checksum
 
  while (!Serial.available()) ;;
  hi=Serial.read();
  while (!Serial.available()) ;;
  lo=Serial.read();
  while (!Serial.available()) ;;
  chk=Serial.read();
 
  // if checksum does not match go back to wait
  if (chk != (hi ^ lo ^ 0x55))
  {
    i=0;
    goto waitLoop;
  }
 
  memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
  // read the transmission data and set LED values
  for (uint8_t i = 0; i < NUM_LEDS; i++) {
    byte r, g, b;    
    while(!Serial.available());
    r = Serial.read();
    while(!Serial.available());
    g = Serial.read();
    while(!Serial.available());
    b = Serial.read();
    leds.r = r;
    leds.g = g;
    leds.b = b;
  }
  // shows new values
 FastLED.show();
}  

 

 

Vēl vajadzēja amlgrabber hyperiona konfigā ieslēgt ar roku labojot konfiga failu. Bez tā ledi reaģēja tikai uz interfeisa elementiem. ne video. 

Mokos ar lodējuma vietām. Vienu noziedu ar kuksni un ar lodēšanas stacijas fēnu uzsildīju. Sāka strādāt. Pielīmēju ledus pie tv. Pēc laika otra savienojuma vieta atteica un ledi no tv atlīmējās... :( Nu nedomāju ka tīri lodēt nemāku.... Moš esmu pārkarsējis kontaktus un tāpēc problēma. Lodāmurs bija uz 240 grādi uzlikts. Vajadzēja led lenšu savienojumus paņemt - maksā kapeikas , atkristu čakars ar lodēšanu.

Vēl 2x video apstājās. Palīdzēja tikai kastes pārstartēšana. Aizdomas ka ar aml graberi kaut kādi gļuki. Man kodi kaste uz s905. 

Vakar visu dienu nočakarējos, vēlamā rezultāta pagaidām nav....

Link to comment
Share on other sites

pirms 1 stundas , Ronalds teica:

for(i = 0; i < sizeof prefix; ++i) {
    waitLoop: while (!Serial.available()) ;;
    // Check next byte in Magic Word
    if(prefix == Serial.read()) continue;
    // otherwise, start over
    i = 0;
    goto waitLoop;
  }
 
  // Hi, Lo, Checksum
 
  while (!Serial.available()) ;;
  hi=Serial.read();
  while (!Serial.available()) ;;
  lo=Serial.read();
  while (!Serial.available()) ;;
  chk=Serial.read();
 
  // if checksum does not match go back to wait
  if (chk != (hi ^ lo ^ 0x55))
  {
    i=0;
    goto waitLoop;
  }

 

Kā var tik briesmīgu kodu izdomāt :D

Link to comment
Share on other sites

@AndrisBB, nē nu skaidrs ka ar pārtraukumiem ir labāk, bet nu ja strādā.... ;) 

 

Pārfēnoju arī otro savienojumu. Pielīmēju ledus ar abpus lipīgu skoču. Strādā! Izskatās vareni! Man pašam patīk. Man ledi tik pa tv malām un augšu - pa apakšu izdomāju ka nevajag. Bez tam manējam tv aizmugurē maliņa ~45 grādi lenķī pret ekrānu - kā paredzēta priekš led lentes līmēšanas. ;) 

 

Tā arī nesapratu, kāpēc ar lodāmuru nesanāca pielodēt. Laikam jau nav tās lentes paredzētas lodēt..... Pērkam savienojumus! 


P.s Video nebūs - ar viņiem pilns youtubs - manējais rezultāts ne ar ko būtiski neatšķiras. :) 

Link to comment
Share on other sites

1 stundu atpakaļ, Ronalds teica:

ir! Bet pa tādu cenu vismaz man nevajag! 

Neticu, ka ķīnieši nav kādu lētu alternatīvu izdomājuši, jāpameklē. ;)

Pirms 23 minūtēm , Ronalds teica:

P.s Video nebūs - ar viņiem pilns youtubs - manējais rezultāts ne ar ko būtiski neatšķiras. :)

Parādi gan!

Link to comment
Share on other sites

Takš tāpat, kā 100 un vienā youtubes video. Tik vecs pc baroklis un viņa vadu kaudze redzama - tas būs kaut kad jāsakārto - liekie vadi jāamputē. 

Link to comment
Share on other sites

pirms 10 stundām , AndrisBB teica:

Kā var tik briesmīgu kodu izdomāt :D

Bet strādā un ar visiem pārdesmit kadriem sekundē un bez necilvēciskas aiztures... ;)

 

pirms 12 stundām , Ronalds teica:

@Bruketajs., tevis dotajā skečā ir kļūdas - nekompilējas. Ar šādu aizgāja:

Figzin, moš ielīmēju ne to, lai gan šķita ka pareizo - ar Arduino esmu vēl noobs... :D Nav tik daudz laika lai apgūtu 100%

 

pirms 12 stundām , Ronalds teica:

Vēl vajadzēja amlgrabber hyperiona konfigā ieslēgt ar roku labojot konfiga failu. Bez tā ledi reaģēja tikai uz interfeisa elementiem. ne video. 

Jā, tas hyperconf uztaisa pareizi tikai ledu tabulas un pārējais jāpielabo ar roku.

 

pirms 12 stundām , Ronalds teica:

Vēl 2x video apstājās. Palīdzēja tikai kastes pārstartēšana. Aizdomas ka ar aml graberi kaut kādi gļuki. Man kodi kaste uz s905. 

Man arī - Odroid C2 - tiktāl gļuks ir ar >FullHD videoklipiem, bat tas neesot labojams.

Vēl dažreiz "aizbrauc skaņa" un pēc mirkļa attēls iepauzē un "pārlec" - bufera kļūmes, ko varētu labot ar pareizajiem iestatījumiem, bet rokas neaizsniedzas vakarā vēl debugot. 

Patreiz sēžu uz svaigākā Libreelec. 

 

Link to comment
Share on other sites

Inspektors Caps
2017.09.18. , 11:45, Ronalds teica:

nē nu skaidrs ka ar pārtraukumiem ir labāk, bet nu ja strādā.... ;)

Tur nav runa par to, bet par šo:

// Stulbs kods
for(i = 0; i < sizeof prefix; ++i) {
    waitLoop: while (!Serial.available()) ;;
    // Check next byte in Magic Word
    if(prefix == Serial.read()) continue;
    // otherwise, start over
    i = 0;
    goto waitLoop;
  }

// Normals kods
i = 0;
do {
	while (!Serial.available());
	if (prefix[i] == Serial.read()) {
		i++;
	} else {
		i = 0;
	}
} while (i < sizeof(prefix));

Normālais kods dara tieši to pašu, tikai ir daudz vieglāk saprotams, kas tipiski nozīmē vieglāku potenciālo papildināšanu un lielāku drošību pret kļūdu pielaišanu. Lieki piebilst, ka nekādi goto tajā konstrukcijā nav vajadzīgi, un arī ne continue. Lai gan otrais tomēr nedara tieši to pašu, jo oriģinālā koda IF nosacījumā ir kļūda - masīvam prefix nav indeksa un tas kods nevar strādāt korekti.

Link to comment
Share on other sites

Arī fakts, bet ne visi šeit ir ar pieredzi šajā tēmā - ja godīgi, ja man būtu pieredze ar Arduino, es tāfdas lietas uztaisītu sev mājās ka vai bail.

Nu un lielākā problēma nav vis Arduino kodā, bet gan "kadru grābējā" - tas uz Amlogic izsauc dīvainas blaknes, kas mani nedaudz skumdina. Uz vecā AMD E350 tādu nav, bet tas atkal nesajēdz atskaņot H265... Visa dzīve ir vieni ērkšķi, ceļā uz zvaigznēm.

Viva la piektdiena!

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...