compile4fun

Flex/Java developer, Minsk

Домашняя страница: https://compile4fun.wordpress.com

Lenovo Yoga Pro 2 : Проблемы с Wi-Fi (Lenovo Yoga Pro 2 Wi-Fi Drops)

В общем, бесценный совет всем, у кого проблемы с wi-fi. Целый год я грешил на интел, так как есть соответствующие разделы на форуме интел и в поддержке леново, и проблема с драйверами была известна очень долго. В последнее время отключения сильно участились, невыносимо, wi-fi пропадал очень часто и помогала только перезагрузка.

И тут я стал замечать — не трогаю ноутбук — работает, поднимешь — wi-fi отвалился. Попробовал повторить — 100% повторяется, если потрясти за правый край, и меня осенило — что-то отходит! Выкрутил 11 болтов, снял крышку (на youtube есть видео, если возникнут вопросы), разъем от wi-fi антенны терся о металл кожуха wi-fi-карты, подвигал wi-fi-карту, проложил кусочек изоленты там где терлось, собрал, подтянул получше болты — все! НИ одного отключения уже несколько дней!

Плюс я заметил, что если не закрутить крышку — не работает тачпад и wi-fi, система не видит их, так что возможно, причина была и в том, что крышка плохо затянута (ставили винчестер при покупке).

Год боли и мучений! А все было просто!

П.С. отключите батарею перед этим.

wifi

Оставить комментарий

Статья о создании расширений на Хабре

Потратив 2 дня, добился создания рабочего расширения на PureBasic(кроссплатформенный язык). Статья лежит здесь http://habrahabr.ru/post/147089/.

Скачать код и рабочую версию можно здесь http://code.google.com/p/purebasic-extension-for-adobe-air/

, , ,

Оставить комментарий

6. Air extensions: завершающий этап

Сегодня весь код и расширения и тестового приложения был перенесен на Google Code: http://code.google.com/p/air-hid-usb/.



DemoHID Windows

DemoHID Windows



DemoHID Mac OS X

DemoHID Mac OS X

, , , ,

1 комментарий

5. Air extensions: работа с usb. Demo Mac OS X 10.6

Подправил билды, настроил XCode и теперь расширение работает и на маках. Посмотреть можно тут

, , , ,

Оставить комментарий

4. Air extensions: разработка с помощью MinGW

Настройка MS Visual Studio не самое интересное занятие, кроме нее может понадобиться установка Windows Driver Kit (WDK). Настройка проектов, солюшенов, автоматических билдов достаточно сложное занятие. Поэтому посмотрев на HIDAPI, я решил тоже использовать  MinGW (что такое MinGW можно почитать тут).

Краткая инструкция по созданию расширений с помощью MinGW:

Building with MinGW

1. Setup MinGW: HOWTOforMinGW
2. Download MinGW Utils (mingw-util-0.3): mingw-utils
3. Create def-file using reimp from utils: reimp -d FlashRuntimeExtensions.lib
4. Rename generated def file(«Adobe Air» or similar) to FlashRuntimeExtensions.def
5. Create .a library from FlashRuntimeExtensions.lib(see Air SDK lib folder):
dlltool -d FlashRuntimeExtensions.def -l FlashRuntimeExtensions.a
6. Fix FlashRuntimeExtensions.h or #undef WIN32

#ifdef __MINGW32__
    #include <stdint.h>
#else
    #ifdef WIN32
          typedef unsigned __int32	uint32_t;
          typedef unsigned __int8		uint8_t;
          typedef          __int32	int32_t;
    #else
          #include <stdint.h>
    #endif
#endif

7. Now you can compile dll:
g++ -Wall -shared Extension.cpp -o Extension.dll -L. -lFlashRuntimeExtensions -static-libgcc -static-libstdc++
8. Read DevelopingActionScriptExtensionsForAdobeAIR.pdf

Example:

Extension.h:

//air3.0\include\
#include "FlashRuntimeExtensions.h"

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllexport) void initializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer);
__declspec(dllexport) void finalizer(void* extData);

#ifdef __cplusplus
}
#endif

Extension.cpp:

#include <malloc.h>
#include "Extension.h"
#ifdef __cplusplus
extern "C" {
#endif
    //will return Boolean true to AS3 side
    FREObject test(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
    {
        bool value = true;
        FREObject resultObject;
        FRENewObjectFromBool(value, &resultObject);
        return resultObject;
    }

    /*
    * usage:
    * var context:ExtensionContext = ExtensionContext.createExtensionContext("AnyContext", null);
    * var result:Boolean = context.call('test') as Boolean;
    */
    void contextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctions, const FRENamedFunction** functions)
    {
        *numFunctions = 1;

        FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * (*numFunctions));

        func[0].name = (const uint8_t*) "test";
        func[0].functionData = NULL;
        func[0].function = &test;

        *functions = func;
    }

    void contextFinalizer(FREContext ctx)
    {
        return;
    }

    void initializer(void** extData, FREContextInitializer* ctxInitializer, FREContextFinalizer* ctxFinalizer)
    {
        *ctxInitializer = &contextInitializer;
        *ctxFinalizer = &contextFinalizer;
    }

    //The runtime calls this function when it unloads an extension. However, the runtime does not guarantee that it will
    //unload the extension or call FREFinalizer().
    //it seems to be never called atleast on windows
    void finalizer(void* extData)
    {
        return;
    }
#ifdef __cplusplus
}
#endif

, , , , ,

Оставить комментарий

3. Air extensions: работа с usb. Demo.

Создал новый проект на гугле. Там уже можно скачать демо-версию приложения, способную отображать подключенные hid-девайсы и определять их подключение/отключение.

asdoc

, , , ,

Оставить комментарий

2. Air extensions: работа с usb. Preview!

HIDAPI + Air

Расширение-обертка для HIDAPI



Небольшой кусок кода, иллюстрирующий работу с расширением. (Есть возможность вызывать все(!) методы HIDAPI)

            var manager:IHIDManager = HIDFactory.createHIDManager();

            var deviceInfos:Array = manager.getDeviceList(0x8001, 0xA00F);//0x8001, 0xA00F
            log.info("getDeviceList: {0}", (deviceInfos ? deviceInfos.length : "error"));
            if (deviceInfos)
            {
                devices.dataProvider = new ArrayCollection(deviceInfos);
                var wmouse:HidDeviceInfo;
                for each (var hidDeviceInfo:HidDeviceInfo in deviceInfos)
                {
                    if (hidDeviceInfo.interface_number == 1)
                    {
                        wmouse = hidDeviceInfo;
                        break;
                    }
                }
                if (wmouse)
                {
                    log.info("getDeviceByPath {0}", wmouse);
                    var device:IHIDDevice = manager.getDeviceByPath(wmouse.path);
                    device.open();
                    if (device.isOpened)
                    {
                        log.info("getManufacturerString: {0}", device.getManufacturerString());
                        log.info("getProductString: {0}", device.getProductString());
                        log.info("getSerialNumberString: {0}", device.getSerialNumberString());
                        device.close();
                    }
                    device.dispose();
            }

, , , ,

Оставить комментарий

1. Air extensions: работа с usb.

Cобран тестовый проект, в котором уже работает вызов нативных методов.
Набор инструментов:

  • Intellij IDEA
  • MS Visual Studio
  • MinGW
  • Apache Ant.

Фреймворки и библиотеки:

  • HidApi
  • Robot Legs
  • Air 3.0.
  • Flex 4.5.

В скором времени проект появится на code.google.com.

, , , ,

Оставить комментарий

Ошибка «Channel disconnected»

Ошибка «Channel disconnected before an acknowledgement was received» может появлятся по разным причинам. Часть из них связана с php (например когда вместо AMF отдается текст), часть с ошибками сериализации. Для ее отлова полезно использовать либо firebug, либо charlesproxy.

В моем случае использовалась связка Tomcat+BlazeDS. Долго неудавалось повторить ошибку, но все же получилось, вот что оказалось в логах firebug:

Responce headers

Ответ полученный клиентом

Как видно из скриншота, прокси сервер разорвал соединение, клиент получил 0 байт ответа и отвалился с этой загадочной ошибкой. Судя по хидерам X-Cache, используется цепочка прокси, буду благодарен за любую информацию по этой проблеме.

, , , , , , ,

Оставить комментарий

Наступаем на грабли IDropInListItemRenderer

Иногда бывает необходимость получить доступ из рендерера к листу, в котором этот рендерер находится. Для этого необходимо заиплементить интерфейс IDropInListItemRenderer и затем взять поле owner у полученной на руки BaseListData. Это все будет прекрасно работать до тех пор, пока лист не окажется пустым:

        if (item is IDropInListItemRenderer)
        {
            if (data != null)
                IDropInListItemRenderer(item).listData = makeListData(data, itemToUID(wrappedData), 0);
            else
                IDropInListItemRenderer(item).listData = null;
        }

Поэтому использовать интерфейс IDropInListItemRenderer необходимо с осторожностью, либо передавать ссылку на лист через конструктор.

, ,

Оставить комментарий